Vous consultez la documentation d'Apigee Edge.
Consultez la
documentation Apigee X. en savoir plus
Problème constaté
L'application cliente obtient un code d'état HTTP 502 Bad Gateway
avec le code d'erreur protocol.http.ResponseWithBody
comme 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
Il est également possible que l'un des messages d'erreur suivants s'affiche:
{ "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 204 No Content
ou 205 Reset Content
, mais elle contient le corps de la réponse et/ou un ou plusieurs des en-têtes suivants:
Content-Length
Content-Encoding
Transfer-Encoding
Conformément aux spécifications
RFC 7231, section 6.3.5: 204 No Content et
RFC 7231, section 6.3.6: 205 Reset Content, il est normal qu'aucun contenu supplémentaire ne soit envoyé dans le corps 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 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 cas suivants:
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 non nulle) |
ERREUR | ERREUR |
(défini sur compatible avec l'encodage 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 ou en-têtes de la réponse avec la 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 des en-têtes Content-Type , Content-Encoding ou Transfer-Encoding . |
Utilisateurs Edge Public and Private Cloud |
Étapes de diagnostic courantes
Utilisez l'un des outils ou 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 du rôle approprié.
Accédez à l'organisation dans laquelle vous souhaitez examiner le problème.
- Accédez à la page Analyze > API Monitoring > Investigate (Analyser > Surveillance des API > Enquêter).
- Sélectionnez la période spécifique au cours de laquelle vous avez observé les erreurs.
- Tracez le code d'erreur par rapport à l'heure.
Sélectionnez une cellule avec le code d'erreur
protocol.http.ResponseWithBody
, comme indiqué ci-dessous:Vous verrez les informations sur le code d'erreur
protocol.http.ResponseWithBody
comme indiqué ci-dessous:Cliquez sur Afficher les journaux, puis développez la ligne de la requête ayant échoué.
- Dans la fenêtre Journaux, notez les détails suivants :
- Code d'état:
502
- Source de l'erreur:
target
- Code d'erreur:
protocol.http.ResponseWithBody
.
- Code d'état:
- Si la valeur Source d'erreur est
target
et que le Code d'erreur est défini surprotocol.http.ResponseWithBody
, cela signifie que l'erreur s'est produite parce que le serveur backend a envoyé un code d'état204 No Content
ou205 Reset Content
avec le corps de la réponse et/ou l'un des en-têtes mentionnés dans la section Causes possibles.
Outil de traçage
Pour diagnostiquer l'erreur à l'aide de l'outil Trace:
- Activez la session de trace, puis effectuez l'une des opérations suivantes :
- Attendez que l'erreur
502 Bad Gateway
se 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 tous 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 localisez l'origine de l'échec.
L'erreur se produit généralement dans l'erreur
flowinfo
juste après la phase Request sent to target server (Requête envoyée au serveur cible), comme indiqué ci-dessous:Scénario 1
Scénario 1: le serveur backend répond avec un code d'état
204 No Content
contenant un corps de réponse et/ou l'un des en-têtes listés dans Causes possibles.Notez les valeurs des éléments suivants à partir de la trace:
- erreur:
Received 204 Response with message body
- error.class::
com.apigee.rest.framework.BadGateway
Scénario 2
Scénario 2: le serveur backend répond avec un code d'état
204 No Content
contenant un corps de réponse et/ou l'un des en-têtes répertoriés dans Causes possibles.Notez les valeurs des éléments suivants à partir de la trace:
- erreur:
Received 205 Response with message body
- error.class::
com.apigee.rest.framework.BadGateway
- erreur:
- Accédez à la phase AX (Données analytiques enregistrées) dans la trace et cliquez dessus.
Faites défiler la page jusqu'à Détails de la phase, section En-têtes d'erreur et déterminez les valeurs de X-Apigee-fault-code et X-Apigee-fault-source, comme indiqué ci-dessous:
- Notez que les valeurs de X-Apigee-fault-code et de X-Apigee-fault-source
are protocol.http.ResponseWithBody
ettarget
respectivement. Cela indique que l'erreur s'est produite, car le serveur backend a envoyé un code d'état204 No Content
ou205 Reset Content
avec le corps de la réponse et/ou l'un des en-têtes mentionnés dans les causes possibles.Erreur Valeur X-Apigee-fault-code protocol.http.ResponseWithBody
X-Apigee-fault-source target
NGINX
Pour diagnostiquer l'erreur à l'aide des journaux d'accès NGINX, procédez comme suit:
- Si vous êtes un utilisateur du cloud privé, vous pouvez utiliser les journaux d'accès NGINX pour déterminer les informations clés concernant HTTP
502 Bad Gateway
. Vérifiez les journaux d'accès NGINX:
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log
Où:ORG, ENV et PORT# sont remplacés par des valeurs réelles.
- Recherchez s'il existe des erreurs
502
avec le code d'erreurprotocol.http.ResponseWithBody
pendant une durée spécifique (si le problème s'est produit par le passé) ou si des requêtes échouent toujours avec502
. Si vous trouvez des erreurs
502
avec le X-Apigee-fault-code correspondant à la valeur deprotocol.http.ResponseWithBody
, déterminez la valeur de X-Apigee-fault-source.Exemple d'erreur 502 du journal d'accès NGINX:
L'exemple d'entrée ci-dessus du journal d'accès NGINX contient 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.ResponseWithBody
X-Apigee-fault-source target
- Notez que les valeurs de X-Apigee-fault-code et X-Apigee-fault-source sont respectivement
protocol.http.ResponseWithBody
ettarget
. Cela indique que l'erreur s'est produite, car le serveur backend a envoyé un code d'état204 No Content
ou205 Reset Content
avec le corps de la réponse et/ou l'un des en-têtes mentionnés dans les causes possibles.
Cause: corps de la réponse ou en-têtes avec la réponse 204 du serveur backend
Diagnostic
- Déterminez le code d'erreur et la source de l'erreur 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.ResponseWithBody
et que la source d'erreur a la valeurtarget
, cela signifie que le serveur backend a répondu avec un code d'état204 No Content
ou205 Reset Content
avec 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 effectivement 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 de cloud public et que vous pouvez envoyer la même requête API au serveur backend directement à partir de l'un de vos systèmes.
- Si vous êtes un utilisateur du cloud privé, vous pouvez envoyer la même requête API au serveur backend directement à 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 oui, c'est la cause de l'erreur.
Exemple 1
Exemple n° 1: Réponse 204 du serveur backend avec 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 le code d'état
204 No Content
etContent-Encoding: gzip
.Exemple 2
Exemple n° 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 le code d'état
204 No Content
etContent-Length: 48
.Exemple 3
Exemple n° 3: Réponse 205 du serveur backend avec 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 Response
Dans cet exemple, le serveur backend a renvoyé le code d'état
205 Reset Content
avec le corps de la réponseThis is a sample Response.
.- Dans tous les exemples ci-dessus, le serveur backend a envoyé le code d'état
204 No Content
ou205 Reset Content
avec le corps de la réponse et/ou l'un des en-têtes mentionnés dans les causes possibles. - Par conséquent, Apigee Edge a envoyé le code d'état
502 Bad Gateway
avec le code d'erreurprotocol.http.ResponseWithBody
.
Résolution
Assurez-vous que le serveur backend respecte toujours la spécification
RFC 7231, section 6.3.6: 205 Réinitialiser le contenu, lorsque vous envoyez 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 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-Length
Content-Encoding
Transfer-Encoding
Spécification
Apigee Edge renvoie le code d'état 502 Bad Gateway
et le code d'erreur protocol.http.ResponseWithBody
si le serveur backend envoie une réponse 204 No Content
ou 205 Reset Content
, mais ne respecte pas les spécifications RFC suivantes:
Spécification |
---|
RFC 7231, section 6.3.5: 204 Pas de contenu |
RFC 7231, section 6.3.6: 205 Réinitialiser le contenu |
Points clés à noter
La solution recommandée consiste à corriger le serveur backend pour qu'il envoie les codes d'état 204 No Content
et 205 Reset Content
sans corps de réponse ni aucun des en-têtes (Content-Length
, Content-Encoding
et Transfer-Encoding
), et conforme aux spécifications
RFC 7231, section 6.3.5: 204 No Content et
RFC 7231, section 6.3.6: 205 Reset Content.
Si vous avez encore besoin d'aide de l'assistance Apigee, consultez la section Vous devez recueillir 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 de cloud public, fournissez les informations suivantes:
- Le nom de l'organisation.
- Nom de l'environnement
- Nom du proxy d'API
- Complétez la commande
curl
permettant de reproduire l'erreur502
. - Fichier de suivi des requêtes API
Si vous êtes un utilisateur du Private Cloud, fournissez les informations suivantes:
- Message d'erreur complet observé pour les requêtes ayant échoué
- Nom de l'environnement
- Groupe de proxys d'API
- Fichier de suivi des requêtes API
Journaux d'accès NGINX
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log
Où: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