全部產品
Search
文件中心

Alibaba Cloud SDK:泛化調用

更新時間:Jun 17, 2025

阿里雲V1.0 SDK支援一種通用的方式調用OpenAPI,此方式被稱為泛化調用。本文將為您詳細介紹如何使用泛化調用訪問OpenAPI。

特點

  1. 輕量級:僅需安裝Core包即可調用所有OpenAPI,無需依賴各產品的獨立SDK。

  2. 快速迭代相容性:當雲產品尚未提供相應的SDK,或當新API發布但SDK未能及時更新時,可以使用泛化調用。這樣,無需等待SDK的更新,即可及時調用最新發行的API介面。

更多介紹,請參見泛化調用與特化調用

使用說明

在使用泛化調用之前,必須手動擷取並配置OpenAPI的版本號碼、請求路徑、參數類型等中繼資料資訊。可以通過查看OpenAPI中繼資料來擷取有關OpenAPI的API風格、請求參數、資源路徑等相關資訊。

安裝核心SDK

在Terminal中執行以下命令安裝核心SDK。

go get -u github.com/aliyun/alibaba-cloud-sdk-go/sdk

調用OpenAPI

初始化請求用戶端

通過在aliyunsdkcore包中建立client模組以初始化請求用戶端,並通過該Client發起OpenAPI調用。此處僅列舉使用AccessKey(簡稱:AK)初始化用戶端的方式,更多初始化方式請參見管理訪問憑據

說明

為了避免憑據泄露,常見的方案是將其寫入到環境變數中,具體操作請參見在Linux、macOS和Windows系統配置環境變數

import (
	"fmt"
	"os"
	"github.com/aliyun/alibaba-cloud-sdk-go/sdk"
)

// 使用 AccessKey 直接初始化。os.Getenv表示從環境變數中擷取存取金鑰
client, err := sdk.NewClientWithAccessKey("cn-hangzhou", os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"), os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"))
	if err != nil {
		panic(err)
	}

配置OpenAPI資訊及請求參數

通過CommonRequest來配置OpenAPI所需的公用請求參數及介面請求參數。關於更多公用請求參數的介紹及使用請參見進階配置

說明

CommonRequest的核心作用是通過標準化的請求配置流程,將原始API中繼資料(如版本號碼、路徑、參數類型)和請求參數轉化為有效HTTP請求,最終返回原始響應資料。參數傳遞方式根據API風格和介面設計選擇。

介面請求參數說明

請求參數應該如何傳參需要查看介面對應的OpenAPI中繼資料,例如DescribeInstanceStatus的請求參數RegionId在中繼資料中資訊為{"name":"RegionId","in":"query",...}},其中"in":"query"表示RegionId通過QueryParams["key"] = "value"傳遞。

描述

傳參方式

請求參數顯示"in":"query"時。

QueryParams["key"] = "value"

說明

如果請求參數的類型是集合,那麼參數應該按照QueryParams["key.1"] = "value1",

QueryParams["key.2"] = "value2",...格式傳參。

請求參數顯示"in":"body""in": "formData"時。

FormParams["key"] = "value"

說明

如果請求參數的類型不是字串類型,需要將參數值轉為JSON字串,並賦值給變數value。

        // 2.建立CommonRequest對象並配置OpenAPI基本資料和請求參數。
        request := requests.NewCommonRequest()
        // 2.1 配置OpenApi基本資料
	request.Domain = "ecs-cn-hangzhou.aliyuncs.com" // API服務地址
	request.Version = "2014-05-26" // API版本號碼
	request.ApiName = "DescribeInstanceStatus" // API名稱,當調用RPC風格API時,必須配置ApiName()指定介面名稱
	request.Method = "POST" // 請求方式。
	request.Scheme = "https" // 請求協議:HTTPS或HTTP,建議使用HTTPS。
	// request.PathPattern = "/"   // 資源路徑,ROA介面必傳。RPC介面禁止設定該參數。

        // 2.2 配置請求參數
	// 情境一:query參數通過QueryParams["key"] = "value"設定
	instanceIds := []string{
		"i-bp1axhql4dqXXXXXXXX",
		"i-bp124uve8zqXXXXXXXX",
	}
	request.QueryParams["RegionId"] = "cn-hangzhou"
	for i, id := range instanceIds {
	request.QueryParams[fmt.Sprintf("InstanceId.%d", i+1)] = id
	}

	// 情境二:body參數通過FormParams["key"] = "value"設定
	// request.FormParams["key1"] = "value1"
	// request.FormParams["key2"] = "value2"
	// request.FormParams["key3"] = "value3"

發起請求

通過client調用ProcessCommonRequest發起請求。

// 發起請求
response, err := client.ProcessCommonRequest(request)
	if err != nil {
		panic(err)
	}
	// 解析響應內容(JSON 格式),包含RequestId以及OpenAPI的返回參數。
	fmt.Print(response.GetHttpContentString())

程式碼範例

樣本:調用RPC風格的API

以調用ECS的DescribeRegions介面為例,展示如何使用泛化調用方式。

package main

import (
	"fmt"
	"os"
	"github.com/aliyun/alibaba-cloud-sdk-go/sdk"
	"github.com/aliyun/alibaba-cloud-sdk-go/sdk/requests"
)
func main() {
	client, err := sdk.NewClientWithAccessKey("cn-hangzhou", os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"), os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"))
	if err != nil {
		panic(err)
	}
	request := requests.NewCommonRequest()
	request.Domain = "ecs-cn-hangzhou.aliyuncs.com"
	request.Version = "2014-05-26"
	request.ApiName = "DescribeInstanceStatus"
	request.Method = "POST"
	request.Scheme = "HTTPS"

	instanceIds := []string{
		"i-bp1axhql4dqXXXXXXXX",
		"i-bp124uve8zqXXXXXXXX",
	}
	request.QueryParams["RegionId"] = "cn-hangzhou"
	for i, id := range instanceIds {
		request.QueryParams[fmt.Sprintf("InstanceId.%d", i+1)] = id
	}
	request.QueryParams["PageNumber"] = "1"
	request.QueryParams["PageSize"] = "30"
	response, err := client.ProcessCommonRequest(request)
	if err != nil {
		panic(err)
	}
	fmt.Print(response.GetHttpContentString())
}

樣本:調用RESTful(ROA)風格的API

以調用Container Service查詢叢集列表資訊DescribeClustersV1介面為例,展示如何使用泛化調用。

package main

import (
	"fmt"
	"os"

	"github.com/aliyun/alibaba-cloud-sdk-go/sdk"
	"github.com/aliyun/alibaba-cloud-sdk-go/sdk/requests"
)

func main() {
	client, err := sdk.NewClientWithAccessKey("cn-hangzhou", os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"), os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"))
	if err != nil {
		panic(err)
	}
	request := requests.NewCommonRequest()
	request.Domain = "cs.aliyuncs.com" // API服務地址
	request.Version = "2015-12-15" // API版本號碼
	// 因為是Restful介面,因此需指定PathPattern
	request.PathPattern = "/api/v1/clusters" // API資源路徑,當調用ROA風格API時,必須配置set_uri_pattern()指定完整資源路徑。從OpenAPI中繼資料中data.path擷取資源路徑。
	request.Method = "GET" // 請求方式
	request.Scheme = "https"  // 請求協議:HTTPS或HTTP,建議使用HTTPS。

	response, err := client.ProcessCommonRequest(request)
	if err != nil {
		panic(err)
	}
	fmt.Print(response.GetHttpContentString())
}

常見問題

報錯提示“SDK.ServerError MissingParameter The input parameter "AccessKeyId" that is mandatory for processing this request is not supplied.”。

問題原因:AK未正確配置。

解決方案:

  1. 執行以下命令,檢查您的環境變數中是否配置有ALIBABA_CLOUD_ACCESS_KEY_ID和ALIBABA_CLOUD_ACCESS_KEY_SECRET:

    Linux/macOS

    echo $ALIBABA_CLOUD_ACCESS_KEY_ID
    echo $ALIBABA_CLOUD_ACCESS_KEY_SECRET

    Windows

    echo %ALIBABA_CLOUD_ACCESS_KEY_ID%
    echo %ALIBABA_CLOUD_ACCESS_KEY_SECRET%

    若返回正確的AccessKey,則說明配置成功。如果返回為空白或錯誤,請嘗試重新設定,具體操作請參見在Linux、macOS和Windows系統配置環境變數

  2. 檢查代碼中AK相關內容是否存在錯誤。

    常見錯誤樣本:

    client, err := sdk.NewClientWithAccessKey("<RegionId>",
    		os.Getenv("yourAccessKeyID"),
    		os.Getenv("yourAccessKeySecret"))
    	if err != nil {
    		panic(err)
    	}
    說明

    此錯誤樣本將os.Getenv()的入參視為需要填入的AK,然而實際上該函數的功能是讀取環境變數。當您在機器上設定環境變數名稱為ALIBABA_CLOUD_ACCESS_KEY_ID和ALIBABA_CLOUD_ACCESS_KEY_SECRET時,os.Getenv將能夠擷取其對應的值。

    正確樣本

    client, err := sdk.NewClientWithAccessKey("<RegionId>",
    		os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"),
    		os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"))
    	if err != nil {
    		panic(err)
    	}