泛化调用
阿里云V1.0 SDK支持一种通用的方式调用OpenAPI,此方式被称为泛化调用。本文将为您详细介绍如何使用泛化调用访问OpenAPI。
特点
轻量级:仅需安装
aliyun-java-sdk-core
即可调用所有OpenAPI,无需依赖各产品的独立SDK。快速迭代兼容性:当云产品尚未提供相应的SDK,或当新API发布但SDK未能及时更新时,可以使用泛化调用。这样,无需等待SDK的更新,即可及时调用最新发布的API接口。
更多介绍,请参见泛化调用与特化调用。
使用说明
在使用泛化调用之前,必须手动获取并配置OpenAPI的版本号、请求路径、参数类型等元数据信息。可以通过查看OpenAPI元数据来获取有关OpenAPI的API风格、请求参数、资源路径等相关信息。
安装核心SDK
在pom.xml中添加以下依赖安装核心SDK。
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
// 可选择版本
<version>[(4.0.0,5.0.0)]</version>
</dependency>
调用OpenAPI
初始化请求客户端
通过在com.aliyuncs
包中创建client
对象以初始化请求客户端,并通过该Client
发起OpenAPI
调用。此处仅列举使用AccessKey(简称:AK)
初始化客户端的方式,更多初始化方式请参见管理访问凭据。
为了避免凭据泄露,常见的方案是将其写入到环境变量中,具体操作请参见在Linux、macOS和Windows系统配置环境变量。
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.profile.DefaultProfile;
// 创建DefaultAcsClient实例并初始化
DefaultProfile profile = DefaultProfile.getProfile(
// 您的地域ID
"cn-hangzhou",
// 从环境变量获取RAM账号的AccessKey ID
System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"),
// 从环境变量获取RAM账号的AccessKey ID
System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
IAcsClient client = new DefaultAcsClient(profile);
配置OpenAPI信息
通过com.aliyuncs
包中的request
模块来配置OpenAPI
所需的基本信息及请求参数。
request
的核心作用是通过标准化的请求配置流程,将原始API元数据(如版本号、路径、参数类型)和请求参数转化为有效的HTTP请求,最终返回原始响应数据。参数传递方式根据API风格和接口设计选择。
// 1.创建API请求并设置参数
CommonRequest request = new CommonRequest();
request.setSysMethod(com.aliyuncs.http.MethodType.POST);
request.setSysDomain("ecs.aliyuncs.com");// API的域名
request.setSysVersion("2014-05-26");// API版本号
// request 参数中包含SysAction参数的是RPC风格,而包含SysUriPattern参数的是ROA风格。
// 若传入错误的标识,可能会导致调用到其他API或收到ApiNotFound的错误信息。
request.setSysAction("DescribeInstanceStatus"); // API名称,当调用RPC风格API时,必须配置SysAction()指定接口名称
// request.setSysUriPattern(""); // API资源路径,当调用ROA风格API时,必须配置SysUriPattern()指定完整资源路径。
// 2.配置请求参数
// 方式一:设置查询参数(query)
request.putQueryParameter("InstanceChargeType", "PrePaid");
// 方式二:设置请求体(body)reqBodyType的值为json
// java.util.Map<String, Object> body = new java.util.HashMap<>();
// body.put("InstanceChargeType", "PrePaid");
// String bodyJson = (new GsonBuilder()).disableHtmlEscaping().create().toJson(body);
// request.setHttpContent(bodyJson.getBytes(StandardCharsets.UTF_8), "UTF-8", FormatType.JSON);
// 方式三:设置body参数,reqBodyType的值为byte
// java.util.Map<String, Object> body = new java.util.HashMap<>();
// body.put("InstanceChargeType", "PrePaid");
// String bodyJson = (new GsonBuilder()).disableHtmlEscaping().create().toJson(body);
// byte[] bodyByte = bodyJson.getBytes(StandardCharsets.UTF_8);
// request.setHttpContent(bodyByte, "UTF-8", FormatType.RAW);
// 方式四:设置body参数,reqBodyType的值为formData
// request.putBodyParameter("InstanceChargeType", "PrePaid");
// request.setHttpContentType(FormatType.FORM);
发起请求
通过client
调用getCommonResponse发起请求。
// 发起请求
CommonResponse response = client.getCommonResponse(request);
// 返回值response.getData()是JSON类型数据,包含RequestId以及OpenAPI的返回参数
System.out.println(response.getData());
代码示例
示例:调用RPC风格的API
以调用ECS的DescribeRegions
接口为例,展示如何使用CommonRequest
调用方式。
import com.aliyuncs.CommonRequest;
import com.aliyuncs.CommonResponse;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.exceptions.ServerException;
import com.aliyuncs.http.FormatType;
import com.aliyuncs.profile.DefaultProfile;
import com.google.gson.GsonBuilder;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
public class Sample {
public static void main(String[] args) throws ClientException, UnsupportedEncodingException {
// 创建DefaultAcsClient实例并初始化
DefaultProfile profile = DefaultProfile.getProfile(
// 您的地域ID
"cn-hangzhou",
// 从环境变量获取RAM账号的AccessKey ID
System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"),
// 从环境变量获取RAM账号的AccessKey ID
System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
IAcsClient client = new DefaultAcsClient(profile);
// 创建API请求并设置参数
CommonRequest request = new CommonRequest();
request.setSysMethod(com.aliyuncs.http.MethodType.POST); // 请求方式
request.setSysDomain("ecs.aliyuncs.com"); // API的域名
request.setSysVersion("2014-05-26"); // API版本号
request.setSysAction("DescribeRegions"); // API名称,当调用RPC风格API时,必须配置SysAction()指定接口名称
request.putQueryParameter("InstanceChargeType", "PrePaid"); // 请求参数
try {
CommonResponse response = client.getCommonResponse(request);
System.out.println(response.getData());
} catch (ServerException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClientException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
示例:调用RESTful(ROA)风格的API
以调用容器服务查询集群列表信息DescribeClustersV1
接口为例,展示如何使用CommonRequest
调用。
import com.aliyuncs.CommonRequest;
import com.aliyuncs.CommonResponse;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.exceptions.ServerException;
import com.aliyuncs.profile.DefaultProfile;
public class Sample {
public static void main(String[] args) {
// 创建DefaultAcsClient实例并初始化
DefaultProfile profile = DefaultProfile.getProfile(
// 您的地域ID
"cn-hangzhou",
// 从环境变量获取RAM账号的AccessKey ID
System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"),
// 从环境变量获取RAM账号的AccessKey ID
System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
IAcsClient client = new DefaultAcsClient(profile);
// 创建API请求并设置参数
CommonRequest request = new CommonRequest();
request.setSysDomain("cs.aliyuncs.com");// 域名
request.setSysVersion("2015-12-15");// API版本
request.setSysUriPattern("/clusters"); // API资源路径,当调用ROA风格API时,必须配置UriPattern()指定完整资源路径。从OpenAPI元数据中data.path获取资源路径。
request.setSysMethod(MethodType.GET);// 请求方式
try {
CommonResponse response = client.getCommonResponse(request);
System.out.println(response.getData());
} catch (ServerException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClientException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
- 本页导读 (1)
- 特点
- 使用说明
- 安装核心SDK
- 调用OpenAPI
- 初始化请求客户端
- 配置OpenAPI信息
- 发起请求
- 代码示例
- 示例:调用RPC风格的API
- 示例:调用RESTful(ROA)风格的API