Você está lendo a documentação do Apigee Edge.
Acesse a
documentação da Apigee X. info
Sintoma
O aplicativo cliente recebe um código de status HTTP 502 Bad Gateway com o código de erro protocol.http.ResponseWithBody como resposta para chamadas de API.
Mensagem de erro
O aplicativo cliente recebe o seguinte código de resposta:
HTTP/1.1 502 Bad Gateway
Além disso, você pode observar uma das seguintes mensagens de erro:
{
"fault":{
"faultstring":"Received 204 Response with message body",
"detail":{
"errorcode":"protocol.http.ResponseWithBody"
}
}
}{
"fault":{
"faultstring":"Received 205 Response with message body",
"detail":{
"errorcode":"protocol.http.ResponseWithBody"
}
}
}Causas possíveis
Esse erro ocorre se a resposta HTTP do servidor de back-end para o Apigee Edge for
204 No Content ou 205 Reset Content mas contiver o corpo da
resposta e/ou um ou mais dos seguintes cabeçalhos:
Content-LengthContent-EncodingTransfer-Encoding
De acordo com as especificações
RFC 7231, seção 6.3.5: 204 No Content e
RFC 7231, seção 6.3.6: 205 Reset Content, espera-se que nenhum conteúdo adicional
seja enviado como parte do corpo do payload da resposta com o código de status 204 No
Content ou 205 Reset Content pelo servidor de origem. Os cabeçalhos de resposta
como Content-Length, Content-Encoding ou
Transfer-Encoding indicam o tamanho, o tipo ou o formato do payload da resposta.
Portanto, o Apigee Edge retorna um código de status 502 Bad Gateway com o código de erro protocol.http.ResponseWithBody ao cliente nas seguintes circunstâncias:
| Código de status do servidor de back-end | ||
|---|---|---|
| A resposta do servidor de back-end contém | 204 No Content | 205 Reset Content |
| Corpo da resposta | ERRO | ERRO |
Cabeçalho (definido como diferente de zero) |
ERRO | ERRO |
(definido como codificação compatível no Apigee Edge) |
ERRO | NENHUM ERRO |
Transfer-Encoding |
ERRO | ERRO |
Confira as possíveis causas desse erro:
| Causa | Descrição | Instruções de solução de problemas aplicáveis para |
|---|---|---|
| Corpo da resposta ou cabeçalhos com resposta 204 do servidor de back-end | O servidor de back-end envia uma resposta 204 No Content ou 205 Reset Content
com um corpo de resposta e/ou um ou mais cabeçalhos Content-Type,
Content-Encoding ou Transfer-Encoding. |
Usuários da nuvem pública e privada do Edge |
Etapas comuns do diagnóstico
Use uma das seguintes ferramentas/técnicas para diagnosticar esse erro:
Monitoramento de APIs
Para diagnosticar o erro usando o monitoramento de APIs:
- Faça login na interface da Apigee Edge como um usuário com um papel apropriado.
Alterne para a organização em que você quer investigar o problema.
- Acesse a página Analisar > Monitoramento de APIs > Investigar.
- Selecione o período específico em que você observou os erros.
- Trace o código de falha em relação ao tempo.
Selecione uma célula que tenha o código de falha
protocol.http.ResponseWithBodyconforme mostrado abaixo:
As informações sobre o código de falha
protocol.http.ResponseWithBodyserão mostradas conforme 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:
502 - Origem da falha:
target - Código de falha:
protocol.http.ResponseWithBody.
- Código de status:
- Se a origem da falha tiver o valor
targete o código de falha tiver o valorprotocol.http.ResponseWithBody, isso indica que o erro ocorreu porque o servidor de back-end enviou um código de status204 No Contentou205 Reset Contentcom o corpo da resposta e/ou um dos cabeçalhos mencionados na seção Causas possíveis.
Ferramenta Trace
Para diagnosticar o erro usando a ferramenta Trace:
- Ative a sessão de trace
e:
- Aguarde a ocorrência do erro
502 Bad Gateway. ou - Se você puder reproduzir o problema, faça a chamada de API e reproduza o erro
502 Bad Gateway.
- 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 trace.
- Navegue pelas diferentes fases do trace e localize onde a falha ocorreu.
Normalmente, você encontra o erro no
flowinfoerro logo após a fase Solicitação enviada ao servidor de destino, conforme mostrado abaixo:Cenário 1
Cenário 1: o servidor de back-end responde com o código de status
204 No Contentcontendo o corpo da resposta e/ou um dos cabeçalhos listados em Causas possíveis.
Observe os valores do trace:
- erro:
Received 204 Response with message body - error.class:
com.apigee.rest.framework.BadGateway
Cenário 2
Cenário 2: o servidor de back-end responde com o código de status
204 No Contentcontendo o corpo da resposta e/ou um dos cabeçalhos listados em Causas possíveis.
Observe os valores do trace:
- erro:
Received 205 Response with message body - error.class:
com.apigee.rest.framework.BadGateway
- erro:
- Navegue até a fase AX (dados de análise registrados) no trace e clique nela.
Role para baixo até a seção Detalhes da fase, Cabeçalhos de erro e determine os valores de X-Apigee-fault-code e X-Apigee-fault-source conforme mostrado abaixo:
- Observe que os valores de X-Apigee-fault-code e X-Apigee-fault-source
are protocol.http.ResponseWithBodyetarget, respectivamente. Isso indica que o erro ocorreu porque o servidor de back-end enviou um código de status204 No Contentou205 Reset Contentcom o corpo da resposta e/ou um dos cabeçalhos mencionados em Causas possíveis.Erro Valor X-Apigee-fault-code protocol.http.ResponseWithBodyX-Apigee-fault-source target
NGINX
Para diagnosticar o erro usando registros de acesso do NGINX:
- Se você for um usuário da nuvem privada, poderá usar os registros de acesso do NGINX para
determinar as principais informações sobre o HTTP
502 Bad Gateway. Verifique os registros de acesso do NGINX:
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_logEm que: ORG, ENV e PORT# são substituídos por valores reais.
- Pesquise para ver se há erros
502com o código de erroprotocol.http.ResponseWithBodydurante um período específico (se o problema aconteceu no passado) ou se ainda há solicitações com falha com502. Se você encontrar erros
502com o X-Apigee-fault-code correspondente ao valor deprotocol.http.ResponseWithBody, determine o valor do X-Apigee-fault-source.Exemplo de erro 502 do registro de acesso do NGINX:
A entrada de exemplo acima do registro de acesso do NGINX tem os seguintes valores para X- Apigee-fault-code e X-Apigee-fault-source:
Cabeçalhos de resposta Valor X-Apigee-fault-code protocol.http.ResponseWithBodyX-Apigee-fault-source target- Observe que os valores de X-Apigee-fault-code e X-Apigee-fault-source
são
protocol.http.ResponseWithBodyetarget, respectivamente. Isso indica que o erro ocorreu porque o servidor de back-end enviou um código de status204 No Contentou205 Reset Contentcom o corpo da resposta e/ou um dos cabeçalhos mencionados em Causas possíveis.
Causa: corpo da resposta ou cabeçalhos com resposta 204 do servidor de back-end
Diagnóstico
- Determine o código de falha e a origem da falha do erro observado usando o monitoramento de APIs, a ferramenta Trace ou os registros de acesso do NGINX, conforme explicado em Etapas comuns do diagnóstico.
- Se o código de falha for
protocol.http.ResponseWithBodye a origem da falha tiver o valortarget, isso indica que o servidor de back-end respondeu com um código de status204 No Contentou205 Reset Contentcom o corpo da resposta e/ou um dos cabeçalhos mencionados em Causas possíveis. Para validar se o servidor de back-end realmente enviou um corpo de payload de resposta e/ou um ou mais dos cabeçalhos mencionados em Causas possíveis, você pode seguir estas etapas:
Se você for um usuário da nuvem pública e puder fazer a mesma solicitação de API diretamente para o servidor de back-end de qualquer um dos seus sistemas.
- Se você for um usuário da nuvem privada, poderá fazer a mesma solicitação de API diretamente para o servidor de back-end de um dos processadores de mensagens associados à organização e ao ambiente específicos em que a falha é observada.
Analise a resposta recebida do servidor de back-end e verifique se ela contém um corpo de payload de resposta e/ou um ou mais dos cabeçalhos mencionados acima. Em caso afirmativo, essa é a causa do erro.
Exemplo 1
Exemplo 1: resposta do servidor de back-end 204 com cabeçalho Content-Encoding
curl -v "https://BACKEND_SERVER_HOST_NAME/PATH" -H "HEADER: VALUE" -X HTTP_REQUEST_METHOD
… < HTTP/1.1 204 No Content
< Content-Encoding: gzip< Date: Tue, 31 Jul 2021 21:41:13 GMT < Connection: keep-aliveNeste exemplo, o servidor de back-end respondeu com
204 No Contentcódigo de status eContent-Encoding: gzipExemplo 2
Exemplo 2: resposta do servidor de back-end 204 com cabeçalho Content-Length
curl -v "https://BACKEND_SERVER_HOST_NAME/PATH" -H "HEADER: VALUE" -X HTTP_REQUEST_METHOD
… < HTTP/1.1 204 No Content
< Content-Length: 48< Date: Tue, 31 Jul 2021 21:41:13 GMT < Connection: keep-aliveNeste exemplo, o servidor de back-end respondeu com
204 No Contentcódigo de status eContent-Length: 48Exemplo 3
Exemplo 3: resposta do servidor de back-end 205 com corpo de resposta
curl -v "https://BACKEND_SERVER_HOST_NAME/PATH" -H "HEADER: VALUE" -X HTTP_REQUEST_METHOD
… < HTTP/1.1 205 Reset Content < Date: Sat, 31 Jul 2021 17:14:09 GMT < Content-Length: 12 < Content-Type: text/plain; charset=utf-8 < * Connection #0 to host X.X.X.X left intact
This is a sample ResponseNeste exemplo, o servidor de back-end respondeu com
205 Reset Contentcódigo de status com o corpo da respostaThis is a sample Response.- Em todos os exemplos acima, o servidor de back-end enviou
204 No Contentou205 Reset Contentcódigo de status com o corpo da resposta e/ou um dos cabeçalhos mencionados em Causas possíveis. - Portanto, o Apigee Edge enviou
502 Bad Gatewaycódigo de status com código de erroprotocol.http.ResponseWithBody.
Resolução
Verifique se o servidor de back-end sempre segue a especificação
RFC 7231, seção 6.3.6: 205 Reset Content, ao enviar a resposta 204 No Content
ou 205 Reset Content para o Apigee Edge. Ou seja, o servidor de back-end
NÃO DEVE enviar o seguinte como parte de uma 204 No Content ou
205 Reset Content resposta:
- Corpo do payload da resposta
- E qualquer um dos seguintes cabeçalhos:
Content-LengthContent-EncodingTransfer-Encoding
Especificação
O Apigee Edge responde com 502 Bad Gateway código de status e o código de erro
protocol.http.ResponseWithBody se o servidor de back-end enviar uma
204 No Content ou 205 Reset Content resposta, mas
não seguir as seguintes especificações da RFC:
| Especificação |
|---|
| RFC 7231, seção 6.3.5: 204 No Content |
| RFC 7231, seção 6.3.6: 205 Reset Content |
Pontos importantes a serem observados
A solução recomendada é corrigir o servidor de back-end para enviar o código de status 204 No Content
e 205 Reset Content sem o corpo da resposta e qualquer um dos
cabeçalhos: Content-Length, Content-Encoding e
Transfer-Encoding e seguir as especificações
RFC 7231, seção 6.3.5: 204 No Content e
RFC 7231, seção 6.3.6: 205 Reset Content.
Se você ainda precisar de ajuda do suporte da Apigee, acesse Coletar informações de diagnóstico.
É necessário coletar informações de diagnóstico
Reúna as seguintes informações de diagnóstico 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 de API
- Comando
curlcompleto usado para reproduzir o erro502 - Arquivo de trace para as solicitações de API
Se você for um usuário da nuvem privada, forneça as seguintes informações:
- Mensagem de erro completa observada para as solicitações com falha
- Nome do ambiente
- Pacote de proxy de API
- Arquivo de trace para as solicitações de API
Registros de acesso do NGINX
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_logEm que: 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