Tratamento de erro em políticas de Gerenciamento de API
APLICA-SE A: todas as camadas do Gerenciamento de API
Ao fornecer um objeto ProxyError
, o Gerenciamento de API do Azure permite que os editores respondam a condições de erro que podem ocorrer durante o processamento de solicitações. O objeto ProxyError
é acessado por meio da propriedade context.LastError e pode ser usado por políticas na seção da política on-error
. Este artigo fornece uma referência para os recursos de tratamento de erro no Gerenciamento de API do Azure.
Tratamento de erro no Gerenciamento de API
As políticas no Gerenciamento de API do Azure são divididas nas seções inbound
, backend
, outbound
e on-error
conforme mostrado no exemplo a seguir.
<policies>
<inbound>
<!-- statements to be applied to the request go here -->
</inbound>
<backend>
<!-- statements to be applied before the request is
forwarded to the backend service go here -->
</backend>
<outbound>
<!-- statements to be applied to the response go here -->
</outbound>
<on-error>
<!-- statements to be applied if there is an error
condition go here -->
</on-error>
</policies>
Durante o processamento de uma solicitação, as etapas internas são executadas junto com as políticas, que estão no escopo da solicitação. Se ocorre um erro, o processamento imediatamente salta para a seção da política on-error
.
A seção de política on-error
pode ser usada em qualquer escopo. Os editores de API podem configurar um comportamento personalizado, como registrar o erro para hubs de eventos ou criar uma nova resposta para retornar ao chamador.
Observação
A seção on-error
não está presente nas políticas por padrão. Para adicionar a seção on-error
a uma política, navegue até a política desejada no editor de políticas e adicione-a. Para informações sobre como configurar políticas, consulte Políticas do Gerenciamento de API.
Se não houver nenhuma seção on-error
, os chamadores receberão mensagens de resposta HTTP 400 ou 500 se ocorrer uma condição de erro.
Políticas permitidas em caso de erro
As políticas a seguir podem ser usadas na seção da política on-error
.
- choose
- set-variable
- find-and-replace
- return-response
- set-header
- set-method
- set-status
- send-request
- send-one-way-request
- log-to-eventhub
- json-to-xml
- xml-to-json
- limit-concurrency
- mock-response
- retry
- rastreamento
lastError
Quando ocorre um erro e o controle salta para a seção de política on-error
, o erro é armazenado na propriedade context.LastError, que pode ser acessada por políticas na seção on-error
. LastError tem as propriedades a seguir.
Nome | Tipo | Descrição | Obrigatório |
---|---|---|---|
Source |
string | Indica o elemento em que ocorreu o erro. Pode ser o nome de uma etapa do pipeline interno ou política. | Sim |
Reason |
string | Código de erro amigável para computadores, que pode ser usado no tratamento de erro. | Não |
Message |
string | Descrição de erro legível por humanos. | Sim |
Scope |
string | Nome do escopo em que o erro ocorreu. | Não |
Section |
string | Nome da seção em que ocorreu o erro. Valores possíveis: "inbound", "backend", "outbound" ou "on-error". | Não |
Path |
string | Especifica hierarquia de políticas aninhadas, por exemplo "choose[3]/when[2]". Várias instâncias de uma política aninhada são indexadas a partir de 1. | Não |
PolicyId |
string | O valor do atributo id , se especificado pelo cliente, na política em que ocorreu o erro |
Não |
Dica
É possível acessar o código de status por meio de context.Response.StatusCode.
Observação
Todas as políticas têm um atributo id
opcional que pode ser adicionado ao elemento raiz da política. Se esse atributo estiver presente em uma política quando ocorrer uma condição de erro, o valor do atributo poderá ser recuperado usando a propriedade context.LastError.PolicyId
.
Erros predefinidos para etapas internas
Os erros a seguir são predefinidos para condições de erro que podem ocorrer durante a avaliação das etapas de processamento interno.
Fonte | Condição | Motivo | Mensagem |
---|---|---|---|
configuração | O Uri não corresponde a nenhuma API ou Operação | OperationNotFound | Não é possível corresponder a solicitação recebida a uma operação. |
autorização | Chave de assinatura não fornecida | SubscriptionKeyNotFound | Acesso negado devido à ausência da chave de assinatura. Certifique-se de incluir a chave de assinatura ao fazer solicitações para esta API. |
autorização | O valor chave e assinatura é inválido | SubscriptionKeyInvalid | Acesso negado devido à chave de assinatura inválida. Certifique-se de fornecer uma chave válida para uma assinatura ativa. |
multiple | A conexão downstream (de um cliente para um gateway de Gerenciamento de API) foi anulada pelo cliente enquanto a solicitação estava pendente | ClientConnectionFailure | multiple |
multiple | A conexão upstream (de um gateway de Gerenciamento de API para um serviço de back-end) não foi estabelecida ou foi anulada pelo back-end | BackendConnectionFailure | multiple |
multiple | Uma exceção de tempo de execução ocorreu durante a avaliação de uma expressão específica | ExpressionValueEvaluationFailure | multiple |
Erros predefinidos para políticas
Os erros a seguir são predefinidos para condições de erro que podem ocorrer durante a avaliação da política.
Fonte | Condição | Motivo | Mensagem |
---|---|---|---|
rate-limit | Limite de taxa excedido | RateLimitExceeded | O limite da taxa foi excedido |
quota | Cota excedida | QuotaExceeded | Fora da cota do volume de chamada. A cota será reposta em xx:xx:xx. – ou – Sem cota de largura de banda. A cota será reposta em xx:xx:xx. |
jsonp | O valor do parâmetro de retorno de chamada é inválido (contém caracteres errados) | CallbackParameterInvalid | O valor do parâmetro de retorno de chamada {callback-parameter-name} não é um identificador JavaScript válido. |
ip-filter | Falha ao analisar o IP do chamador da solicitação | FailedToParseCallerIP | Falha ao estabelecer o endereço IP para o chamador. Acesso negado. |
ip-filter | O IP do chamador não está na lista de permissões | CallerIpNotAllowed | O endereço IP do chamador {ip-address} não é permitido. Acesso negado. |
ip-filter | O IP do chamador está na lista de bloqueios | CallerIpBlocked | O endereço IP do chamador está bloqueado. Acesso negado. |
check-header | O cabeçalho necessário não é apresentado ou o valor está ausente | HeaderNotFound | O cabeçalho {header-name} não foi encontrado na solicitação. Acesso negado. |
check-header | O cabeçalho necessário não é apresentado ou o valor está ausente | HeaderValueNotAllowed | O valor do cabeçalho {header-name} de {header-value} não é permitido. Acesso negado. |
validate-jwt | O token Jwt está ausente na solicitação | TokenNotPresent | JWT não presente. |
validate-jwt | Falha na validação da assinatura | TokenSignatureInvalid | <mensagem da biblioteca jwt> Acesso negado. |
validate-jwt | Público-alvo inválido | TokenAudienceNotAllowed | <mensagem da biblioteca jwt> Acesso negado. |
validate-jwt | Emissor inválido | TokenIssuerNotAllowed | <mensagem da biblioteca jwt> Acesso negado. |
validate-jwt | Token expirado | TokenExpired | <mensagem da biblioteca jwt> Acesso negado. |
validate-jwt | A chave de assinatura não foi resolvida pela ID | TokenSignatureKeyNotFound | <mensagem da biblioteca jwt>. Acesso negado. |
validate-jwt | As declarações necessárias estão ausentes no token | TokenClaimNotFound | O token JWT não tem as seguintes declarações: <c1>, <c2>, … Acesso negado. |
validate-jwt | Incompatibilidade de valores de declaração | TokenClaimValueNotAllowed | O valor da declaração {claim-name} de {claim-value} não é permitido. Acesso negado. |
validate-jwt | Outras falhas de validação | JwtInvalid | <mensagem da biblioteca jwt> |
forward-request ou send-request | Os cabeçalhos e o código de status de resposta HTTP não foram recebidos do back-end dentro do tempo limite configurado | Tempo limite | multiple |
Exemplo
Configurando uma política de API para:
<policies>
<inbound>
<base />
</inbound>
<backend>
<base />
</backend>
<outbound>
<base />
</outbound>
<on-error>
<set-header name="ErrorSource" exists-action="override">
<value>@(context.LastError.Source)</value>
</set-header>
<set-header name="ErrorReason" exists-action="override">
<value>@(context.LastError.Reason)</value>
</set-header>
<set-header name="ErrorMessage" exists-action="override">
<value>@(context.LastError.Message)</value>
</set-header>
<set-header name="ErrorScope" exists-action="override">
<value>@(context.LastError.Scope)</value>
</set-header>
<set-header name="ErrorSection" exists-action="override">
<value>@(context.LastError.Section)</value>
</set-header>
<set-header name="ErrorPath" exists-action="override">
<value>@(context.LastError.Path)</value>
</set-header>
<set-header name="ErrorPolicyId" exists-action="override">
<value>@(context.LastError.PolicyId)</value>
</set-header>
<set-header name="ErrorStatusCode" exists-action="override">
<value>@(context.Response.StatusCode.ToString())</value>
</set-header>
<base />
</on-error>
</policies>
e enviar uma solicitação não autorizada resultará na resposta a seguir:
Conteúdo relacionado
Para obter mais informações sobre como trabalhar com políticas, consulte:
- Tutorial: Transformar e proteger sua API
- Referência de Política para uma lista completa das instruções de política e suas configurações
- Expressões de política
- Definir ou editar políticas
- Reutilizar configurações de política
- Repositório de snippets de política
- Kit de ferramentas de políticas do Gerenciamento de API do Azure
- Criar políticas usando o Microsoft Copilot no Azure