Vous consultez la documentation Apigee Edge.
Accédez à la
documentation**Apigee X**. info
Problème constaté
L'application cliente reçoit un code d'état HTTP 502 Bad Gateway avec le code d'erreur protocol.http.ResponseWithBody en réponse aux appels d'API.
Message d'erreur
L'application cliente reçoit le code de réponse suivant :
HTTP/1.1 502 Bad Gateway
Vous pouvez également rencontrer l'un des messages d'erreur suivants :
{
"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"
}
}
}Causes possibles
Cette erreur se produit si la réponse HTTP du serveur backend à Apigee Edge est soit
204 No Content ou 205 Reset Content mais qu'elle contient le corps
de la réponse et/ou un ou plusieurs des en-têtes suivants :
Content-LengthContent-EncodingTransfer-Encoding
Conformément aux spécifications
RFC 7231, section 6.3.5 : 204 No Content (en anglais) et
RFC 7231, section 6.3.6 : 205 Reset Content (en anglais), aucun contenu supplémentaire
ne doit être envoyé dans le corps de la charge utile de la réponse avec le code d'état 204 No
Content ou 205 Reset Content par le serveur d'origine. Les en-têtes de réponse
tels que Content-Length, Content-Encoding ou
Transfer-Encoding indiquent la taille, le type ou le format de la charge utile de la réponse.
Par conséquent, Apigee Edge renvoie un code d'état 502 Bad Gateway avec le code d'erreur protocol.http.ResponseWithBody au client dans les circonstances suivantes :
| Code d'état du serveur backend | ||
|---|---|---|
| La réponse du serveur backend contient | 204 Aucun contenu | 205 Réinitialiser le contenu |
| Corps de la réponse | ERREUR | ERREUR |
En-tête (défini sur une valeur différente de zéro) |
ERREUR | ERREUR |
(défini sur un encodage compatible dans Apigee Edge) |
ERREUR | AUCUNE ERREUR |
Transfer-Encoding |
ERREUR | ERREUR |
Voici les causes possibles de cette erreur :
| Cause | Description | Instructions de dépannage applicables |
|---|---|---|
| Corps de la réponse ou en-têtes avec une réponse 204 du serveur backend | Le serveur backend envoie une réponse 204 No Content ou 205 Reset Content
avec un corps de réponse et/ou un ou plusieurs en-têtes Content-Type,
Content-Encoding ou Transfer-Encoding. |
Utilisateurs d'Edge Cloud public et privé |
Étapes de diagnostic courantes
Utilisez l'un des outils/techniques suivants pour diagnostiquer cette erreur :
Surveillance des API
Pour diagnostiquer l'erreur à l'aide de la surveillance des API :
- Connectez-vous à l'interface utilisateur Apigee Edge en tant qu'utilisateur disposant d'un rôle approprié.
Basculez vers l'organisation dans laquelle vous souhaitez examiner le problème.
- Accédez à la page Analyze > API Monitoring > Investigate (Analyser > Surveillance des API > Examiner).
- Sélectionnez la période spécifique au cours de laquelle vous avez observé les erreurs.
- Tracez le code d'erreur par rapport au temps.
Sélectionnez une cellule contenant le code d'erreur
protocol.http.ResponseWithBody, comme illustré ci-dessous :
Les informations sur le code d'erreur
protocol.http.ResponseWithBodys'affichent, comme illustré ci-dessous :
Cliquez sur View logs (Afficher les journaux) et développez la ligne de la requête ayant échoué.
- Dans la fenêtre Logs (Journaux), notez les informations suivantes :
- Code d'état :
502 - Source de l'erreur :
target - Code d'erreur :
protocol.http.ResponseWithBody.
- Code d'état :
- Si la source de l'erreur a la valeur
targetet que le code d'erreur a la valeurprotocol.http.ResponseWithBody, cela indique que l'erreur s'est produite, car le serveur backend a envoyé un code d'état204 No Contentou205 Reset Contentavec le corps de la réponse et/ou l'un des en-têtes mentionnés dans la section Causes possibles.
Outil Trace
Pour diagnostiquer l'erreur à l'aide de l'outil Trace :
- Activez la session de trace
puis :
- attendez que l'erreur
502 Bad Gatewayse produise ; ou - si vous pouvez reproduire le problème, effectuez l'appel d'API et reproduisez l'erreur
502 Bad Gateway.
- attendez que l'erreur
Assurez-vous que l'option Show all FlowInfos (Afficher toutes les FlowInfos) est activée :
- Sélectionnez l'une des requêtes ayant échoué et examinez la trace.
- Parcourez les différentes phases de la trace et identifiez l'endroit où l'échec s'est produit.
L'erreur se trouve généralement dans l'
flowinfoerreur juste après la phase Request sent to target server (Requête envoyée au serveur cible), comme illustré ci-dessous :Scénario 1
Scénario 1 : Le serveur backend répond avec le code d'état
204 No Contentcontenant le corps de la réponse et/ou l'un des en-têtes listés dans Causes possibles.
Notez les valeurs suivantes de la trace :
- error:
Received 204 Response with message body(erreur : ) - error.class:
com.apigee.rest.framework.BadGateway
Scénario 2
Scénario 2 : Le serveur backend répond avec le code d'état
204 No Contentcontenant le corps de la réponse et/ou l'un des en-têtes listés dans Causes possibles.
Notez les valeurs suivantes de la trace :
- error:
Received 205 Response with message body - error.class:
com.apigee.rest.framework.BadGateway
- error:
- Accédez à la phase AX (Analytics Data Recorded, Données d'analyse enregistrées) de la trace et cliquez dessus.
Faites défiler la page jusqu'à la section Phase Details (Détails de la phase), Error Headers (En-têtes d'erreur) et déterminez les valeurs de X-Apigee-fault-code et X-Apigee-fault-source , comme illustré ci-dessous :
- Notez que les valeurs de X-Apigee-fault-code et X-Apigee-fault-source
are protocol.http.ResponseWithBodyettargetrespectivement. Cela indique que l'erreur s'est produite, car le serveur backend a envoyé un204 No Contentou205 Reset Contentcode d'état avec le corps de la réponse et/ou l'un des en-têtes mentionnés dans Causes possibles.Erreur Valeur X-Apigee-fault-code protocol.http.ResponseWithBodyX-Apigee-fault-source target
NGINX
Pour diagnostiquer l'erreur à l'aide des journaux d'accès NGINX :
- Si vous êtes un utilisateur du cloud privé, vous pouvez utiliser les journaux d’accès NGINX pour
déterminer les informations clés sur l’erreur HTTP
502 Bad Gateway. Vérifiez les journaux d'accès NGINX :
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_logOù : ORG, ENV et PORT# sont remplacés par des valeurs réelles.
- Recherchez les erreurs
502avec le code d'erreurprotocol.http.ResponseWithBodypendant une durée spécifique (si le problème s'est produit dans le passé) ou si des requêtes échouent toujours avec502. Si vous trouvez des erreurs
502avec le X-Apigee-fault-code correspondant à la valeur deprotocol.http.ResponseWithBody, déterminez la valeur de X-Apigee-fault-source.Exemple d'erreur 502 dans le journal d'accès NGINX :
L'entrée d'exemple ci-dessus du journal d'accès NGINX comporte les valeurs suivantes pour X- Apigee-fault-code et X-Apigee-fault-source :
En-têtes de réponse Valeur X-Apigee-fault-code protocol.http.ResponseWithBodyX-Apigee-fault-source target- Notez que les valeurs de X-Apigee-fault-code et X-Apigee-fault-source
sont respectivement
protocol.http.ResponseWithBodyettarget. Cela indique que l'erreur s'est produite, car le serveur backend a envoyé un204 No Contentou205 Reset Contentcode d'état avec le corps de la réponse et/ou l'un des en-têtes mentionnés dans Causes possibles.
Cause : Corps de la réponse ou en-têtes avec une réponse 204 du serveur backend
Diagnostic
- Déterminez le code d'erreur et la source de l'erreur observée à l'aide de la surveillance des API, de l'outil Trace ou des journaux d'accès NGINX, comme expliqué dans la section Étapes de diagnostic courantes.
- Si le code d'erreur est
protocol.http.ResponseWithBodyet que la source de l'erreur a la valeurtarget, cela indique que le serveur backend a répondu avec un code d'état204 No Contentou205 Reset Contentavec le corps de la réponse et/ou l'un des en-têtes mentionnés dans Causes possibles. Pour vérifier si le serveur backend a bien envoyé un corps de charge utile de réponse et/ou un ou plusieurs des en-têtes mentionnés dans Causes possibles, vous pouvez procéder comme suit :
Si vous êtes un utilisateur du cloud public et que vous pouvez effectuer la même requête API directement auprès du serveur backend à partir de l'un de vos systèmes.
- Si vous êtes un utilisateur du cloud privé, vous pouvez effectuer la même requête API directement auprès du serveur backend à partir de l'un des processeurs de messages associés à l'organisation et à l'environnement spécifiques dans lesquels l'échec est observé.
Examinez la réponse reçue du serveur backend et vérifiez qu'elle contient un corps de charge utile de réponse et/ou un ou plusieurs des en-têtes mentionnés ci-dessus. Si c'est le cas, il s'agit de la cause de cette erreur.
Exemple 1
Exemple 1 : Réponse 204 du serveur backend avec l'en-tête 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-aliveDans cet exemple, le serveur backend a répondu avec
204 No Contentcode d'état etContent-Encoding: gzipExemple 2
Exemple 2 : Réponse 204 du serveur backend avec l'en-tête 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-aliveDans cet exemple, le serveur backend a répondu avec
204 No Contentcode d'état etContent-Length: 48Exemple 3
Exemple 3 : Réponse 205 du serveur backend avec le corps de la réponse
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 ResponseDans cet exemple, le serveur backend a répondu avec
205 Reset Contentcode d'état avec le corps de la réponseThis is a sample Response.- Dans tous les exemples ci-dessus, le serveur backend a envoyé
204 No Contentou205 Reset Contentcode d'état avec le corps de la réponse et/ou l'un des en-têtes mentionnés dans Causes possibles. - Par conséquent, Apigee Edge a envoyé le code d'état
502 Bad Gatewayavec le code d'erreurprotocol.http.ResponseWithBody.
Solution
Assurez-vous que le serveur backend respecte toujours les spécifications
RFC 7231, section 6.3.6 : 205 Reset Content (en anglais) lors de l'envoi de la réponse 204 No Content
ou 205 Reset Content à Apigee Edge. Autrement dit, le serveur backend
NE DOIT PAS envoyer les éléments suivants dans le cadre d'une réponse 204 No Content ou
205 Reset Content :
- Corps de la charge utile de la réponse
- Et l'un des en-têtes suivants :
Content-LengthContent-EncodingTransfer-Encoding
Spécification
Apigee Edge répond avec 502 Bad Gateway code d'état et le code d'erreur
protocol.http.ResponseWithBody si le serveur backend envoie une
204 No Content ou 205 Reset Content réponse, mais
ne respecte pas les spécifications RFC suivantes :
| Spécification |
|---|
| RFC 7231, section 6.3.5 : 204 No Content (en anglais) |
| RFC 7231, section 6.3.6 : 205 Reset Content (en anglais) |
Points importants à retenir
La solution recommandée consiste à corriger le serveur backend pour qu'il envoie le code d'état 204 No Content
et 205 Reset Content sans corps de réponse et sans aucun des
en-têtes (Content-Length, Content-Encoding et
Transfer-Encoding), et à respecter les spécifications
RFC 7231, section 6.3.5 : 204 No Content (en anglais) et
RFC 7231, section 6.3.6 : 205 Reset Content (en anglais).
Si vous avez encore besoin d'aide de la part de l'assistance Apigee, consultez la section Vous devez collecter des informations de diagnostic.
Vous devez collecter des informations de diagnostic
Rassemblez les informations de diagnostic suivantes, puis contactez l'assistance Apigee Edge :
Si vous êtes un utilisateur du cloud public, fournissez les informations suivantes :
- Nom de l'organisation
- Nom de l'environnement
- Nom du proxy d'API
- Commande
curlcomplète utilisée pour reproduire l'erreur502 - Fichier de trace pour les requêtes API
Si vous êtes un utilisateur du cloud privé, fournissez les informations suivantes :
- Message d'erreur complet observé pour les requêtes ayant échoué
- Nom de l'environnement
- Bundle de proxy d'API
- Fichier de trace pour les requêtes API
Journaux d'accès NGINX
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_logOù : ORG, ENV et PORT# sont remplacés par des valeurs réelles.
- Journaux système du processeur de messages
/opt/apigee/var/log/edge-message-processor/logs/system.log