全部產品
Search
文件中心

Alibaba Cloud SDK:泛化調用與特化調用

更新時間:Jul 01, 2024

本文詳細介紹了阿里雲SDK的泛化調用與特化調用的區別,通過整合後程式碼封裝大小、開發體驗等方面為您闡述了泛化調用和特化調用的優缺點,為您提供了詳盡的技術分析,協助您做出更合適的技術選擇,並通過範例程式碼加速您的專案開發流程。

泛化調用

指以一種通用的方式調用服務。阿里雲SDK的泛化調用是指通過使用阿里雲SDK的核心模組,構造入參對象,調用通用的函數發起請求,以通用對象的方式擷取返回結果。

特化調用

是一種基於具體介面和服務定義的調用方式調用服務。阿里雲SDK的特化調用是完全依賴OpenAPI元資訊構造對應的請求Client、入參對象、出參對象,開發人員可以根據IDE的提示輕鬆填寫必要參數及擷取返回結果。

如何選擇

泛化調用

優點:整合後程式碼封裝體積小,適配產品範圍大,無論使用多少產品,僅需幾個核心依賴包。

缺點:開發過程中需要文檔指導,沒有 IDE 提示,開發體驗會差一些。

特化調用

優點:開發體驗良好,IDE 可以提供參數名,方法名,類型等。

缺點:

  1. 如果產品沒有發布對應的阿里雲SDK,則無法使用

  2. 如果使用的產品較多,需要安裝較多的 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建立通用的ClientParamsOpenApiRequest對象,通過調用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