阿里雲V1.0 SDK支援一種通用的方式調用OpenAPI,此方式被稱為泛化調用。本文將為您詳細介紹如何使用泛化調用訪問OpenAPI。
特點
輕量級:僅需安裝Core包即可調用所有OpenAPI,無需依賴各產品的獨立SDK。
快速迭代相容性:當雲產品尚未提供相應的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"傳遞。
描述 | 傳參方式 |
請求參數顯示 | QueryParams["key"] = "value" 說明 如果請求參數的類型是集合,那麼參數應該按照QueryParams["key.1"] = "value1", QueryParams["key.2"] = "value2",...格式傳參。 |
請求參數顯示 | 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未正確配置。
解決方案:
執行以下命令,檢查您的環境變數中是否配置有ALIBABA_CLOUD_ACCESS_KEY_ID和ALIBABA_CLOUD_ACCESS_KEY_SECRET:
Linux/macOS
echo $ALIBABA_CLOUD_ACCESS_KEY_ID echo $ALIBABA_CLOUD_ACCESS_KEY_SECRETWindows
echo %ALIBABA_CLOUD_ACCESS_KEY_ID% echo %ALIBABA_CLOUD_ACCESS_KEY_SECRET%若返回正確的AccessKey,則說明配置成功。如果返回為空白或錯誤,請嘗試重新設定,具體操作請參見在Linux、macOS和Windows系統配置環境變數。
檢查代碼中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) }