泛化調(diào)用
阿里云SDK不僅支持使用云產(chǎn)品SDK提供的特化調(diào)用方式調(diào)用OpenAPI,還支持使用核心SDK提供的泛化調(diào)用方式調(diào)用OpenAPI,兩種方式的不同請(qǐng)參見(jiàn)泛化調(diào)用與特化調(diào)用。本文將從獲取API信息、安裝SDK和代碼示例來(lái)為您介紹如何使用泛化調(diào)用。
獲取API信息
訪問(wèn)API文檔選擇云產(chǎn)品,例如選擇云服務(wù)器ECS。
單擊云服務(wù)器名稱(chēng)下面的獲取元數(shù)據(jù),在元數(shù)據(jù)中
info.style
查看云產(chǎn)品支持的OpenAPI風(fēng)格(RPC或者ROA)。說(shuō)明該位置獲取的元數(shù)據(jù)中包含了云產(chǎn)品的所有API信息,如果您想要查看單個(gè)API的元數(shù)據(jù),請(qǐng)查看步驟2。
選擇將要調(diào)用的API,單擊右上角獲取元數(shù)據(jù)。
在元數(shù)據(jù)中,定義了API支持的網(wǎng)絡(luò)協(xié)議、請(qǐng)求方式、參數(shù)及參數(shù)位置等信息。如下圖所示的RunInstances元數(shù)據(jù)中:
支持的網(wǎng)絡(luò)協(xié)議有HTTP和HTTPS,建議使用HTTPS。
支持的請(qǐng)求方式有GET和POST,兩者請(qǐng)求方式調(diào)用結(jié)果無(wú)任何差異,但GET請(qǐng)求只支持 32 KB 以?xún)?nèi)的請(qǐng)求包,所以推薦使用POST請(qǐng)求。
支持的參數(shù)有RegionId、ImageId等,參數(shù)位置在query,表示參數(shù)是要拼接在請(qǐng)求URL后面,例如https://ecs.cn-beijing.aliyuncs.com/?ImageId=aliyun_2_1903_x64_20G_alibase_20231221.vhd&InstanceChargeType=PostPaid&InstanceType=ecs.e-c1m1.large&InternetChargeType=PayByTraffic&MinAmount=1&Password=test%401234&RegionId=cn-beijing&SecurityGroupId=sg-2zec0dm6qi66XXXXXXXX&SystemDisk.Category=cloud_essd&SystemDisk.Size=40&VSwitchId=vsw-2ze3aagwn397gXXXXXXXX。
說(shuō)明元數(shù)據(jù)中其他支持的內(nèi)容對(duì)簽名無(wú)影響,這里暫不詳細(xì)說(shuō)明。更多元數(shù)據(jù)的信息,請(qǐng)參見(jiàn)元數(shù)據(jù)使用指南。
安裝SDK
在Terminal中執(zhí)行以下命令安裝核心SDK。
pip install alibabacloud-tea-openapi
代碼示例
示例:調(diào)用RPC風(fēng)格的API
以調(diào)用ECS的DescribeRegions接口為例,展示如何使用泛化調(diào)用方式。
import os
from alibabacloud_tea_openapi import models as open_api_models
from alibabacloud_tea_openapi.client import Client as OpenApiClient
from alibabacloud_tea_util import models as util_models
class Sample:
@staticmethod
def main():
# 從環(huán)境變量中獲取訪問(wèn)密鑰
config = open_api_models.Config(
access_key_id=os.environ['ALIBABA_CLOUD_ACCESS_KEY_ID'],
access_key_secret=os.environ['ALIBABA_CLOUD_ACCESS_KEY_SECRET']
)
# 設(shè)置服務(wù)接入點(diǎn)
config.endpoint = f'ecs-cn-hangzhou.aliyuncs.com'
client = OpenApiClient(config)
params = open_api_models.Params(
style='RPC', # API風(fēng)格
version='2014-05-26', # API版本號(hào)
action='DescribeRegions', # API 名稱(chēng)
method='POST', # 請(qǐng)求方法
pathname='/', # 接口 PATH
protocol='HTTPS', # 接口協(xié)議,
auth_type='AK',
req_body_type='json', # 接口請(qǐng)求體內(nèi)容格式,
body_type='json' # 接口響應(yīng)體內(nèi)容格式,
)
# 添加查詢(xún)參數(shù)和請(qǐng)求體
query = {'InstanceChargeType': 'PrePaid'}
# 創(chuàng)建API請(qǐng)求對(duì)象
request = open_api_models.OpenApiRequest(
query=query,
)
# 創(chuàng)建運(yùn)行時(shí)選項(xiàng)對(duì)象
runtime = util_models.RuntimeOptions()
# 發(fā)起API調(diào)用并打印響應(yīng)
response = client.call_api(params, request, runtime)
print(response)
@staticmethod
async def main_async():
"""
異步主函數(shù),用于演示如何使用異步方式調(diào)用阿里云 API。
"""
# 從環(huán)境變量中獲取訪問(wèn)密鑰
config = open_api_models.Config(
access_key_id=os.environ['ALIBABA_CLOUD_ACCESS_KEY_ID'],
access_key_secret=os.environ['ALIBABA_CLOUD_ACCESS_KEY_SECRET']
)
# 設(shè)置服務(wù)接入點(diǎn)
config.endpoint = f'ecs-cn-hangzhou.aliyuncs.com'
client = OpenApiClient(config)
params = open_api_models.Params(
style='RPC', # API風(fēng)格
version='2014-05-26', # API版本號(hào)
action='DescribeRegions', # API 名稱(chēng)
method='POST', # 請(qǐng)求方法
pathname='/', # 接口 PATH
protocol='HTTPS', # 接口協(xié)議,
auth_type='AK',
req_body_type='json', # 接口請(qǐng)求體內(nèi)容格式,
body_type='json' # 接口響應(yīng)體內(nèi)容格式,
)
# 添加query參數(shù)
query = {'InstanceChargeType': 'PrePaid'}
# 創(chuàng)建API請(qǐng)求對(duì)象
request = open_api_models.OpenApiRequest(
query=query,
)
# 創(chuàng)建運(yùn)行時(shí)選項(xiàng)對(duì)象
runtime = util_models.RuntimeOptions()
# 發(fā)起異步API調(diào)用
await client.call_api_async(params, request, runtime)
if __name__ == '__main__':
Sample.main()
示例:調(diào)用RESTful(ROA)風(fēng)格的API
以調(diào)用容器服務(wù)查詢(xún)集群列表信息為例,展示如何使用泛化調(diào)用。
import os
from alibabacloud_openapi_util.client import Client as OpenApiUtilClient
from alibabacloud_tea_openapi import models as open_api_models
from alibabacloud_tea_openapi.client import Client as OpenApiClient
from alibabacloud_tea_util import models as util_models
class Sample:
@staticmethod
def main() -> None:
# 從環(huán)境變量中獲取訪問(wèn)密鑰ID和密鑰Secret
config = open_api_models.Config(
access_key_id=os.environ['ALIBABA_CLOUD_ACCESS_KEY_ID'],
access_key_secret=os.environ['ALIBABA_CLOUD_ACCESS_KEY_SECRET']
)
config.endpoint = f'cs.cn-qingdao.aliyuncs.com'
client = OpenApiClient(config)
params = open_api_models.Params(
# 接口名稱(chēng),
action='DescribeClustersV1',
# 接口版本,
version='2015-12-15',
# 接口協(xié)議,
protocol='HTTPS',
# 接口 HTTP 方法,
method='GET',
auth_type='AK',
style='ROA',
# 接口 PATH,
pathname=f'/api/v1/clusters',
# 接口請(qǐng)求體內(nèi)容格式,
req_body_type='json',
# 接口響應(yīng)體內(nèi)容格式,
body_type='json'
)
# query params
queries = {'name': 'cluster-demo'}
request = open_api_models.OpenApiRequest(
query=OpenApiUtilClient.query(queries)
)
# runtime options
runtime = util_models.RuntimeOptions()
# 返回值為 Map 類(lèi)型,可從 Map 中獲得三類(lèi)數(shù)據(jù):響應(yīng)體 body、響應(yīng)頭 headers、HTTP 返回的狀態(tài)碼 statusCode。
response = client.call_api(params, request, runtime)
print(response)
@staticmethod
async def main_async() -> None:
# 從環(huán)境變量中獲取訪問(wèn)密鑰ID和密鑰Secret
config = open_api_models.Config(
access_key_id=os.environ['ALIBABA_CLOUD_ACCESS_KEY_ID'],
access_key_secret=os.environ['ALIBABA_CLOUD_ACCESS_KEY_SECRET']
)
config.endpoint = f'cs.cn-qingdao.aliyuncs.com'
client = OpenApiClient(config)
params = open_api_models.Params(
# 接口名稱(chēng),
action='DescribeClustersV1',
# 接口版本,
version='2015-12-15',
# 接口協(xié)議,
protocol='HTTPS',
# 接口 HTTP 方法,
method='GET',
auth_type='AK',
style='ROA',
# 接口 PATH,
pathname=f'/api/v1/clusters',
# 接口請(qǐng)求體內(nèi)容格式,
req_body_type='json',
# 接口響應(yīng)體內(nèi)容格式,
body_type='json'
)
# query params
queries = {'name': 'cluster-demo'}
request = open_api_models.OpenApiRequest(
query=OpenApiUtilClient.query(queries)
)
# runtime options
runtime = util_models.RuntimeOptions()
# 返回值為 Map 類(lèi)型,可從 Map 中獲得三類(lèi)數(shù)據(jù):響應(yīng)體 body、響應(yīng)頭 headers、HTTP 返回的狀態(tài)碼 statusCode。
await client.call_api_async(params, request, runtime)
if __name__ == '__main__':
Sample.main()