Wyświetlasz dokumentację Apigee Edge.
Otwórz dokumentację Apigee X. info
Krótki opis problemu
W odpowiedzi na wywołania interfejsu API aplikacja kliencka otrzymuje kod stanu HTTP 400 Bad Request z kodem błędu messaging.adaptors.http.flow.DecompressionFailureAtRequest .
Komunikat o błędzie
Aplikacja kliencka otrzymuje ten kod odpowiedzi:
HTTP/1.1 400 Bad Request
Może też pojawić się komunikat o błędzie podobny do tego poniżej:
{
"fault":{
"faultstring":"Decompression failure at request",
"detail":{
"errorcode":"messaging.adaptors.http.flow.DecompressionFailureAtRequest"
}
}
}Możliwe przyczyny
Ten błąd występuje tylko wtedy, gdy:
- Kodowanie określone w nagłówku żądania HTTP
Content-Encodingjest prawidłowe i obsługiwane przez Apigee Edge. - Format ładunku wysłanego przez klienta w ramach żądania HTTP nie jest zgodny z formatem kodowania określonym w nagłówku
Content-Encoding.
BUT
Dzieje się tak, ponieważ Apigee Edge nie może zdekodować ładunku przy użyciu określonego kodowania, ponieważ format ładunku nie jest taki sam jak kodowanie określone w nagłówku Content-Encoding.
Oto kilka przykładów obsługiwanych wartości Content-Encoding i oczekiwanego formatu ładunku w Apigee Edge:
| Scenariusz | Content-Encoding | Oczekiwany format ładunku |
|---|---|---|
| Pojedyncze kodowanie | gzip | Format Unix Zobacz RFC1952 GZIP Format. |
| Pojedyncze kodowanie | spuszczać powietrze, | Ten format używa struktury |
| Wiele kodowań | Wiele kodowań Na przykład w przypadku dwukrotnego kodowania może to być:
|
Wielokrotne kodowanie zastosowane do ładunku w podanej kolejności, w jakiej występuje w nagłówku. |
Możliwe przyczyny tego błędu:
| Przyczyna | Opis | Instrukcje rozwiązywania problemów dotyczące |
|---|---|---|
| Format ładunku żądania nie pasuje do kodowania określonego w nagłówku Content-Encoding | Format ładunku żądania wysłanego przez klienta nie jest zakodowany lub nie jest zgodny z kodowaniem określonym w nagłówku Content-Encoding. |
Użytkownicy publicznej i prywatnej chmury Edge |
Typowe etapy diagnostyki
Aby zdiagnozować ten błąd, użyj jednego z tych narzędzi lub technik:
Monitorowanie interfejsów API
Aby zdiagnozować błąd za pomocą monitorowania interfejsu API:
- Zaloguj się w interfejsie Apigee Edge jako użytkownik z odpowiednią rolą.
Przełącz się na organizację, w której chcesz zbadać problem.
- Otwórz stronę Analiza > Monitorowanie interfejsu API > Zbadaj.
- Wybierz konkretny przedział czasowy, w którym wystąpiły błędy.
- Sprawdź, czy filtr Proxy jest ustawiony na Wszystkie.
- Wykreśl kod błędu na osi czasu.
Wybierz komórkę z kodem błędu
messaging.adaptors.http.flow.DecompressionFailureAtRequest, jak pokazano poniżej:
Informacje o kodzie błędu
messaging.adaptors.http.flow.DecompressionFailureAtRequestsą wyświetlane w sposób pokazany poniżej:
Kliknij Wyświetl logi i rozwiń wiersz, w którym wystąpił błąd
400.
- W oknie Dzienniki zanotuj te informacje:
- Kod stanu:
400 - Źródło błędu:
proxy - Kod błędu:
messaging.adaptors.http.flow.DecompressionFailureAtRequest.
- Kod stanu:
- Jeśli pole Fault Source ma wartość
proxy, oznacza to, że format ładunku żądania nie jest zgodny z obsługiwanym kodowaniem określonym w nagłówkuContent-Encoding.
Narzędzie śledzenia
Aby zdiagnozować błąd za pomocą narzędzia Trace:
- Włącz śledzenie sesji i wybierz jedną z tych opcji:
- Poczekaj na wystąpienie błędu
400 Bad Requestlub - Jeśli możesz odtworzyć problem, wykonaj wywołanie interfejsu API i odtwórz
400 Bad Request.
- Poczekaj na wystąpienie błędu
Sprawdź, czy opcja Pokaż wszystkie informacje o przepływach jest włączona:
- Wybierz jedno z nieudanych żądań i sprawdź ślad.
- Przeglądaj różne fazy śledzenia i sprawdź, gdzie wystąpił błąd.
Błąd zwykle występuje w procesie bezpośrednio po fazie Otrzymano prośbę od klienta, jak pokazano poniżej:
-
Zanotuj wartości właściwości ze śladu:
- Błąd:
Decompression failure at request - error.class:
com.apigee.rest.framework.BadRequestException - error.cause:
Not in GZIP format
Pole error.cause wskazuje, że ładunek żądania NIE jest w formacie GZIP. Oznacza to, że Apigee Edge oczekiwało, że ładunek żądania będzie w formacie GZIP, ponieważ zostałoby to określone w nagłówku
Content-Encoding. - Błąd:
Określ wartość nagłówka żądania
Content-Encoding. W tym celu przejdź do etapu Request Received from Client (Prośba otrzymana od klienta), jak pokazano poniżej:
Zwróć uwagę, że wartość nagłówka żądania
Content-Encodingtogzip.Powyższy przykładowy ślad pokazuje, że kodowanie określone w nagłówku żądania
Content-Encodingtogzip, ale ładunek żądania nie jest w formacie GZIP. Dlatego Apigee nie może zdekompresować ładunku za pomocą gzip i zwraca błądDecompression failure at request.- Zanotuj kod stanu i komunikat o błędzie zwrócony przez Apigee Edge. Aby to zrobić:
do fazy Odpowiedź wysłana do klienta w śladzie, jak pokazano poniżej:
Zanotuj te informacje ze śladu:
- Kod stanu:
400 Bad Request. - Treść błędu:
{"fault":{"faultstring":"Decompression failure at request","detail":{"errorcode":"messaging.adaptors.http.flow.DecompressionFailureAtRequest"}}}
- Kod stanu:
Otwórz fazę AX (Analytics Data Recorded) w śladzie i kliknij ją.
- Przewiń w dół do sekcji Szczegóły fazy i Nagłówki błędów i określ wartości X-Apigee-fault-code i X-Apigee-fault-source, jak pokazano poniżej:
- Wartości X-Apigee-fault-code i X-Apigee-fault-source
będą miały postać
messaging.adaptors.http.flow.DecompressionFailureAtRequestipolicy, co oznacza, że format ładunku żądania nie odpowiada kodowaniu określonemu w nagłówkuContent-Encoding.Nagłówki odpowiedzi Wartość X-Apigee-fault-code messaging.adaptors.http.flow.DecompressionFailureAtRequestX-Apigee-fault-source policy
NGINX
Aby zdiagnozować błąd za pomocą dzienników dostępu NGINX:
- Jeśli jesteś użytkownikiem chmury prywatnej, możesz używać dzienników dostępu NGINX do określania kluczowych informacji o błędach HTTP
400. Sprawdź logi dostępu NGINX:
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_logGdzie: ORG, ENV i PORT# są zastępowane rzeczywistymi wartościami.
- Sprawdź, czy w określonym czasie wystąpiły jakieś
400błędy (jeśli problem pojawił się w przeszłości) lub czy nadal występują nieudane żądania z kodem400. Jeśli znajdziesz błędy
400z wartością X-Apigee-fault-code równąmessaging.adaptors.http.flow.DecompressionFailureAtRequest, określ wartość X-Apigee-fault-source.Przykładowy błąd 400 z dziennika dostępu NGINX:
Powyższy przykładowy wpis z dziennika dostępu NGINX zawiera te wartości atrybutów X-Apigee-fault-code i X-Apigee-fault-source:
Nagłówki odpowiedzi Wartość X-Apigee-fault-code messaging.adaptors.http.flow.DecompressionFailureAtRequestX-Apigee-fault-source policy
Przyczyna: format ładunku żądania nie jest zgodny z kodowaniem określonym w nagłówku Content-Encoding.
Domyślnie Apigee Edge zawsze dekompresuje ładunek, jeśli nagłówek żądania Content-Encoding zawiera prawidłowe i
obsługiwane kodowanie. Oczekuje się więc, że format ładunku żądania będzie zgodny z kodowaniem określonym w nagłówku żądania Content-Encoding.
Jeśli wystąpi niezgodność, pojawi się ten błąd.
Diagnostyka
- Określ kod błędu i źródło błędu zaobserwowanego błędu, korzystając z monitorowania interfejsu API, narzędzia do śledzenia lub logów dostępu NGINX, zgodnie z opisem w typowych krokach diagnostycznych.
- Jeśli kod błędu to
messaging.adaptors.http.flow.DecompressionFailureAtRequest, a źródło błędu ma wartośćpolicylubproxy, oznacza to, że żądanie wysłane przez aplikację kliencką zawiera ładunek, który nie pasuje do obsługiwanego kodowania określonego w nagłówku żądaniaContent-Encoding. Niezgodność możesz określić w ramach żądania HTTP, korzystając z jednej z tych metod:
Komunikat o błędzie
Aby sprawdzić poprawność za pomocą komunikatu o błędzie:
-
Jeśli masz dostęp do pełnego komunikatu o błędzie otrzymanego z Apigee Edge, zapoznaj się z
faultstring.Przykładowy komunikat o błędzie:
"faultstring":"Decompression failure at request"
- W powyższym komunikacie o błędzie wyświetla się
"Decompression failure at request", co oznacza, że żądania nie można zdekompresować przy użyciu kodowania określonego w nagłówkuContent-Encoding.
Śledzenie
Aby sprawdzić poprawność za pomocą śladu:
- Określ wartość nagłówka żądania Content-Encoding i właściwości error.cause za pomocą Trace zgodnie z opisem w artykule Typowe kroki diagnostyczne.
Wartości z przykładowego śledzenia są następujące:
- Content-Encoding:
gzip - error.cause:
Not in GZIP format
Wartość w nagłówku żądania Content-Encoding to gzip, jednak ładunek żądania nie jest w formacie GZIP (co wskazuje error.cause). Dlatego Apigee Edge odpowiada kodem
400 Bad Requesti kodem błędumessaging.adaptors.http.flow.DecompressionFailureAtRequest.- Content-Encoding:
Rzeczywista prośba
Aby sprawdzić poprawność za pomocą rzeczywistego żądania:
Jeśli masz dostęp do rzeczywistego żądania wysłanego przez aplikację klienta, wykonaj te czynności:
- Określ wartość przekazaną do nagłówka żądania
Content-Encoding. - Określ format ładunku wysyłanego w ramach żądania.
Jeśli wartość nagłówka
Content-Encodingznajduje się na liście obsługiwanych kodowań, ale format ładunku żądania nie jest zgodny z kodowaniem określonym w nagłówkuContent-Encoding, to jest to przyczyną problemu.Przykładowe żądanie:
curl -v "http://HOSTALIAS/v1/testgzip"
-H "Content-Encoding: gzip"-X POST -d @request_payload.zipW podanym wyżej przykładowym żądaniu wartość
gzipjest wysyłana do nagłówkaContent-Encoding, który jest obsługiwanym kodowaniem w Apigee Edge. Jednak ładunek żądaniarequest_payload.zipjest w formacie ZIP. Dlatego to żądanie kończy się niepowodzeniem i zwraca kod stanu400 Bad Requestoraz kod błędumessaging.adaptors.http.flow.DecompressionFailureAtRequest.
Dzienniki procesora komunikatów
Aby przeprowadzić weryfikację za pomocą logów procesora komunikatów:
Jeśli jesteś użytkownikiem chmury prywatnej, możesz użyć logów procesora komunikatów, aby określić kluczowe informacje o błędach HTTP
400.- Określ identyfikator wiadomości żądania, które się nie powiodło, za pomocą narzędzia do monitorowania interfejsu API, narzędzia śledzenia lub dzienników dostępu NGINX zgodnie z opisem w artykule Typowe czynności diagnostyczne.
Wyszukaj identyfikator wiadomości w logu procesora komunikatów:
/opt/apigee/var/log/edge-message-processor/logs/system.logZobaczysz jeden z tych wyjątków:
Scenariusz 1
Scenariusz 1. Gdy żądanie do interfejsu API zawiera nagłówek 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 formatWiersz
java.util.zip.ZipException: Not in GZIP formatw powyższym komunikacie o błędzie wskazuje, że ładunek żądania nie jest wysyłany w formacie GZIP, mimo żeContent-Encodingjest określony jako gzip. Dlatego Apigee Edge zgłasza wyjątek i zwraca kod stanu400z kodem błędumessaging.adaptors.http.flow.DecompressionFailureAtRequestdo aplikacji klienckich.Scenariusz 2
Scenariusz 2. Gdy żądanie do interfejsu API zawiera nagłówek Content-Encoding: deflate
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)Wiersze
java.util.zip.ZipException: incorrect header checkiCaused by: java.util.zip.DataFormatException: incorrect header checkw powyższym komunikacie o błędzie wskazują, że ładunek żądania nie jest wysyłany w formacie deflate i nie pasuje do kodowania określonego w nagłówkuContent-Encodingdeflate. Dlatego Apigee Edge zgłasza wyjątek i zwraca kod stanu400z kodem błędumessaging.adaptors.http.flow.DecompressionFailureAtRequestdo aplikacji klienckich.
-
Rozdzielczość
- Jeśli w przepływie proxy interfejsu API w Apigee Edge i na serwerze backendu nie jest potrzebny skompresowany ładunek żądania, nie przekazuj nagłówka
Content-Encoding. Jeśli chcesz skompresować ładunek żądania, przejdź do kroku 2. - Upewnij się, że aplikacja kliencka zawsze wysyła te informacje:
- dowolne
obsługiwane kodowanie jako wartość nagłówka
Content-Encodingw żądaniu. - Ładunek żądania w obsługiwanym formacie do Apigee Edge jest zgodny z formatem kodowania określonym w nagłówku
Content-Encoding.
- dowolne
obsługiwane kodowanie jako wartość nagłówka
- W omówionym powyżej przykładzie ładunek żądania jest w formacie ZIP, ale nagłówek żądania określa
Content-Encoding: gzip. Możesz rozwiązać ten problem, wysyłając nagłówek żądania jakoContent-Encoding: gzip, a ładunek żądania również w formaciegzip:curl -v "https://HOSTALIAS/v1/testgzip" -H "Content-Encoding: gzip" -X POST -d @request_payload.gz
Specyfikacja
Apigee Edge odpowiada kodem stanu 400 Bad Request z kodem błędu messaging.adaptors.http.flow.DecompressionFailureAtRequest zgodnie ze specyfikacjami RFC:
| Specyfikacja |
|---|
| RFC 7231, sekcja 6.5.1 |
| RFC 7231, sekcja 3.1.2.2 |
Jeśli nadal potrzebujesz pomocy zespołu pomocy Apigee, zapoznaj się z sekcją Informacje diagnostyczne, które musisz zebrać.
musi zbierać informacje diagnostyczne;
Zbierz te informacje diagnostyczne, a potem skontaktuj się z zespołem pomocy Apigee Edge:
Jeśli jesteś użytkownikiem chmury publicznej, podaj te informacje:
- Nazwa organizacji
- Nazwa środowiska
- Nazwa proxy interfejsu API
- Pełne polecenie
curlużyte do odtworzenia błędu400 - Plik śledzenia żądań do interfejsu API
Jeśli jesteś użytkownikiem chmury Private Cloud, podaj te informacje:
- Pełny komunikat o błędzie dotyczący żądań, które nie zostały zrealizowane
- Nazwa środowiska
- Pakiet proxy interfejsu API
- Plik śledzenia żądań do interfejsu API
Logi dostępu NGINX
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_logGdzie: ORG, ENV i PORT# są zastępowane rzeczywistymi wartościami.
- Dzienniki systemowe procesora komunikatów
/opt/apigee/var/log/edge-message-processor/logs/system.log