Ao chamar operações da openapi, recomendamos a integração do SDK ao seu projeto. O uso do SDK simplifica o desenvolvimento, permite a integração rápida de recursos e reduz os custos de manutenção. A integração do Alibaba Cloud SDK envolve três etapas: importar o Alibaba Cloud SDK, definir as credenciais de acesso e usar o SDK. Este tópico descreve detalhadamente o processo de integração do SDK.
Pré-requisitos
Go 1.10.x ou superior
Importe o SDK
Acesse o SDK Center e selecione o product cuja API deseja chamar, como o Short Message Service (SMS).
-
Na página Installation e, em All Languages, selecione Go. Na aba Quick Start, obtenha o método de instalação do SDK para o Short Message Service (SMS).
Para o SDK, instale a biblioteca principal com o comando:
go get github.com/alibabacloud-go/darabonba-openapi/v2/client. Para o Short Message Service (SMS), instale o SDK com o comando:go get github.com/alibabacloud-go/dysmsapi-20170525/v4. Repositório de releases e código-fonte: https://github.com/alibabacloud-go/dysmsapi-20170525/.
Defina as credenciais de acesso
Chamar a openapi do Alibaba Cloud geralmente exige definir credenciais de acesso. Os tipos comuns de credenciais são AccessKey (AK) e Security Token Service token (STS token). Para evitar vazamentos de credenciais, uma solução comum é armazená-las em variáveis de ambiente. Para outras soluções de segurança, consulte Securely use access credentials. Este tópico usa as variáveis de ambiente ALIBABA_CLOUD_ACCESS_KEY_ID e ALIBABA_CLOUD_ACCESS_KEY_SECRET como exemplo. Por favor, configure as credenciais da seguinte forma.
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 é apagada ao término da sessão. Para retenção de longo prazo (LTR), adicione o comando export ao arquivo de configuração de inicialização do seu sistema operacional.
-
Configure o AccessKey ID e pressione Enter.
# Replace yourAccessKeyID with your AccessKey ID. export ALIBABA_CLOUD_ACCESS_KEY_ID=yourAccessKeyID -
Configure 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.
Use a interface gráfica do usuário (GUI)
-
Procedimento
As etapas a seguir descrevem como definir variáveis de ambiente pela 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.
Use 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 esse parâmetro ao definir uma variável de ambiente de 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.
Use 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, reinicie as ferramentas de desenvolvimento, como ambientes de desenvolvimento integrado (IDEs) ou serviços, para que as novas configurações tenham efeito.
Use o SDK
Este tópico usa a API SendMessageToGlobe do Short Message Service (SMS) como exemplo. Para a referência da API SendMessageToGlobe, consulte SendMessageToGlobe.
1. Inicialize o client de requisição
No SDK V2.0, todas as chamadas da openapi são iniciadas por meio de um client de requisição (Client) fornecido pelo SDK. Portanto, inicialize o client de requisição antes de chamar uma operação da openapi. O client de requisição oferece suporte a vários métodos de inicialização. Este exemplo usa um AccessKey para a inicialização. Para mais métodos de inicialização e para que você gerencie as credenciais, consulte Manage access credentials.
Segurança de threads: A instância do client é thread-safe e pode ser usada com segurança em um ambiente multithread. Não crie uma instância separada para cada thread.
No desenvolvimento real, não recomendamos criar objetos client com frequência. Isso desperdiça recursos e degrada o desempenho. Recomendamos usar o padrão singleton para encapsular o client, de modo que apenas um objeto client seja inicializado para as mesmas credenciais de acesso e Endpoint durante todo o ciclo de vida da aplicação.
import (
"os"
openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client"
dysmsapi20180501 "github.com/alibabacloud-go/dysmsapi-20180501/v2/client"
"github.com/alibabacloud-go/tea/tea"
)
func CreateClient () (_result *dysmsapi20180501.Client, _err error) {
config := &openapi.Config{
// Required, please ensure that the environment variables ALIBABA_CLOUD_ACCESS_KEY_ID is set.
AccessKeyId: tea.String(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_ID")),
// Required, please ensure that the environment variables ALIBABA_CLOUD_ACCESS_KEY_SECRET is set.
AccessKeySecret: tea.String(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET")),
}
config.Endpoint = tea.String("dysmsapi.aliyuncs.com")
_result = &dysmsapi20180501.Client{}
_result, _err = dysmsapi20180501.NewClient(config)
return _result, _err
}
2. Crie uma instância da struct de requisição
Ao chamar uma operação da openapi para passar parâmetros, use a struct Request fornecida pelo SDK. O formato de nomenclatura da struct Request da openapi é <OpenAPI name>Request. Por exemplo, o objeto de requisição da API SendSms é SendSmsRequest. Para mais informações sobre os parâmetros de requisição, consulte a referência da API correspondente. Para a referência da API usada neste exemplo, consulte SendMessageToGlobe.
Se a operação da openapi não oferecer suporte a parâmetros de requisição, não crie um objeto de requisição. Por exemplo, ao chamar DescribeCdnSubList, esta API não aceita parâmetros de requisição.
// Create request object and set required input parameters
sendMessageToGlobeRequest := &dysmsapi20180501.SendMessageToGlobeRequest{
// Please replace with the actual recipient number.
To: tea.String("<YOUR_VALUE>"),
// Please replace with the actual SMS content.
Message: tea.String("<YOUR_VALUE>"),
}
3. Envie a requisição
Ao chamar uma operação da openapi por meio do client de requisição, use a função <API name>WithOptions (Recomendado). Esta função aceita dois parâmetros: o primeiro é um ponteiro para a struct Request da API, e o segundo é um ponteiro para a struct de opções de runtime. As opções de runtime configuram o comportamento da requisição, como tempo limite e configurações de proxy. Para mais informações, consulte Advanced configurations.
Se a operação da openapi não oferecer suporte a parâmetros de requisição, não é necessário passar um objeto de requisição ao enviá-la. Por exemplo, ao chamar DescribeCdnSubList, esta API requer apenas as opções de runtime.
// You need to add util "github.com/alibabacloud-go/tea-utils/v2/service" to the import.
func _main() (_result *dysmsapi20180501.SendMessageToGlobeResponse, _err error) {
client, _err := CreateClient()
if _err != nil {
return nil, _err
}
// Create request object and set required input parameters
sendMessageToGlobeRequest := &dysmsapi20180501.SendMessageToGlobeRequest{
// Please replace with the actual recipient number.
To: tea.String("<YOUR_VALUE>"),
// Please replace with the actual SMS content.
Message: tea.String("<YOUR_VALUE>"),
}
runtime := &util.RuntimeOptions{}
// To run the code, copy it and print the API return value.
response, _err := client.SendMessageToGlobeWithOptions(sendMessageToGlobeRequest, runtime)
if _err != nil {
return nil, _err
}
return response, _err
}
4. Trate as exceções
O SDK Go V2.0 classifica as exceções em dois tipos principais: error e SDKError.
error: Erros não relacionados a negócios, como erros de validação causados por arquivos source do SDK modificados ou erros de parsing.
SDKError: Erros relacionados a negócios.
Para mais informações sobre o tratamento de exceções, consulte Handle exceptions.
Adote medidas adequadas para tratar exceções, como propagá-las corretamente, registrar logs e tentar a recuperação, a fim de garantir a robustez e a estabilidade do sistema.
Clique e visualize o exemplo de código completo
Cenário especial: Configure a API Advance para upload de arquivos
Ao usar cloud products como Image Search e Visual Intelligence API para processar imagens locais ou fazer upload de imagens, as operações da openapi fornecidas na documentação oficial não oferecem suporte ao upload direto de arquivos. Para fazer o upload de um arquivo, use a API Advance fornecida pelo cloud product, que aceita um objeto de fluxo de arquivo. O mecanismo subjacente é o seguinte: o cloud product armazena temporariamente o arquivo enviado no Alibaba Cloud OSS (a região de armazenamento padrão é cn-shanghai) e implementa o recurso relacionado lendo o arquivo temporário desse OSS. Este exemplo usa a API DetectBodyCount do Visual Intelligence API. O procedimento é descrito a seguir.
Os arquivos temporários armazenados no Alibaba Cloud OSS são excluídos periodicamente.
-
Inicialize o client de requisição
Defina tanto o
RegionIdquanto oEndpointdo cloud product. ORegionIdespecifica a região onde o arquivo temporário é armazenado no OSS. Se oRegionIdnão for definido, podem ocorrer tempos limite ao chamar a operação da openapi, pois o cloud product e o OSS podem estar em regiões diferentes.import ( "os" openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client" facebody20191230 "github.com/alibabacloud-go/facebody-20191230/v5/client" "github.com/alibabacloud-go/tea/tea" ) func CreateClient() (_result *facebody20191230.Client, _err error) { config := &openapi.Config{ // Required. Make sure that the ALIBABA_CLOUD_ACCESS_KEY_ID environment variable is set. AccessKeyId: tea.String(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_ID")), // Required. Make sure that the ALIBABA_CLOUD_ACCESS_KEY_SECRET environment variable is set. AccessKeySecret: tea.String(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET")), } // The endpoint and regionId must be set to the same region. config.RegionId = tea.String("cn-shanghai") config.Endpoint = tea.String("facebody.cn-shanghai.aliyuncs.com") _result, _err = facebody20191230.NewClient(config) return _result, _err } -
Crie uma instância da struct AdvanceRequest
Ao fazer o upload de um arquivo local, use a struct AdvanceRequest fornecida pelo SDK para passar o fluxo do arquivo. O formato de nomenclatura da struct AdvanceRequest é
<OpenAPI name>AdvanceRequest. Para identificar o parâmetro que recebe o fluxo do arquivo, busque o parâmetro do tipoio.Readerna struct AdvanceRequest correspondente.// Replace with the file path. filePath := `<FILE_PATH>` // Open the file and create a stream. file, err := os.Open(filePath) if err != nil { return fmt.Errorf("Failed to open file: %v", err) } defer file.Close() // Close the file. // Create an AdvanceRequest struct instance. detectBodyCountAdvanceRequest := &facebody20191230.DetectBodyCountAdvanceRequest{ ImageURLObject: file, } -
Envie a requisição
Chame a função
<API name>Advancepara enviar a requisição. O parâmetro de entrada é um ponteiro para a struct AdvanceRequest.// You need to add util "github.com/alibabacloud-go/tea-utils/v2/service" to the import. func _main() (response *facebody20191230.DetectBodyCountResponse, _err error) { client, _err := CreateClient() if _err != nil { return nil, _err } // Replace with the file path. filePath := `<FILE_PATH>` // Open the file and create a stream. file, err := os.Open(filePath) if err != nil { return nil, fmt.Errorf("Failed to open file: %v", err) } defer file.Close() // Close the file. // Create a request object. detectBodyCountAdvanceRequest := &facebody20191230.DetectBodyCountAdvanceRequest{ ImageURLObject: file, } runtime := &util.RuntimeOptions{} // Send the request. response, _err = client.DetectBodyCountAdvance(detectBodyCountAdvanceRequest, runtime) if _err != nil { return nil, _err } return response, nil }
FAQ
-
A mensagem de erro "You are not authorized to perform this operation" é exibida ao chamar uma operação da openapi.
-
A mensagem de erro "SDKError: Message: Post "https://ecs-cn-XX.aliyuncs.com": dial tcp: lookup ecs-cn-XX.aliyuncs.com: no such host" é exibida ao chamar uma operação da openapi.
-
A mensagem de erro "SDKError: StatusCode: 404 Code: InvalidAccessKeyId.NotFound Message: code: 404, Specified access key is not found." é exibida ao chamar uma operação da openapi.
Para obter soluções para outros erros ao usar o SDK, consulte FAQ.