本文詳細介紹了阿里雲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
。