Você está vendo a documentação do Apigee Edge.
Acesse a
documentação da Apigee X. informações
Sintoma
O aplicativo cliente recebe um código de status HTTP de 500 Internal Server Error
com
o código de erro protocol.http.BadPath
como uma resposta para chamadas de API.
Mensagem de erro
O aplicativo cliente recebe este código de resposta:
HTTP/1.1 500 Internal Server Error
Além disso, talvez você veja a seguinte mensagem de erro:
{ "fault":{ "faultstring":"Invalid request path", "detail":{ "errorcode":"protocol.http.BadPath" } } }
Causas possíveis
Esse erro vai ocorrer se o URL da solicitação do servidor de back-end, representado pela variável de fluxo
target.url
,
tiver um path
que comece com um ponto de interrogação (?
) em vez
de uma barra (/
), que é inválido.
De acordo com as especificações, consulte RFC 3986, seção 3: componentes de sintaxe e RFC 3986, seção 3.3: caminho:
A sintaxe do URI tem os seguintes componentes:
foo://example.com:8042/over/there?name=ferret#nose \_/ \______________/\_________/ \_________/ \__/ | | | | | scheme authority path query fragment
- O componente
path
é obrigatório e PRECISA começar com uma barra (/
) e sempre ter uma barra.
Portanto, se o URL de solicitação do servidor de back-end tiver um componente path
começando
com um ponto de interrogação (?
) em vez de uma barra (/
), o Apigee
Edge responderá com 500 Internal Server Error
e o código de erro
protocol.http.BadPath
.
Por exemplo: se target.url
tiver o valor
https://www.mocktarget.apigee.net?json
, esse erro vai ocorrer porque o
path
é considerado inválido,já que ele começa com um ponto de interrogação
(?
) em vez de uma barra (/
).
Causa | Descrição | Instruções de solução de problemas aplicáveis para |
---|---|---|
O URL do servidor de back-end (target.url) tem um caminho inválido | O componente de caminho no URL do servidor de back-end representado pela variável de fluxo
target.url começa com um ponto de interrogação (? ) em vez de uma
barra (/ ). |
Usuários de nuvens públicas e privadas de borda |
Etapas comuns do diagnóstico
Use uma das seguintes ferramentas/técnicas para diagnosticar esse erro:
Monitoramento de APIs
Procedimento 1: usar o monitoramento de APIs
Para diagnosticar o erro usando o monitoramento de APIs:
- Faça login na interface do Apigee Edge como usuário com um papel apropriado.
Alterne para a organização em que você quer investigar o problema.
- Navegue até a página Analisar > Monitoramento de API > Investigar.
- Selecione o período específico em que você observou os erros.
Trace o Código de falha em relação a Time.
Selecione uma célula com o código de falha
protocol.http.BadPath
, conforme mostrado abaixo:As informações sobre o código de falha
protocol.http.BadPath
são mostradas conforme mostrado abaixo:Clique em Ver registros e expanda a linha da solicitação com falha.
- Na janela Registros, observe os seguintes detalhes:
- Código de status:
500
- Origem da falha:
target
- Código de falha:
protocol.http.BadPath
- Código de status:
- Se a Origem da falha for
target
e o Código de falha forprotocol.http.BadPath
, isso indica que o URL do servidor de back-end tem um caminho inválido.
Trace
Procedimento 2: uso da ferramenta Trace
Para diagnosticar o erro usando a ferramenta Trace:
- Ative a sessão de rastreamento e:
- Aguarde a ocorrência do erro
500 Internal Server Error
ou - Se for possível reproduzir o problema, faça a chamada de API para reproduzi-lo
500 Internal Server Error
- Aguarde a ocorrência do erro
Verifique se a opção Mostrar todos os FlowInfos está ativada:
- Selecione uma das solicitações com falha e examine o rastro.
- Navegue pelas diferentes fases do rastro e localize onde a falha ocorreu.
Você encontrará o erro normalmente em um fluxo após a fase Fluxo de solicitação de destino iniciado , conforme mostrado abaixo:
Observe o valor do erro no trace:
error: caminho da solicitação inválido
Como o erro é gerado pelo Apigee Edge após a fase Fluxo de solicitação de destino iniciado, ele indica que o URL do servidor de back-end tem um caminho inválido. Isso provavelmente acontecerá se a variável de fluxo
target.url
(que representa o URL do servidor de back-end) no Apigee Edge tiver sido atualizada com um caminho inválido por meio de uma das políticas no fluxo de solicitações de destino.- Examine a seção Variáveis lidas e atribuídas em cada um dos fluxos anteriores, partindo do fluxo de erro para a fase Fluxo de solicitação de destino iniciado.
- Determine a política em que a variável de fluxo
target.url
foi atualizada:O rastro de exemplo que mostra a política JavaScript atualizou a variável de fluxo
target.url:
No rastro de exemplo mostrado acima, observe que o valor da variável de fluxo
target.url
é atualizado em uma política JavaScript chamadaJS- SetTargetURL
da seguinte maneira:target.url : https://mocktarget.apigee.net?json
- Observe que o valor em
target.url
tem os seguintes componentes:- esquema:
https
- autoridade:
mocktarget.apigee.net
- caminho:
?json
- esquema:
- Como o componente path começa com um ponto de interrogação (
?
) em vez de uma barra (/
), você recebe o erroInvalid request path
. - Navegue até a fase AX (Dados do Analytics registrados) no rastreamento e clique nela.
Role para baixo até a seção Phase Details - Error Headers e determine os valores de X-Apigee-fault-code e X-Apigee-fault-source, conforme mostrado abaixo:
Você verá os valores de X-Apigee-fault-code e X-Apigee-fault-source como
protocol.http.BadPath
etarget
, respectivamente, indicando que esse erro é causado porque o URL do servidor de back-end tem um caminho inválido.Cabeçalhos de resposta Valor X-Apigee-fault-code protocol.http.BadPath
X-Apigee-fault-source target
NGINX
Procedimento no 3: uso de registros de acesso do NGINX
Para diagnosticar o erro usando os registros de acesso do NGINX:
- Se você for um usuário de nuvem privada, poderá usar os registros de acesso do NGINX para determinar as principais informações sobre o HTTP
500 Internal Server Error
. Verifique os registros de acesso do NGINX:
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log
- Pesquise se há algum erro
500
com o códigoprotocol.http.BadPath
durante um período específico (se o problema tiver acontecido anteriormente) ou se ainda há alguma solicitação com falha com500
. Se você encontrar erros
500
com o X-Apigee-fault-code correspondente ao valor deprotocol.http.BadPath
, determine o valor da X- Apigee-fault-source..Exemplo de erro 500 do registro de acesso do NGINX:
A entrada de amostra acima do registro de acesso do NGINX tem os seguintes valores para X-Apigee- fault-code e X-Apigee-fault-source:
Cabeçalhos Valor X-Apigee-fault-code protocol.http.BadPath
X-Apigee-fault-source target
Observe que os valores de X-Apigee-fault-code e X-Apigee-fault-source, respectivamente, são
protocol.http.BadPath
etarget
, indicando que esse erro é causado porque o URL do servidor de back-end tem um caminho inválido.
Causa: o URL do servidor de back-end (target.url) tem um caminho inválido
Diagnóstico
- Determine o código de falha e a origem da falha de
500 Internal Server Error
usando os registros de acesso do NGINX, da ferramenta de rastreamento ou do Monitoring de API, conforme explicado em Etapas comuns de diagnóstico. - Se o Código de falha for
protocol.http.BadPath
e a Origem da falha tiver o valortarget
, isso indica que o URL do servidor de back-end tem um caminho inválido. O URL do servidor de back-end é representado pela variável de fluxo
target.url
na Apigee Edge. Este erro geralmente ocorre quando você tenta atualizar o URL do servidor de back-end (target.url
) dinamicamente usando qualquer uma das políticas (dentro de proxy/fluxo compartilhado) no fluxo de solicitação de destino, de modo que ele tenha um caminho inválido.Determine se a variável de fluxo
target.url
realmente tem um caminho inválido e a origem do valor usando um dos métodos a seguir:Trace
Como usar a ferramenta Trace
Se você capturou um rastro para esse erro, use as etapas explicadas em Como usar a ferramenta de rastreamento e
- Verifique se
target.url
tem um caminho inválido, ou seja, se ele começa com um ponto de interrogação (?
) em vez de uma barra (/
). Em caso afirmativo, descubra a política que modificou ou atualizou o valor de
target.url
para conter um caminho inválido.O rastro de exemplo que mostra a política JavaScript atualizou a variável de fluxo
target.url
- No exemplo de trace acima, observe que a política de JavaScript modificou ou atualizou o valor de
target.url
para conter um caminho inválido. - Observe que a
target.url
tem os seguintes componentes:- esquema:
https
- autoridade:
mocktarget.apigee.net
- caminho:
?json
O caminho começa com um ponto de interrogação (
?
) em vez de uma barra (/
). Portanto, ele é inválido. - esquema:
Registros
Como usar registros no servidor de registros
- Se você não tiver um trace para esse erro (um problema intermitente), verifique se
você registrou as informações sobre o valor da variável de fluxo
target.url
usando políticas como MessageLogging ou Service callout para o servidor de registros. - Se você tiver os registros, revise-os e
- Verifique se
target.url
tem um caminho inválido. - Tente determinar as informações sobre qual política modificou
target.url
para conter um caminho inválido
- Verifique se
Proxy de API
Como analisar o proxy de API com falha
Se você não tiver um trace ou registros desse erro, analise o proxy de API com falha para determinar o que modificou ou atualizou a variável de fluxo
target.url
para conter um caminho inválido. Verifique os seguintes itens:- A política no proxy de API
- Todos os fluxos compartilhados invocados pelo proxy
- Verifique se
Analise a política específica com atenção (por exemplo, AttributionMessage ou JavaScript) que modifica ou atualiza a variável de fluxo
target.url
e determine a causa da atualização detarget.url
para que ela tenha um caminho inválido.Confira alguns exemplos de políticas que atualizam incorretamente a variável de fluxo
target.url
para conter um caminho inválido que leva a esse erro.Amostra 1
Exemplo 1: atualização da variável
target.url
da política de JavaScriptvar url = "https://mocktarget.apigee.net?json" context.setVariable("target.url", url);
No exemplo acima, observe que a variável de fluxo
target.url
é atualizada com o valorhttps://mocktarget.apigee.net?json
contido em outra variávelurl.
.Observe que o valor do
url
tem os seguintes componentes:- esquema:
https
- autoridade:
mocktarget.apigee.net
- caminho:
?json
O caminho começa com um ponto de interrogação (
?
) em vez de uma barra (/
), que é inválido. Portanto, o Apigee Edge retorna500 Internal Server Error
com o código de erroprotocol.http.BadPath
.Amostra 2
Amostra 2: Política de JavaScript atualizando a variável
target.url
com base no valor no cabeçalho da solicitaçãovar path = context.getVariable("request.header.Path"); var url = "https://mocktarget.apigee.net" + path context.setVariable("target.url", url);
No exemplo acima, observe que a variável de fluxo
target.url
é atualizada ao concatenar o valorhttps://mocktarget.apigee.net
contido em uma variávelurl
e o valor de outra variávelpath
, cujo valor é recuperado derequest.header.Path.
Se você tiver acesso à solicitação ou ao trace real, poderá verificar o valor real transmitido para
request.header.Path
.Exemplo de solicitação feita pelo usuário
curl -v https://HOST_ALIAS/v1/myproxy -H "Authorization: Bearer <token> -H "Path: ?user"
Neste exemplo, o caminho do cabeçalho não é enviado como parte da solicitação. Portanto, o valor da variável
path
na política JavaScript énull
.Portanto:
url = https://mocktarget.apigee.net + path
url = https://mocktarget.apigee.net + "?user"
target.url = https://mocktarget.apigee.net?user
Observe que o valor do
target.url
tem os seguintes componentes:- esquema:
https
- autoridade:
mocktarget.apigee.net
- caminho:
?user
O caminho começa com um ponto de interrogação (
?
) em vez de uma barra (/
), que é inválido. Portanto, o Apigee Edge retorna500 Internal Server Error
com o código de erroprotocol.http.BadPath
.Amostra 3
Exemplo 3: política AttributionMessage atualizando a variável
target.url
<AssignMessage async="false" continueOnError="false" enabled="true" name="AM-SetTargetURL"> <DisplayName>AM-SetTargetURL</DisplayName> <AssignVariable> <Name>target.url</Name> <Value>https://mocktarget.apigee.net?echo</Value> </AssignVariable> <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables> <AssignTo createNew="false" transport="http" type="request"/> </AssignMessage>
Observe que o valor de
url
tem os seguintes componentes:- esquema:
https
- autoridade:
mocktarget.apigee.net
- caminho:
?echo
Novamente neste exemplo, o caminho começa com um ponto de interrogação (
?
) em vez de uma barra (/
), que é inválido. Portanto, o Apigee Edge retorna500 Internal Server Error
com o código de erroprotocol.http.BadPath
.- esquema:
Resolução
De acordo com a especificação do URL
RFC 3986, seção 3: componentes de sintaxe, o componente path
é obrigatório
e PRECISA sempre começar com "/". Siga as etapas abaixo para corrigir esse problema:
- Verifique se o URL do servidor de back-end, representado pela variável de fluxo
target.url
sempre tem um caminho válido e sempre começa com uma barra (/
).- Em alguns casos, pode ser que você não tenha um nome de recurso no caminho. Portanto, verifique se
ele tem pelo menos uma barra (
/
). - Se você usar outras variáveis para determinar o valor da variável de fluxo
target.url
, verifique se outras variáveis não têm um caminho inválido. - Se você executar qualquer operação de string para determinar o valor da variável de fluxo
target.url
, verifique se o resultado ou resultado das operações de string não tem um caminho inválido.
- Em alguns casos, pode ser que você não tenha um nome de recurso no caminho. Portanto, verifique se
ele tem pelo menos uma barra (
Nos exemplos discutidos acima, você pode corrigir esse problema conforme explicado abaixo:
Amostra 1
Exemplo 1: atualização da variável
target.url
da política de JavaScriptUse uma barra (
/
) em vez de um ponto de interrogação (?
) na variávelurl
para corrigir esse problema, conforme mostrado abaixo:var url = "https://mocktarget.apigee.net/json" context.setVariable("target.url", url);
Amostra 2
Amostra 2: Política de JavaScript atualizando a variável
target.url
com base no valor no cabeçalho da solicitaçãovar path = context.getVariable("request.header.Path"); var url = "https://mocktarget.apigee.net" + path context.setVariable("target.url", url);
Transmita um caminho válido, por exemplo,
/user
como parte do cabeçalho da solicitaçãoPath
para corrigir esse problema, conforme mostrado abaixo:Exemplo de solicitação:
curl -v https://HOST_ALIAS/v1/myproxy -H "Authorization: Bearer <token> -H "Path: /user"
Amostra 3
Exemplo 3: política AttributionMessage atualizando a variável
target.url
Adicione um caminho válido no elemento
<Value>
da políticaAssignMessage. Ou seja, substitua o ponto de interrogação (?
) por uma barra (/
) no elemento<Value>
e defina-o comohttps://mocktarget.apigee.net/echo
para corrigir esse problema, conforme mostrado abaixo:<AssignMessage async="false" continueOnError="false" enabled="true" name="AM-SetTargetURL"> <DisplayName>AM-SetTargetURL</DisplayName> <AssignVariable> <Name>target.url</Name> <Value>https://mocktarget.apigee.net/echo</Value> </AssignVariable> <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables> <AssignTo createNew="false" transport="http" type="request"/> </AssignMessage>
Especificação
O Apigee Edge espera que o componente
path
no URL do servidor de back-end PRECISA sempre começar com uma barra (/
) de acordo com as especificações a seguir:Especificação RFC 3986, seção 3: componentes de sintaxe RFC 3986, seção 3.3: caminho Se você ainda precisar de ajuda do suporte da Apigee, acesse Precisa coletar informações de diagnóstico.
É necessário coletar informações de diagnóstico
Se o problema persistir mesmo depois de seguir as instruções acima, colete as informações de diagnóstico a seguir e entre em contato com o suporte do Apigee Edge:
Se você for um usuário da nuvem pública, forneça as seguintes informações:
- Nome da organização
- Nome do ambiente
- Nome do proxy da API
- Completar o comando
curl
usado para reproduzir o500 Internal Server Error
com o código de erroprotocol.http.BadPath
- Arquivo de rastreamento das solicitações de API
Se você for um usuário da nuvem privada, forneça as seguintes informações:
- Concluir a mensagem de erro observada para as solicitações com falha
- Nome do ambiente
- Pacote de proxy de API
- Arquivo de rastreamento das solicitações de API
Registros de acesso do NGINX:
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log
Onde:ORG, ENV e PORT# são substituídos por valores reais.
- Registros do sistema do processador de mensagens
/opt/apigee/var/log/edge-message- processor/logs/system.log
Referências