Visão geral dos métodos de conveniência e protocolo do SDK do Azure para .NET
As bibliotecas de clientes do SDK do Azure fornecem uma interface para os serviços do Azure traduzindo chamadas de método em mensagens enviadas por meio do respectivo protocolo de serviço. Para serviços de API REST, isso significa enviar solicitações HTTP e converter as respostas em tipos de runtime. Neste artigo, você aprenderá sobre os diferentes tipos de métodos expostos pelas bibliotecas de cliente e explorará seus padrões de implementação.
Entender os métodos de protocolo e conveniência
Uma biblioteca de clientes do SDK do Azure para .NET pode expor duas categorias diferentes de métodos para fazer solicitações a um serviço do Azure:
- Os métodos de protocolo fornecem um wrapper fino em torno da API REST subjacente para um serviço do Azure correspondente. Esses métodos mapeiam parâmetros de entrada primitivos para valores de solicitação HTTP e retornam um objeto de resposta HTTP bruto.
- Os métodos de conveniência fornecem uma camada de conveniência sobre a camada de protocolo de nível inferior para adicionar suporte ao sistema de tipos .NET e outros benefícios. Métodos de conveniência aceitam primitivos ou tipos de modelo .NET como parâmetros e mapeiam-os para o corpo de uma solicitação de API REST subjacente. Esses métodos também lidam com vários detalhes do gerenciamento de solicitações e respostas para permitir que os desenvolvedores se concentrem no envio e recebimento de objetos de dados, em vez de preocupações de nível inferior.
Padrões de dependência da biblioteca de clientes do SDK do Azure
Os métodos de protocolo e conveniência implementam padrões ligeiramente diferentes com base na cadeia de dependência de pacote subjacente da respectiva biblioteca. Uma biblioteca de clientes do SDK do Azure para .NET depende de uma das duas bibliotecas fundamentais diferentes:
- Azure.Core fornece primitivos compartilhados, abstrações e auxiliares para a criação de bibliotecas de clientes modernas do SDK do Azure. Essas bibliotecas seguem as diretrizes de design do SDK do Azure para .NET e usam nomes de pacote e namespaces prefixados com o Azure, como
Azure.Storage.Blobs
. - System.ClientModel é uma biblioteca principal que fornece primitivos compartilhados, abstrações e auxiliares para bibliotecas de clientes do serviço .NET. A biblioteca
System.ClientModel
é um conjunto de ferramentas de uso geral projetado para ajudar a criar bibliotecas para várias plataformas e serviços, enquanto a bibliotecaAzure.Core
foi projetada especificamente para criar bibliotecas de cliente do Azure.
Observação
A biblioteca Azure.Core
em si também depende de System.ClientModel
para vários blocos de construção do cliente. No contexto deste artigo, o diferencial chave para padrões de método é se uma biblioteca de clientes depende de Azure.Core
ou System.ClientModel
diretamente, em vez de por meio de uma dependência transitiva.
A tabela a seguir compara alguns dos tipos de solicitação e resposta usados por métodos de protocolo e conveniência, com base em se a biblioteca depende de Azure.Core
ou System.ClientModel
.
Solicitar uma preocupação de resposta | Azure.Core | System.ClientModel |
---|---|---|
Corpo da solicitação | RequestContent | BinaryContent |
Opções avançadas de solicitação | RequestContext | RequestOptions |
Resposta HTTP bruta | Response | PipelineResponse |
Tipo de retorno com o modelo de saída | Response<T> | ClientResult<T> |
As seções adiante fornecem exemplos de implementação desses conceitos.
Exemplos de protocolo e método de conveniência
Os padrões e tipos de codificação usados pelo protocolo de biblioteca de clientes e métodos de conveniência variam ligeiramente de acordo com se a biblioteca depende de Azure.Core
ou System.ClientModel
. As diferenças influenciam principalmente os tipos .NET usados para lidar com dados de solicitação e resposta.
Bibliotecas que dependem do Azure.Core
As bibliotecas de clientes do SDK do Azure que aderirem às diretrizes de design mais recentes dependem da biblioteca Azure.Core
. Por exemplo, a biblioteca Azure.AI.ContentSafety
depende da biblioteca Azure.Core
e fornece uma classe ContentSafetyClient
que expõe métodos de protocolo e conveniência.
O código a seguir usa ContentSafetyClient
para chamar o método de conveniência AnalyzeText
:
using Azure.AI.ContentSafety;
using Azure.Identity;
// Create the client
ContentSafetyClient client = new(
new Uri("https://contentsafetyai.cognitiveservices.azure.com/"),
new DefaultAzureCredential());
// Call the convenience method
AnalyzeTextResult result = client.AnalyzeText("What is Microsoft Azure?");
// Display the results
foreach (TextCategoriesAnalysis item in result.CategoriesAnalysis)
{
Console.WriteLine($"{item.Category}: {item.Severity}");
}
O código anterior demonstra os seguintes padrões de método de conveniência Azure.Core
:
- Usa um tipo de modelo ou primitivo C# padrão como um parâmetro.
- Retorna um tipo C# amigável que representa o resultado da operação.
Bibliotecas que dependem de System.ClientModel
Algumas bibliotecas de clientes que se conectam a serviços que não são do Azure usam padrões semelhantes às bibliotecas que dependem de Azure.Core
. Por exemplo, a biblioteca de OpenAI
fornece um cliente que se conecta aos serviços OpenAI. Essas bibliotecas são baseadas em uma biblioteca chamada System.ClientModel
que tem padrões semelhantes a Azure.Core
.
Considere o seguinte código que usa um ChatClient
para chamar o método de conveniência CompleteChat
:
using OpenAI.Chat;
// Create the client
ChatClient client = new(
model: "gpt-4o-mini",
credential: Environment.GetEnvironmentVariable("OPENAI_API_KEY")!);
// Call the convenience method
ChatCompletion completion = client.CompleteChat("What is Microsoft Azure?");
// Display the results
Console.WriteLine($"[{completion.Role}]: {completion}");
O código anterior demonstra os seguintes padrões de método de conveniência System.ClientModel
:
- Usa um tipo de modelo ou primitivo C# padrão como um parâmetro.
- Retorna um tipo
ClientResult
amigável que representa o resultado da operação.
Tratar exceções
Quando uma chamada de serviço falha, o cliente de serviço lança uma exceção que expõe o código do status HTTP e os detalhes da resposta do serviço, se estiverem disponíveis. Uma biblioteca dependente de System.ClientModel
lança um ClientResultException, enquanto uma biblioteca dependente de Azure.Core
lança um RequestFailedException.
using Azure.AI.ContentSafety;
using Azure.Identity;
using Azure;
// Create the client
ContentSafetyClient client = new(
new Uri("https://contentsafetyai.cognitiveservices.azure.com/"),
new DefaultAzureCredential());
try
{
// Call the convenience method
AnalyzeTextResult result = client.AnalyzeText("What is Microsoft Azure?");
// Display the results
foreach (TextCategoriesAnalysis item in result.CategoriesAnalysis)
{
Console.WriteLine($"{item.Category}: {item.Severity}");
}
}
catch (RequestFailedException ex)
{
Console.WriteLine($"Error: {ex.Message}");
}
Diretriz de uso do protocolo e método de conveniência
Embora o SDK do Azure para bibliotecas de clientes .NET forneça a opção de usar métodos de protocolo ou conveniência, priorize o uso de métodos de conveniência na maioria dos cenários. Os métodos de conveniência são projetados para melhorar a experiência de desenvolvimento e fornecer flexibilidade para criar solicitações e lidar com respostas. No entanto, ambos os tipos de método podem ser usados em seu aplicativo conforme necessário. Considere os seguintes critérios ao decidir que tipo de método usar.
Métodos de conveniência:
- Permite que você trabalhe com tipos de resposta e parâmetros de método mais amigáveis.
- Lida com várias preocupações e otimizações de baixo nível para você.
Métodos de protocolo:
- Fornece acesso a tipos de nível inferior, como
RequestContext
eRequestOptions
, que não estão disponíveis por meio de métodos de conveniência. - Habilita o acesso aos recursos das APIs REST subjacentes que os métodos de conveniência não expõem.
- Permite que você crie seus próprios métodos de conveniência em torno de pontos de extremidade de serviço que ainda não têm métodos de conveniência. Essa abordagem requer entender a documentação da API REST do serviço para lidar com solicitações e respostas corretamente.