Sie lesen gerade die Dokumentation zu Apigee Edge.
Apigee X-Dokumentation aufrufen info
Symptom
Die Clientanwendung erhält den HTTP-Statuscode 400 Bad Request mit dem Fehlercode messaging.adaptors.http.flow.DecompressionFailureAtRequest als Antwort auf API-Aufrufe.
Fehlermeldung
Die Clientanwendung erhält den folgenden Antwortcode:
HTTP/1.1 400 Bad Request
Außerdem wird möglicherweise eine Fehlermeldung wie die folgende angezeigt:
{
"fault":{
"faultstring":"Decompression failure at request",
"detail":{
"errorcode":"messaging.adaptors.http.flow.DecompressionFailureAtRequest"
}
}
}Mögliche Ursachen
Dieser Fehler tritt nur in folgenden Fällen auf:
- Die im Header
Content-Encodingder HTTP-Anfrage angegebene Codierung ist gültig und wird von Apigee Edge unterstützt. - Das Nutzlastformat, das vom Client als Teil der HTTP-Anfrage gesendet wird, stimmt nicht mit dem im
Content-Encoding-Header angegebenen Codierungsformat überein.
ABER
Das liegt daran, dass Apigee Edge die Nutzlast nicht mit der angegebenen Codierung decodieren kann, da das Format der Nutzlast nicht mit der im Content-Encoding-Header angegebenen Codierung übereinstimmt.
Hier sind einige Beispiele für unterstützte Content-Encoding-Werte und das erwartete Nutzlastformat in diesen Fällen:
| Szenario | Content-Encoding | Erwartetes Nutzlastformat |
|---|---|---|
| Einzelne Codierung | GZIP | Das Unix-Format Weitere Informationen finden Sie unter RFC1952 GZIP Format. |
| Einzelne Codierung | deflate | Dieses Format verwendet die |
| Mehrfachcodierung | Mehrfachcodierung Das kann beispielsweise passieren, wenn die Codierung zweimal erfolgt:
|
Mehrere Codierungen, die in der angegebenen Reihenfolge auf die Nutzlast angewendet werden, wie sie im Header angegeben sind. |
Mögliche Ursachen für diesen Fehler:
| Ursache | Beschreibung | Anleitungen zur Fehlerbehebung gelten für |
|---|---|---|
| Das Format der Anfrage-Nutzlast stimmt nicht mit der im „Content-Encoding“-Header angegebenen Codierung überein. | Das Format der vom Client gesendeten Anfrage-Nutzlast ist entweder nicht codiert oder entspricht nicht der im Content-Encoding-Header angegebenen Codierung. |
Nutzer der Edge Public und Private Cloud |
Allgemeine Diagnoseschritte
Verwenden Sie eines der folgenden Tools oder Verfahren, um diesen Fehler zu diagnostizieren:
API-Monitoring
So diagnostizieren Sie den Fehler mit API Monitoring:
- Bei der Apigee Edge-Benutzeroberfläche anmelden als Nutzer mit einer geeigneten Rolle.
Wechseln Sie zu der Organisation, in der Sie das Problem untersuchen möchten.
- Rufen Sie die Seite Analysieren > API-Monitoring > Untersuchen auf.
- Wählen Sie den Zeitraum aus, in dem die Fehler aufgetreten sind.
- Achten Sie darauf, dass der Filter Proxy auf Alle gesetzt ist.
- Stellen Sie den Fehlercode im Vergleich zur Zeit dar.
Wählen Sie eine Zelle mit dem Fehlercode
messaging.adaptors.http.flow.DecompressionFailureAtRequestaus, wie unten dargestellt:
Informationen zum Fehlercode
messaging.adaptors.http.flow.DecompressionFailureAtRequestwerden wie unten dargestellt angezeigt:
Klicken Sie auf Logs ansehen und maximieren Sie die Zeile, in der der Fehler
400aufgetreten ist.
- Notieren Sie sich im Fenster Logs die folgenden Details:
- Statuscode:
400 - Fehlerquelle:
proxy - Fehlercode:
messaging.adaptors.http.flow.DecompressionFailureAtRequest.
- Statuscode:
- Wenn die Fehlerquelle den Wert
proxyhat, bedeutet das, dass das Format der Anfrage-Nutzlast nicht mit der imContent-Encoding-Header angegebenen unterstützten Codierung übereinstimmt.
Trace-Tool
So diagnostizieren Sie den Fehler mit dem Trace-Tool:
- Aktivieren Sie die Trace-Sitzung und führen Sie einen der folgenden Schritte aus:
- Warten Sie, bis der Fehler
400 Bad Requestauftritt. - Wenn Sie das Problem reproduzieren können, führen Sie den API-Aufruf aus und reproduzieren Sie
400 Bad Request.
- Warten Sie, bis der Fehler
Prüfen Sie, ob Alle FlowInfos anzeigen aktiviert ist:
- Wählen Sie eine der fehlgeschlagenen Anfragen aus und sehen Sie sich den Trace an.
- Navigieren Sie durch die verschiedenen Phasen des Traces und suchen Sie nach der Stelle, an der der Fehler aufgetreten ist.
Normalerweise finden Sie den Fehler in einem Ablauf direkt nach der Phase Request Received from Client (Anfrage vom Client erhalten), wie unten dargestellt:
-
Notieren Sie sich die Werte der Attribute aus dem Trace:
- Fehler:
Decompression failure at request - error.class:
com.apigee.rest.framework.BadRequestException - error.cause:
Not in GZIP format
Im error.cause wird angegeben, dass die Nutzlast der Anfrage NICHT im GZIP-Format vorliegt. Das bedeutet, dass Apigee Edge erwartet hat, dass die Anfragenutzlast im GZIP-Format vorliegt, wie im
Content-Encoding-Header angegeben. - Fehler:
Ermitteln Sie den Wert des Anfrageheaders
Content-Encoding. Rufen Sie dazu die Phase Anfrage vom Kunden erhalten auf, wie unten dargestellt:
Der Wert des Anfrageheaders
Content-Encodingist tatsächlichgzip.Im obigen Beispiel-Trace ist zu sehen, dass die im Anfrageheader
Content-Encodingangegebene Codierunggzipist. Die Anfrage-Nutzlast ist jedoch nicht im GZIP-Format. Daher kann Apigee die Nutzlast nicht mit gzip dekomprimieren und gibt den FehlerDecompression failure at requestzurück.- Notieren Sie sich den Statuscode und die Fehlermeldung, die von Apigee Edge zurückgegeben werden.
bis zur Phase Response Sent to Client (Antwort an Client gesendet) im Trace, wie unten dargestellt:
Beachten Sie die folgenden Details aus dem Trace:
- Statuscode:
400 Bad Request. - Fehlerinhalt:
{"fault":{"faultstring":"Decompression failure at request","detail":{"errorcode":"messaging.adaptors.http.flow.DecompressionFailureAtRequest"}}}
- Statuscode:
Rufen Sie im Trace die Phase AX (Analytics Data Recorded) auf und klicken Sie darauf.
- Scrollen Sie nach unten zum Abschnitt Phasendetails und Fehlerheader und ermitteln Sie die Werte von X-Apigee-fault-code und X-Apigee-fault-source, wie unten dargestellt:
- Die Werte von X-Apigee-fault-code und X-Apigee-fault-source werden als
messaging.adaptors.http.flow.DecompressionFailureAtRequestundpolicyangezeigt. Das bedeutet, dass das Format der Anfragenutzlast nicht mit der imContent-Encoding-Header angegebenen Codierung übereinstimmt.Antwortheader Wert X-Apigee-fault-code messaging.adaptors.http.flow.DecompressionFailureAtRequestX-Apigee-fault-source policy
NGINX
So diagnostizieren Sie den Fehler mithilfe von NGINX-Zugriffslogs:
- Wenn Sie ein Private Cloud-Nutzer sind, können Sie NGINX-Zugriffsprotokolle verwenden, um die wichtigsten Informationen zu HTTP-
400-Fehlern zu ermitteln. NGINX-Zugriffslogs prüfen:
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_logDabei gilt:ORG, ENV und PORT# werden durch tatsächliche Werte ersetzt.
- Suchen Sie nach
400-Fehlern in einem bestimmten Zeitraum (wenn das Problem in der Vergangenheit aufgetreten ist) oder danach, ob bei Anfragen immer noch400-Fehler auftreten. Wenn Sie
400-Fehler mit dem X-Apigee-fault-code finden, der mit dem Wert vonmessaging.adaptors.http.flow.DecompressionFailureAtRequestübereinstimmt, ermitteln Sie den Wert von X-Apigee-fault-source.Beispiel für einen 400-Fehler aus dem NGINX-Zugriffslog:
Der obige Beispiel-Eintrag aus dem NGINX-Zugriffslog hat die folgenden Werte für X-Apigee-fault-code und X-Apigee-fault-source:
Antwortheader Wert X-Apigee-fault-code messaging.adaptors.http.flow.DecompressionFailureAtRequestX-Apigee-fault-source policy
Ursache: Das Format der Anfrage-Nutzlast stimmt nicht mit der im Content-Encoding-Header angegebenen Codierung überein.
Standardmäßig dekomprimiert Apigee Edge die Nutzlast immer, wenn der Anfrageheader Content-Encoding eine gültige und
unterstützte Codierung enthält. Daher wird erwartet, dass das Format der Anfrage-Nutzlast
mit der im Anfrageheader Content-Encoding angegebenen Codierung übereinstimmt.
Wenn es eine Abweichung gibt, wird dieser Fehler angezeigt.
Diagnose
- Ermitteln Sie den Fehlercode und die Fehlerquelle für den beobachteten Fehler mithilfe von API-Monitoring, Trace-Tool oder NGINX-Zugriffsprotokollen, wie in Häufige Diagnoseschritte beschrieben.
- Wenn der Fehlercode
messaging.adaptors.http.flow.DecompressionFailureAtRequestist und die Fehlerquelle den Wertpolicyoderproxyhat, bedeutet dies, dass die von der Clientanwendung gesendete Anfrage eine Nutzlast enthält, die nicht mit der im AnfrageheaderContent-Encodingangegebenen unterstützten Codierung übereinstimmt. Sie können die Abweichung als Teil der HTTP-Anfrage mit einer der folgenden Methoden ermitteln:
Fehlermeldung
So validieren Sie die Inhaberschaft mit der Fehlermeldung:
-
Wenn Sie Zugriff auf die vollständige Fehlermeldung haben, die Sie von Apigee Edge erhalten haben, lesen Sie die Informationen unter
faultstring.Beispiel für eine Fehlermeldung:
"faultstring":"Decompression failure at request"
- In der obigen Fehlermeldung wird
"Decompression failure at request"angezeigt. Das bedeutet, dass die Anfrage nicht mit der im HeaderContent-Encodingangegebenen Codierung dekomprimiert werden konnte.
Trace
So validieren Sie die Ergebnisse mit Trace:
- Ermitteln Sie den Wert des Anfrageheaders Content-Encoding und des Attributs error.cause mit Trace, wie in Häufige Diagnoseschritte beschrieben.
Die Werte aus dem Beispiel-Trace sind:
- Content-Encoding:
gzip - error.cause:
Not in GZIP format
Der Wert im Anfrageheader Content-Encoding ist gzip. Die Anfrage-Nutzlast ist jedoch nicht im GZIP-Format (wie durch error.cause angegeben). Daher antwortet Apigee Edge mit
400 Bad Requestund dem Fehlercodemessaging.adaptors.http.flow.DecompressionFailureAtRequest.- Content-Encoding:
Tatsächliche Anfrage
So validieren Sie die Anfrage:
Wenn Sie Zugriff auf die tatsächliche Anfrage der Clientanwendung haben, führen Sie die folgenden Schritte aus:
- Ermitteln Sie den Wert, der an den Anfrage-Header
Content-Encodingübergeben wird. - Ermitteln Sie das Format der Nutzlast, die als Teil der Anfrage gesendet wird.
Wenn der Wert des
Content-Encoding-Headers in der Liste der unterstützten Codierungen enthalten ist, das Format der Anfrage-Nutzlast jedoch nicht mit der imContent-Encoding-Header angegebenen Codierung übereinstimmt, ist dies die Ursache des Problems.Beispielanfrage:
curl -v "http://HOSTALIAS/v1/testgzip"
-H "Content-Encoding: gzip"-X POST -d @request_payload.zipIn der oben gezeigten Beispielanfrage wird der Wert
gzipan den HeaderContent-Encodinggesendet, der eine unterstützte Codierung in Apigee Edge ist. Die Nutzlast der Anfragerequest_payload.zipist jedoch im ZIP-Format. Daher schlägt diese Anfrage mit dem Statuscode400 Bad Requestund dem Fehlercodemessaging.adaptors.http.flow.DecompressionFailureAtRequestfehl.
Logs des Message Processors
So validieren Sie die Einrichtung anhand von Message Processor-Logs:
Wenn Sie Private Cloud-Nutzer sind, können Sie die Message Processor-Logs verwenden, um die wichtigsten Informationen zu HTTP-
400-Fehlern zu ermitteln.- Ermitteln Sie die Nachrichten-ID der fehlgeschlagenen Anfrage mit API Monitoring, dem Trace-Tool oder NGINX-Zugriffsprotokollen, wie unter Gängige Diagnoseschritte beschrieben.
Suchen Sie im Message Processor-Log nach der Nachrichten-ID:
/opt/apigee/var/log/edge-message-processor/logs/system.logEs wird eine der folgenden Ausnahmen angezeigt:
Szenario 1
Szenario 1: API-Anfrage mit dem Header „Content-Encoding: gzip“
2021-07-28 10:21:16,861 NIOThread@0 ERROR HTTP.SERVER - HTTPServer$Context.onInputException() : Message id:rt-57-1 SSLClientChannel[Accepted: Remote:192.168.199.8:8443 Local:192.168.80.234:44284]@28469 useCount=1 bytesRead=0 bytesWritten=28764 age=2739893ms lastIO=0ms isOpen=true.onExceptionRead exception: {} java.util.zip.ZipException: Not in GZIP format 2021-07-28 10:21:16,862 NIOThread@0 ERROR ADAPTORS.HTTP.FLOW - AbstractRequestListener.onException() : Request:POST, uri:/test, message Id:rt-57-1, exception:java.util.zip.ZipException: Not in GZIP format, context:Context@71ea5ac input=ClientInputChannel(SSLClientChannel[Accepted: Remote:192.168.199.8:8443 Local:192.168.80.234:44284]@28469 useCount=1 bytesRead=0 bytesWritten=28764 age=2739894ms lastIO=0ms isOpen=true) 2021-07-28 10:21:16,862 NIOThread@0 INFO HTTP.SERVICE - ExceptionHandler.handleException() : Exceptionjava.util.zip.ZipException: Not in GZIP formatoccurred while writing to channel null 2021-07-28 10:21:16,863 NIOThread@0 INFO HTTP.SERVICE - ExceptionHandler.handleException() : Exception trace: java.util.zip.ZipException: Not in GZIP formatDie Zeile
java.util.zip.ZipException: Not in GZIP formatin der obigen Fehlermeldung gibt an, dass die Nutzlast der Anfrage nicht im GZIP-Format gesendet wird, obwohlContent-Encodingals gzip angegeben ist. Daher löst Apigee Edge die Ausnahme aus und gibt den Statuscode400mit dem Fehlercodemessaging.adaptors.http.flow.DecompressionFailureAtRequestan Clientanwendungen zurück.Szenario 2
Szenario 2: Wenn die API-Anfrage den Header „Content-Encoding: deflate“ enthält
2021-07-28 15:26:31,893 NIOThread@1 ERROR HTTP.SERVER - HTTPServer$Context.onInputException() : Message id:rt-47875-1 SSLClientChannel[Accepted: Remote:192.168.199.8:8443 Local:192.168.81.72:45954]@29276 useCount=1 bytesRead=0 bytesWritten=37230 age=3498856ms lastIO=1ms isOpen=true.onExceptionRead exception: {}java.util.zip.ZipException: incorrect header check….Caused by: java.util.zip.DataFormatException: incorrect header check.. 2021-07-28 15:26:31,894 NIOThread@1 ERROR ADAPTORS.HTTP.FLOW - AbstractRequestListener.onException() : Request:POST, uri:/test, message Id:rrt-47875-1, exception:java.util.zip.ZipException: incorrect header check, context:Context@69b3ac45 input=ClientInputChannel(SSLClientChannel[Accepted: Remote:192.168.199.8:8443 Local:192.168.81.72:45954]@29276 useCount=1 byt esRead=0 bytesWritten=37230 age=3498856ms lastIO=1ms isOpen=true)Die Zeilen
java.util.zip.ZipException: incorrect header checkundCaused by: java.util.zip.DataFormatException: incorrect header checkin der oben genannten Fehlermeldung weisen darauf hin, dass die Anfrage-Nutzlast nicht im Deflate-Format gesendet wird und nicht mit der imContent-Encoding-Header von Deflate angegebenen Codierung übereinstimmt. Daher löst Apigee Edge die Ausnahme aus und gibt den Statuscode400mit dem Fehlercodemessaging.adaptors.http.flow.DecompressionFailureAtRequestan Clientanwendungen zurück.
-
Auflösung
- Wenn die komprimierte Anfrage-Nutzlast im API-Proxy-Ablauf in Apigee Edge und auf dem Backend-Server nicht benötigt wird, darf der Header
Content-Encodingnicht übergeben werden. Wenn die Nutzlast der Anfrage komprimiert werden muss, fahren Sie mit Schritt 2 fort. - Achten Sie darauf, dass die Clientanwendung immer Folgendes sendet:
- Eine der
unterstützten Codierungen als Wert für den
Content-Encoding-Header in der Anfrage - Die Anfrage-Nutzlast im unterstützten Format für Apigee Edge entspricht dem im
Content-Encoding-Header angegebenen Codierungsformat.
- Eine der
unterstützten Codierungen als Wert für den
- Im oben besprochenen Beispiel ist die Anfrage-Nutzlast im ZIP-Format, im Anfrageheader wird jedoch
Content-Encoding: gzipangegeben. Sie können das Problem beheben, indem Sie den Anfrageheader alsContent-Encoding: gzipund die Anfrage-Nutzlast ebenfalls imgzip-Format senden:curl -v "https://HOSTALIAS/v1/testgzip" -H "Content-Encoding: gzip" -X POST -d @request_payload.gz
Spezifikation
Apigee Edge antwortet mit dem Statuscode 400 Bad Request und dem Fehlercode messaging.adaptors.http.flow.DecompressionFailureAtRequest gemäß den folgenden RFC-Spezifikationen:
| Spezifikation |
|---|
| RFC 7231, Abschnitt 6.5.1 |
| RFC 7231, Abschnitt 3.1.2.2 |
Wenn Sie weiterhin Unterstützung vom Apigee-Support benötigen, gehen Sie zu Erfassen von Diagnoseinformationen erforderlich.
Erfassen von Diagnoseinformationen erforderlich
Sammeln Sie die folgenden Diagnoseinformationen und wenden Sie sich dann an den Apigee Edge-Support:
Wenn Sie ein Public Cloud-Nutzer sind, geben Sie die folgenden Informationen an:
- Name der Organisation
- Name der Umgebung
- Name des API-Proxys
- Vollständiger
curl-Befehl, der zum Reproduzieren des400-Fehlers verwendet wurde - Trace-Datei für die API-Anfragen
Wenn Sie ein Private Cloud-Nutzer sind, geben Sie die folgenden Informationen an:
- Vollständige Fehlermeldung für die fehlgeschlagenen Anfragen
- Name der Umgebung
- API-Proxy-Bundle
- Trace-Datei für die API-Anfragen
NGINX-Zugriffslogs
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_logDabei gilt:ORG, ENV und PORT# werden durch tatsächliche Werte ersetzt.
- Systemprotokolle des Message Processors
/opt/apigee/var/log/edge-message-processor/logs/system.log