泛化調用與特化調用
本文詳細介紹了阿里云SDK的泛化調用與特化調用的區別,通過集成后代碼包大小、開發體驗等方面為您闡述了泛化調用和特化調用的優缺點,為您提供了詳盡的技術分析,幫助您做出更合適的技術選擇,并通過示例代碼加速您的項目開發流程。
泛化調用
指以一種通用的方式調用服務。阿里云SDK的泛化調用是指通過使用阿里云SDK的核心模塊,構造入參對象,調用通用的函數發起請求,以通用對象的方式獲取返回結果。
特化調用
是一種基于具體接口和服務定義的調用方式調用服務。阿里云SDK的特化調用是完全依賴OpenAPI元信息構造對應的請求Client、入參對象、出參對象,開發者可以根據IDE的提示輕松填寫必要參數及獲取返回結果。
如何選擇
泛化調用
優點:集成后代碼包體積小,適配產品范圍大,無論使用多少產品,僅需幾個核心依賴包。
缺點:開發過程中需要文檔指導,沒有 IDE 提示,開發體驗會差一些。
特化調用
優點:開發體驗良好,IDE 可以提供參數名,方法名,類型等。
缺點:
如果產品沒有發布對應的阿里云SDK,則無法使用
如果使用的產品較多,需要安裝較多的 SDK 包,代碼體積會偏大一點。
V1.0版本SDK的JavaScript語言,只支持泛化調用,而不支持特化調用。
示例代碼
我們以V2.0版本的SDK為例,介紹泛化調用和特化調用在代碼寫法上的差異。
泛化調用
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>tea-openapi</artifactId>
<version>0.2.8</version>
</dependency>
package com.aliyun.sample;
import com.aliyun.tea.*;
public class Sample {
/**
* 使用AK&SK初始化賬號Client
* @param accessKeyId
* @param accessKeySecret
* @return Client
* @throws Exception
*/
public static com.aliyun.teaopenapi.Client createClient(String accessKeyId, String accessKeySecret) throws Exception {
com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config()
// 必填,您的 AccessKey ID
.setAccessKeyId(accessKeyId)
// 必填,您的 AccessKey Secret
.setAccessKeySecret(accessKeySecret);
// Endpoint 請參考 https://api.aliyun.com/product/Ecs
config.endpoint = "ecs-cn-hangzhou.aliyuncs.com";
return new com.aliyun.teaopenapi.Client(config);
}
/**
* API 相關
* @return OpenApi.Params
*/
public static com.aliyun.teaopenapi.models.Params createApiInfo() throws Exception {
com.aliyun.teaopenapi.models.Params params = new com.aliyun.teaopenapi.models.Params()
// 接口名稱
.setAction("DescribeInstanceStatus")
// 接口版本
.setVersion("2014-05-26")
// 接口協議
.setProtocol("HTTPS")
// 接口 HTTP 方法
.setMethod("POST")
.setAuthType("AK")
.setStyle("RPC")
// 接口 PATH
.setPathname("/")
// 接口請求體內容格式
.setReqBodyType("json")
// 接口響應體內容格式
.setBodyType("json");
return params;
}
public static void main(String[] args_) throws Exception {
java.util.List<String> args = java.util.Arrays.asList(args_);
// 請確保代碼運行環境設置了環境變量 ALIBABA_CLOUD_ACCESS_KEY_ID 和 ALIBABA_CLOUD_ACCESS_KEY_SECRET。
// 工程代碼泄露可能會導致 AccessKey 泄露,并威脅賬號下所有資源的安全性。以下代碼示例使用環境變量獲取 AccessKey 的方式進行調用,僅供參考,建議使用更安全的 STS 方式。更多鑒權訪問方式,請參見V2.0 Java SDK身份驗證章節。
com.aliyun.teaopenapi.Client client = Sample.createClient(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"), System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
com.aliyun.teaopenapi.models.Params params = Sample.createApiInfo();
// query params
java.util.Map<String, Object> queries = new java.util.HashMap<>();
queries.put("RegionId", "cn-hangzhou");
// runtime options
com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();
com.aliyun.teaopenapi.models.OpenApiRequest request = new com.aliyun.teaopenapi.models.OpenApiRequest()
.setQuery(com.aliyun.openapiutil.Client.query(queries));
// 復制代碼運行請自行打印 API 的返回值
// 返回值為 Map 類型,可從 Map 中獲得三類數據:響應體 body、響應頭 headers、HTTP 返回的狀態碼 statusCode。
client.callApi(params, request, runtime);
}
}
通過com.aliyun.teaopenapi
創建通用的Client
、Params
、OpenApiRequest
對象,通過調用callApi
函數返回OpenApiResponse
。在OpenAPI門戶開放的OpenAPI均可采用該方式進行調用。
特化調用
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>ecs20140526</artifactId>
<version>5.1.8</version>
</dependency>
package com.aliyun.sample;
import com.aliyun.tea.*;
public class Sample {
/**
* 使用AK&SK初始化賬號Client
* @param accessKeyId
* @param accessKeySecret
* @return Client
* @throws Exception
*/
public static com.aliyun.ecs20140526.Client createClient(String accessKeyId, String accessKeySecret) throws Exception {
com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config()
// 必填,您的 AccessKey ID
.setAccessKeyId(accessKeyId)
// 必填,您的 AccessKey Secret
.setAccessKeySecret(accessKeySecret);
// Endpoint 請參考 https://api.aliyun.com/product/Ecs
config.endpoint = "ecs-cn-hangzhou.aliyuncs.com";
return new com.aliyun.ecs20140526.Client(config);
}
public static void main(String[] args_) throws Exception {
java.util.List<String> args = java.util.Arrays.asList(args_);
// 請確保代碼運行環境設置了環境變量 ALIBABA_CLOUD_ACCESS_KEY_ID 和 ALIBABA_CLOUD_ACCESS_KEY_SECRET。
// 工程代碼泄露可能會導致 AccessKey 泄露,并威脅賬號下所有資源的安全性。以下代碼示例使用環境變量獲取 AccessKey 的方式進行調用,僅供參考,建議使用更安全的 STS 方式。更多鑒權訪問方式,請參見V2.0 Java SDK身份驗證章節。
com.aliyun.ecs20140526.Client client = Sample.createClient(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"), System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
com.aliyun.ecs20140526.models.DescribeInstanceStatusRequest describeInstanceStatusRequest = new com.aliyun.ecs20140526.models.DescribeInstanceStatusRequest()
.setRegionId("cn-hangzhou");
com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();
try {
// 復制代碼運行請自行打印 API 的返回值
client.describeInstanceStatusWithOptions(describeInstanceStatusRequest, runtime);
} catch (TeaException error) {
// 如有需要,請打印 error
com.aliyun.teautil.Common.assertAsString(error.message);
} catch (Exception _error) {
TeaException error = new TeaException(_error.getMessage(), _error);
// 如有需要,請打印 error
com.aliyun.teautil.Common.assertAsString(error.message);
}
}
}
每個OpenAPI根據接口定義自動生成客戶端對象com.aliyun.ecs20140526.Client
及調用函數describeInstanceStatusWithOptions
、入參對象com.aliyun.ecs20140526.models.DescribeInstanceStatusRequest
、出參對象com.aliyun.ecs20140526.models.DescribeInstanceStatusResponse
。