全部產品
Search
文件中心

Alibaba Cloud SDK:泛化調用

更新時間:Jul 01, 2025

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

特點

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

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

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

使用說明

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

安裝核心SDK

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

pip install aliyun-python-sdk-core

調用OpenAPI

初始化請求用戶端

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

說明

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

import os
from aliyunsdkcore.client import AcsClient

# 使用AccessKey直接初始化。
client = AcsClient(
    os.environ['ALIYUN_ACCESS_KEY_ID'],
    os.environ['ALIYUN_ACCESS_KEY_SECRET'],
    region_id='cn-hangzhou',
    # verify=False,  # 忽略對 SSL 憑證的驗證
    # proxy={'http': 'http://127.0.0.1:9898'}, # 設定代理
    # proxy={'https': 'http://<user>:<password>@127.0.0.1:8989'},
    # connect_timeout=10,  # 連線逾時
    # timeout=15  # 讀逾時時間
)

配置OpenAPI資訊及請求參數

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

說明

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

介面請求參數說明

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

描述

傳參方式

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

dd_query_param(self, k, v)

說明

如果請求參數的類型是集合,那麼參數應該按照add_query_param("key.1","value1");

add_query_param("key.2","value2");...格式傳參。

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

add_body_params(self, k, v)

說明

如請求參數的類型非字串類型,則需將參數值轉換為JSON字串。

上傳檔案時。

set_content(self, content)

說明

參數content必須為位元組數群組類型。

# 2.建立CommonRequest對象並配置OpenAPI基本資料和請求參數。
request = CommonRequest()

# 2.1 配置公用請求參數
request.set_domain('ecs-cn-hangzhou.aliyuncs.com')  # API服務地址
request.set_version('2014-05-26')  # API版本號碼
request.set_action_name('DescribeInstanceStatus')  # API名稱,當調用RPC風格API時,必須配置set_action_name()指定介面名稱
request.set_method('POST')  # API請求方式
request.set_protocol_type('HTTPS')  # 請求協議:HTTPS或HTTP,建議使用HTTPS。
# request.set_uri_pattern('/')  # API資源路徑,ROA介面必傳。RPC介面禁止設定該參數。

# 2.2 配置介面請求參數
# 情境一:Query參數通過add_query_param(self, k, v)設定
InstanceIds = [
    "i-bp1axhql4dqXXXXXXXX",
    "i-bp124uve8zqXXXXXXXX"
]
for depth1 in range(len(InstanceIds)):
    request.add_query_param('InstanceId.' + str(depth1 + 1), InstanceIds[depth1])
request.add_query_param('PageNumber', '1')
request.add_query_param('PageSize', '30')

# 情境二:body參數通過add_body_params(self, k, v)設定
# request.add_body_params('key1', 'value1')
# request.add_body_params('key2', 'value2')
# request.add_body_params('key3', 'value3')

# 情境三:檔案上傳set_content(self, content),content為位元組數群組類型
# file_path = "<FILE_PATH>" # <FILE_PATH>需替換為實際檔案路徑
# with open(file_path, 'rb') as file:
#    讀取圖片內容為位元組數組
#    ByteArray = file.read()
# request.set_content(ByteArray)

發起請求

通過client調用do_action_with_exception發起請求,參數為前一步構造的CommonRequest執行個體。

# 發起請求
response = client.do_action_with_exception(request)
# 傳回值是 bytes 類型,包含RequestId以及OpenAPI的返回參數
print(f"response:\n{response}")
# 解析響應內容(JSON 格式)
response_json = json.loads(response.decode('utf-8'))  # 轉換為Python字典
print("RequestId:", response_json["RequestId"])  # 請求ID

程式碼範例

樣本:調用RPC風格的API

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

import os
from aliyunsdkcore.client import AcsClient
from aliyunsdkcore.request import CommonRequest


class Sample:

    @staticmethod
    def main():
        # 使用AccessKey直接初始化。
        client = AcsClient(os.environ['ALIBABA_CLOUD_ACCESS_KEY_ID'], os.environ['ALIBABA_CLOUD_ACCESS_KEY_SECRET'],
                           'cn-hangzhou')
        # 建立請求對象
        request = CommonRequest()
        request.set_domain('ecs-cn-hangzhou.aliyuncs.com')  # API服務地址
        request.set_version('2014-05-26')  # API版本號碼
        request.set_action_name('DescribeRegions')  # API名稱,當調用RPC風格API時,必須配置set_action_name()指定介面名稱
        request.set_method('POST')  # API請求方式
        request.set_protocol_type('HTTPS')  # 請求協議:HTTPS或HTTP,建議使用HTTPS。
        InstanceIds = [
            "i-bp1axhql4dqXXXXXXXX",
            "i-bp124uve8zqXXXXXXXX"
        ]
        for depth1 in range(len(InstanceIds)):
            request.add_query_param('InstanceId.' + str(depth1 + 1), InstanceIds[depth1])
        request.add_query_param('PageNumber', '1')
        request.add_query_param('PageSize', '30')
        # 發起請求並處理響應
        response = client.do_action_with_exception(request)
        print(response)


if __name__ == '__main__':
    Sample.main()
     

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

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

import os
from aliyunsdkcore.client import AcsClient
from aliyunsdkcore.request import CommonRequest


class Sample:

    @staticmethod
    def main():
        # 使用AccessKey直接初始化。
        client = AcsClient(
            os.environ['ALIBABA_CLOUD_ACCESS_KEY_ID'],
            os.environ['ALIBABA_CLOUD_ACCESS_KEY_SECRET'],
            'cn-hangzhou')
        # 建立請求對象
        request = CommonRequest()
        request.set_domain('cs.aliyuncs.com')  # API服務地址
        request.set_version('2015-12-15')  # API版本號碼
        request.set_uri_pattern(
            f'/api/v1/clusters')  # API資源路徑,當調用ROA風格API時,必須配置set_uri_pattern()指定完整資源路徑。從OpenAPI中繼資料中data.path擷取資源路徑。
        request.set_method('GET')  # API要求方法
        request.add_query_param('name', 'cluster-demo')  # 配置請求參數
        # 發起請求並處理響應
        response = client.do_action_with_exception(request)
        print(response)


if __name__ == '__main__':
    Sample.main()

常見問題

  1. 報錯提示“Error: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相關內容是否存在錯誤。

      常見錯誤樣本:

      AccessKeyId = os.environ['yourAccessKeyID'],
      AccessKeySecret = os.environ['yourAccessKeySecret']
      說明

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

      正確樣本

      os.environ['ALIBABA_CLOUD_ACCESS_KEY_ID'], 
      os.environ['ALIBABA_CLOUD_ACCESS_KEY_SECRET'],
  2. 報錯提示“aliyunsdkcore.acs_exception.exceptions.ServerException: HTTP Status: 400 Error:MissingParameter The input parameter "Timestamp" that is mandatory for processing this request is not supplied. ”

    問題原因:RPC介面公用請求參數設定了uri_pattern參數。

    解決方案:在公用請求參數中去掉uri_pattern參數。