O SDK do Alibaba Cloud simplifica o desenvolvimento e a integração de recursos ao chamar operações openapi a partir da sua aplicação. Este tópico descreve o fluxo completo de integração: instalar o SDK, configurar as credenciais de acesso e utilizar o SDK. Também aborda a Advance API para upload de arquivos e as perguntas frequentes.
Pré-requisitos
Python — Python 3.7 ou superior.
Par de AccessKey — É necessário um par de AccessKey para chamar a openapi do Alibaba Cloud. O usuário do Resource Access Management (RAM) associado ao par de AccessKey deve ter as permissões para chamar as operações da API de destino. Caso contrário, as chamadas falham com o erro "You are not authorized to perform this operation".
Pacotes do SDK — Os principais exemplos neste tópico exigem os pacotes
alibabacloud_dysmsapi20180501,alibabacloud_tea_openapiealibabacloud_tea_util.
Instale o SDK
O SDK Center fornece o método de instalação do SDK para cada product. Para obter e instalar o SDK:
Acesse o SDK Center.
Selecione o product cujas APIs deseja chamar, como o Short Message Service (SMS).
Na página Installation, selecione Python para All Languages.
Na aba Getting Started, encontre o método de instalação do SDK para o Short Message Service (SMS) e instale o SDK.
Configure credenciais de acesso
As chamadas à openapi do Alibaba Cloud geralmente exigem credenciais de acesso. Os tipos comuns de credenciais são AccessKey (AK) e tokens do Security Token Service (STS). Para evitar o vazamento de credenciais, é uma prática comum armazená-las em variáveis de ambiente. Para obter mais informações sobre as melhores práticas de segurança, consulte Secure use of access credentials.
Este tópico usa um par de AccessKey como exemplo. O exemplo a seguir usa as variáveis de ambiente ALIBABA_CLOUD_ACCESS_KEY_ID e ALIBABA_CLOUD_ACCESS_KEY_SECRET:
Configure no Linux e macOS
Defina um AccessKey do Alibaba Cloud em variáveis de ambiente no Linux e macOS
Esta seção usa as variáveis de ambiente ALIBABA_CLOUD_ACCESS_KEY_ID e ALIBABA_CLOUD_ACCESS_KEY_SECRET como exemplos. Substitua os nomes das variáveis conforme necessário, por exemplo, OSS_ACCESS_KEY_ID e OSS_ACCESS_KEY_SECRET.
Configure as variáveis de ambiente usando o comando export:
Uma variável de ambiente temporária definida com o comando export é válida apenas para a sessão atual. A variável é removida quando a sessão termina. Para retenção de longo prazo (LTR), adicione o comando export ao arquivo de configuração de inicialização do seu sistema operacional.
-
Defina o AccessKey ID e pressione Enter.
# Replace yourAccessKeyID with your AccessKey ID. export ALIBABA_CLOUD_ACCESS_KEY_ID=yourAccessKeyID -
Defina o AccessKey secret e pressione Enter.
# Replace yourAccessKeySecret with your AccessKey secret. export ALIBABA_CLOUD_ACCESS_KEY_SECRET=yourAccessKeySecret -
Verifique a configuração.
Execute o comando
echo $ALIBABA_CLOUD_ACCESS_KEY_ID. Se o comando retornar o AccessKey ID correto, a configuração estará correta.
Configure no Windows
Defina um AccessKey do Alibaba Cloud em variáveis de ambiente no Windows
Esta seção usa as variáveis de ambiente ALIBABA_CLOUD_ACCESS_KEY_ID e ALIBABA_CLOUD_ACCESS_KEY_SECRET como exemplos. Substitua os nomes das variáveis conforme necessário, por exemplo, OSS_ACCESS_KEY_ID e OSS_ACCESS_KEY_SECRET.
Usar a interface gráfica do usuário (GUI)
-
Procedimento
As etapas a seguir descrevem como definir variáveis de ambiente usando a GUI no Windows 10.
Na sua área de trabalho, clique com o botão direito em This PC e escolha Properties > Advanced system settings > Environment Variables > New em System variables ou User variables. Em seguida, conclua a configuração.
Variável
Valor de exemplo
AccessKey ID
Nome da variável: ALIBABA_CLOUD_ACCESS_KEY_ID
Valor da variável: yourAccessKeyID
AccessKey secret
Nome da variável: ALIBABA_CLOUD_ACCESS_KEY_SECRET
Valor da variável: yourAccessKeySecret
-
Teste a configuração
Clique em Start (ou use o atalho de teclado Win+R), clique em Run, insira
cmde clique em OK (ou pressione Enter) para abrir o prompt de comando. Execute os comandosecho %ALIBABA_CLOUD_ACCESS_KEY_ID%eecho %ALIBABA_CLOUD_ACCESS_KEY_SECRET%. Se os comandos retornarem o AccessKey correto, a configuração estará correta.
Usar o prompt de comando (CMD)
-
Procedimento
Abra o prompt de comando como administrador e execute os seguintes comandos para adicionar novas variáveis de ambiente ao sistema.
setx ALIBABA_CLOUD_ACCESS_KEY_ID yourAccessKeyID /M setx ALIBABA_CLOUD_ACCESS_KEY_SECRET yourAccessKeySecret /MO parâmetro
/Mindica uma variável de ambiente do sistema. Omita este parâmetro ao definir uma variável de ambiente do usuário. -
Teste a configuração
Clique em Start (ou use o atalho de teclado Win+R), clique em Run, insira
cmde clique em OK (ou pressione Enter) para abrir o prompt de comando. Execute os comandosecho %ALIBABA_CLOUD_ACCESS_KEY_ID%eecho %ALIBABA_CLOUD_ACCESS_KEY_SECRET%. Se os comandos retornarem o AccessKey correto, a configuração estará correta.
Usar o Windows PowerShell
No PowerShell, defina novas variáveis de ambiente válidas para todas as novas sessões:
[System.Environment]::SetEnvironmentVariable('ALIBABA_CLOUD_ACCESS_KEY_ID', 'yourAccessKeyID', [System.EnvironmentVariableTarget]::User)
[System.Environment]::SetEnvironmentVariable('ALIBABA_CLOUD_ACCESS_KEY_SECRET', 'yourAccessKeySecret', [System.EnvironmentVariableTarget]::User)
Para definir variáveis de ambiente para todos os usuários, são necessárias permissões administrativas:
[System.Environment]::SetEnvironmentVariable('ALIBABA_CLOUD_ACCESS_KEY_ID', 'yourAccessKeyID', [System.EnvironmentVariableTarget]::Machine)
[System.Environment]::SetEnvironmentVariable('ALIBABA_CLOUD_ACCESS_KEY_SECRET', 'yourAccessKeySecret', [System.EnvironmentVariableTarget]::Machine)
Defina variáveis de ambiente temporárias válidas apenas para a sessão atual:
$env:ALIBABA_CLOUD_ACCESS_KEY_ID = "yourAccessKeyID"
$env:ALIBABA_CLOUD_ACCESS_KEY_SECRET = "yourAccessKeySecret"
No PowerShell, execute os comandos Get-ChildItem env:ALIBABA_CLOUD_ACCESS_KEY_ID e Get-ChildItem env:ALIBABA_CLOUD_ACCESS_KEY_SECRET. Se os comandos retornarem o AccessKey correto, a configuração estará correta.
Após configurar as variáveis de ambiente, talvez seja necessário reiniciar suas ferramentas de desenvolvimento, como ambientes de desenvolvimento integrado (IDEs), ou serviços para que as novas configurações tenham efeito.
Usar o SDK
O fluxo de chamada padrão se aplica à maioria dos cenários. Alguns products cloud não suportam upload direto de arquivos por meio de operações openapi padrão. Para fazer upload de arquivos para esses products, use a Advance API. Consulte Upload files with the Advance API.
Este tópico usa a operação SendMessageToGlobe do Short Message Service (SMS) como exemplo. Para a referência da API da operação SendMessageToGlobe, consulte SendMessageToGlobe.
Inicializar o cliente de requisição
Todas as chamadas openapi são feitas por meio do cliente de requisição (Client) fornecido pelo SDK. Inicialize o cliente de requisição antes de chamar qualquer operação openapi. O cliente de requisição suporta vários métodos de inicialização. Este exemplo usa um par de AccessKey. Para obter mais métodos de inicialização, consulte Manage access credentials.
Os objetos Client são thread-safe. Por exemplo, é seguro compartilhar uma instância do Dysmsapi20180501Client em um ambiente multithread. Não é necessário criar uma instância separada para cada thread.
Não crie objetos cliente com frequência. Criá-los com frequência desperdiça recursos e degrada o desempenho. (Recomendado) Use o padrão singleton para encapsular o cliente e certifique-se de que apenas uma instância do cliente seja inicializada para as mesmas credenciais de acesso e endpoint durante todo o ciclo de vida da aplicação.
@staticmethod
def create_client() -> Dysmsapi20180501Client:
config = open_api_models.Config(
# Required. Make sure that the ALIBABA_CLOUD_ACCESS_KEY_ID environment variable is set.
access_key_id=os.environ['ALIBABA_CLOUD_ACCESS_KEY_ID'],
# Required. Make sure that the ALIBABA_CLOUD_ACCESS_KEY_SECRET environment variable is set.
access_key_secret=os.environ['ALIBABA_CLOUD_ACCESS_KEY_SECRET']
)
# See https://api.alibabacloud.com/product/Dysmsapi.
config.endpoint = f'dysmsapi.aliyuncs.com'
return Dysmsapi20180501Client(config)
Crie um objeto de requisição
Para passar parâmetros ao chamar uma operação openapi, use o objeto de requisição fornecido pelo SDK. Os objetos de requisição são nomeados no formato <API operation name>Request. Para obter mais informações sobre os parâmetros de requisição, consulte a documentação da API correspondente. Para a documentação da API usada neste exemplo, consulte SendMessageToGlobe.
Se uma operação openapi não suportar parâmetros de requisição, não é necessário criar um objeto de requisição. Por exemplo, a operação DescribeCdnSubList não suporta parâmetros de requisição.
# Create a request object and set the required input parameters.
send_message_to_globe_request = dysmsapi_20180501_models.SendMessageToGlobeRequest(
# Replace with the recipient number.
to='<YOUR_NUMBER>',
# Replace with the SMS content.
message='<YOUR_MESSAGE>'
)
Enviar a requisição
(Recomendado) Chame a função <api_name>_with_options para enviar a requisição, em que <api_name> é o nome da openapi em snake_case. A função recebe dois parâmetros: o objeto de requisição criado na etapa anterior e um objeto de opções de runtime. O objeto de opções de runtime configura o comportamento da requisição, como configurações de timeout e proxy. Para obter mais informações, consulte Advanced Configurations.
A função retorna um objeto de resposta se a requisição for bem-sucedida. Imprima a resposta ou registre-a em log para verificar o resultado da chamada.
Se uma operação openapi não suportar parâmetros de requisição, não é necessário passar um objeto de requisição ao enviar a requisição. Por exemplo, ao chamar DescribeCdnSubList, passe apenas as opções de runtime.
# Create runtime parameters.
runtime = util_models.RuntimeOptions()
client = create_client()
# Send the request.
client.send_message_to_globe_with_options(send_message_to_globe_request, runtime)
Tratar exceções
O SDK Python V2.0 classifica as exceções em dois tipos principais:
TeaUnretryableException: lançada principalmente devido a problemas de rede, após as retentativas de rede atingirem o limite máximo.
-
TeaException: lançada principalmente para erros de negócios do lado do service.
Para obter mais informações sobre o tratamento de exceções, consulte Exception handling.
Adote medidas adequadas para tratar exceções, como propagar exceções, registrar logs e tentar a recuperação, para garantir a robustez e a estabilidade do seu sistema.
Exemplo de código completo
O exemplo a seguir combina as etapas anteriores: inicializar o cliente de requisição, criar um objeto de requisição, enviar a requisição e tratar exceções.
Exemplo de chamada de API
import os
import sys
from typing import List
from alibabacloud_dysmsapi20180501.client import Client as Dysmsapi20180501Client
from alibabacloud_tea_openapi import models as open_api_models
from alibabacloud_dysmsapi20180501 import models as dysmsapi_20180501_models
from alibabacloud_tea_util import models as util_models
from alibabacloud_tea_util.client import Client as UtilClient
class Sample:
def __init__(self):
pass
@staticmethod
def create_client() -> Dysmsapi20180501Client:
config = open_api_models.Config(
# Required. Make sure that the ALIBABA_CLOUD_ACCESS_KEY_ID environment variable is set.
access_key_id=os.environ['ALIBABA_CLOUD_ACCESS_KEY_ID'],
# Required. Make sure that the ALIBABA_CLOUD_ACCESS_KEY_SECRET environment variable is set.
access_key_secret=os.environ['ALIBABA_CLOUD_ACCESS_KEY_SECRET']
)
# See https://api.alibabacloud.com/product/Dysmsapi.
config.endpoint = f'dysmsapi.aliyuncs.com'
return Dysmsapi20180501Client(config)
@staticmethod
def main(
args: List[str],
) -> None:
client = Sample.create_client()
# Create a request object and set the required input parameters.
send_message_to_globe_request = dysmsapi_20180501_models.SendMessageToGlobeRequest(
# Replace with the recipient number.
to='<YOUR_NUMBER>',
# Replace with the SMS content.
message='<YOUR_MESSAGE>'
)
# Create runtime parameters.
runtime = util_models.RuntimeOptions()
try:
# Send the request.
send_message_to_globe_response = client.send_message_to_globe_with_options(send_message_to_globe_request, runtime)
# Print the API response to verify the result.
print(send_message_to_globe_response)
except Exception as error:
# For demonstration purposes only. Handle exceptions with care and never ignore exceptions in your project.
# The error message.
error_message = getattr(error, 'message', str(error))
print(error_message)
# The diagnostic URL.
print(getattr(error, 'data', {}).get("Recommend"))
UtilClient.assert_as_string(error_message)
if __name__ == '__main__':
Sample.main(sys.argv[1:])
Fazer upload de arquivos com a Advance API
Alguns products cloud, como Image Search e Visual Intelligence API, não suportam upload direto de arquivos por meio das operações openapi padrão descritas na documentação oficial. Para fazer upload de arquivos para esses products, use a API Advance fornecida pelo product cloud. A API Advance aceita um objeto de stream de arquivo. Internamente, o product cloud armazena temporariamente o arquivo carregado no Alibaba Cloud OSS. A região de armazenamento padrão é cn-shanghai. O product cloud lê o arquivo temporário do OSS para fornecer o recurso. O exemplo a seguir usa a API DetectBodyCount do service Face and Body no Alibaba Cloud Visual Intelligence API.
Os arquivos temporários armazenados no Alibaba Cloud OSS são removidos periodicamente.
Para inicializar o cliente de requisição
Defina tanto o region_id quanto o endpoint do product ao inicializar o cliente de requisição. O region_id especifica a região de armazenamento do arquivo temporário no OSS. Se o region_id não for definido, o product e o OSS podem residir em regiões diferentes, o que pode causar timeouts ao chamar a operação openapi.
def create_client() -> facebody20191230Client:
config = open_api_models.Config(
# Required. Make sure that the ALIBABA_CLOUD_ACCESS_KEY_ID environment variable is set in your code execution environment.
access_key_id=os.environ['ALIBABA_CLOUD_ACCESS_KEY_ID'],
# Required. Make sure that the ALIBABA_CLOUD_ACCESS_KEY_SECRET environment variable is set in your code execution environment.
access_key_secret=os.environ['ALIBABA_CLOUD_ACCESS_KEY_SECRET']
)
# The endpoint and regionId must be set to the same region.
config.region_id = 'cn-shanghai'
config.endpoint = 'facebody.cn-shanghai.aliyuncs.com'
return facebody20191230Client(config)
Para criar um objeto de requisição
Crie um objeto de requisição <OpenAPIName>AdvanceRequest para passar o stream do arquivo. O nome do parâmetro é fixo como ImageURLObject.
# Open the file as a binary stream.
with open('<FILE_PATH>', "rb") as f: # Replace with your file path.
# Set request parameters.
detect_body_count_advance_request = facebody_20191230_models.DetectBodyCountAdvanceRequest(
image_urlobject=f,
)
Para enviar a requisição
Chame a função <apiName>Advance para enviar a requisição, em que <apiName> é o nome da openapi em lower camelCase.
# Runtime configuration.
runtime = util_models.RuntimeOptions()
client = create_client()
# Send the request.
res = client.detect_body_count_advance(detect_body_count_advance_request, runtime)
O exemplo a seguir mostra o código completo para fazer upload de um arquivo com a Advance API.
import os
from alibabacloud_facebody20191230 import models as facebody_20191230_models
from alibabacloud_facebody20191230.client import Client as facebody20191230Client
from alibabacloud_tea_openapi import models as open_api_models
from alibabacloud_tea_util import models as util_models
class Sample:
def __init__(self):
pass
@staticmethod
def create_client() -> facebody20191230Client:
config = open_api_models.Config(
# Required. Make sure that the ALIBABA_CLOUD_ACCESS_KEY_ID environment variable is set in your code execution environment.
access_key_id=os.environ['ALIBABA_CLOUD_ACCESS_KEY_ID'],
# Required. Make sure that the ALIBABA_CLOUD_ACCESS_KEY_SECRET environment variable is set in your code execution environment.
access_key_secret=os.environ['ALIBABA_CLOUD_ACCESS_KEY_SECRET']
)
config.region_id = 'cn-shanghai'
config.endpoint = 'facebody.cn-shanghai.aliyuncs.com'
return facebody20191230Client(config)
@staticmethod
def main() -> None:
client = Sample.create_client()
# Open the file as a binary stream.
with open('<FILE_PATH>', "rb") as f: # Replace <FILE_PATH> with your file path.
# Set request parameters.
detect_body_count_advance_request = facebody_20191230_models.DetectBodyCountAdvanceRequest(
image_urlobject=f,
)
runtime = util_models.RuntimeOptions()
try:
# Send the request.
res = client.detect_body_count_advance(detect_body_count_advance_request, runtime)
print(res)
except Exception as error:
# This is for printing and demonstration purposes only. Handle exceptions with care and do not ignore them in your project.
print(error)
if __name__ == '__main__':
Sample.main()
Perguntas frequentes
"You are not authorized to perform this operation"
Causa: O usuário RAM associado ao seu par de AccessKey não tem as permissões para chamar esta operação da API.
Solução: Conceda as permissões openapi necessárias ao usuário RAM. Para obter mais informações sobre como conceder permissões a um usuário RAM, consulte Manage RAM user permissions.
Por exemplo, a chamada da operação SendMessageToGlobe retorna esse erro se o usuário RAM não tiver a permissão correspondente. Crie uma política de permissão personalizada como a seguinte e conceda as permissões correspondentes ao usuário RAM.
{
"Version": "1",
"Statement": [
{
"Effect": "Allow",
"Action": "dysms:SendMessageToGlobe",
"Resource": "*"
}
]
}
"SDK.EndpointResolvingError"
Causa: A operação openapi chamada não suporta o endpoint especificado ao inicializar o cliente de requisição.
Solução: Verifique Endpoint configuration, atualize o endpoint para um valor suportado e, em seguida, chame a operação openapi novamente.
AttributeError ou KeyError relacionado ao AccessKey
Uma chamada openapi retorna AttributeError: 'AttributeError' object has no attribute 'message' ou KeyError: 'ALIBABA_CLOUD_ACCESS_KEY_ID'.
Causa: O par de AccessKey não foi passado corretamente.
Solução: Ao inicializar o cliente de requisição, verifique se o par de AccessKey foi passado corretamente. Observe que os.environ["XXX"] obtém o valor de XXX das variáveis de ambiente.
Para obter mais soluções para erros encontrados ao usar o SDK, consulte FAQ.