Przeglądasz dokumentację Apigee Edge.
Otwórz dokumentację Apigee X. Informacje
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żesz też zobaczyć komunikat o błędzie podobny do tego:
{ "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-Encoding
jest prawidłowe i obsługiwane przez Apigee Edge, - Format ładunku wysłany przez klienta w ramach żądania HTTP nie pasuje do formatu kodowania określonego w nagłówku
Content-Encoding
ALE
Dzieje się tak, ponieważ Apigee Edge nie dekoduje ładunku za pomocą podanego kodowania, ponieważ format ładunku nie jest w tym samym formacie co kodowanie określone w nagłówku Content-Encoding
.
Oto kilka przykładów obsługiwanych wartości Content-Encoding
i informacje o tym, jak Apigee Edge oczekuje formatu ładunku w takich przypadkach:
Scenariusz | Content-Encoding | Oczekiwany format ładunku |
---|---|---|
Pojedyncze kodowanie | gzip | Format Unix |
Pojedyncze kodowanie | deflate | Ten format wykorzystuje strukturę |
Wiele kodowania | Wiele kodowania Jeśli na przykład kodowanie zostało wykonane dwukrotnie, może to wyglądać tak:
|
Do ładunku zastosowano wiele kodowania w takiej kolejności, w jakiej wyświetla się 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 wysyłanego przez klienta nie jest zakodowany lub nie pasuje do kodowania określonego w nagłówku Content-Encoding . |
Użytkownicy chmury publicznej i prywatnej usługi Edge |
Najczęstsze kroki diagnostyki
Aby zdiagnozować ten błąd, użyj jednego z tych narzędzi lub metod:
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 interfejsów API > Zbadaj.
- Wybierz przedział czasu, w którym zaobserwowano błędy.
- Upewnij się, że filtr Serwer proxy jest ustawiony na wartość Wszystkie.
- Porównaj kod błędu z czasem.
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.DecompressionFailureAtRequest
są wyświetlane jak poniżej:Kliknij Wyświetl logi i rozwiń wiersz, w którym wystąpił błąd
400
.- W oknie Logi zwróć uwagę na te informacje:
- Kod stanu:
400
- Źródło błędu:
proxy
- Kod błędu:
messaging.adaptors.http.flow.DecompressionFailureAtRequest
.
- Kod stanu:
- Jeśli źródło błędów ma wartość
proxy
, oznacza to, że format ładunku żądania nie pasuje do obsługiwanego kodowania określonego w nagłówkuContent-Encoding
.
Narzędzie do śledzenia
Aby zdiagnozować błąd za pomocą narzędzia do śledzenia:
- Włącz sesję śledzenia i wykonaj jedną z tych czynności:
- Poczekaj na wystąpienie błędu
400 Bad Request
lub - 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 Show all FlowInfos (Pokaż wszystkie informacje) jest włączona:
- Wybierz 1 z nieudanych żądań i sprawdź log czasu.
- Przejdź przez różne fazy śledzenia i znajdź miejsce błędu.
Błąd pojawia się zwykle w procesie tuż po etapie Żądanie odebrane od klienta, jak pokazano poniżej:
-
Zapisz wartości właściwości ze śledzenia:
- błąd:
Decompression failure at request
- error.class:
com.apigee.rest.framework.BadRequestException
- error.cause:
Not in GZIP format
Instrukcja error.cause informuje, że ładunek żądania NIE jest w formacie GZIP. Oznacza to, że usługa Apigee Edge oczekiwała ładunku żądania w formacie GZIP, który został określony w nagłówku
Content-Encoding
. - błąd:
Określ wartość nagłówka żądania
Content-Encoding
. W tym celu przejdź do etapu Prośba otrzymane od klienta, jak pokazano poniżej:Pamiętaj, że wartość nagłówka żądania
Content-Encoding
w rzeczywistości togzip
.Powyższy przykładowy log czasu pokazuje, że kodowanie określone w nagłówku żądania
Content-Encoding
togzip
, ale ładunek żądania nie jest w formacie GZIP. Dlatego Apigee nie może dekompresować ładunku za pomocą narzędzia gzip i zwraca błądDecompression failure at request
.- Zapisz kod stanu oraz komunikat o błędzie zwrócony przez Apigee Edge, przechodząc do
w fazie Odpowiedź wysłana do klienta w logu czasu, jak pokazano poniżej:
Zwróć uwagę na te informacje logu czasu:
- Kod stanu:
400 Bad Request
. - Treść błędu:
{"fault":{"faultstring":"Decompression failure at request","detail":{"errorcode":"messaging.adaptors.http.flow.DecompressionFailureAtRequest"}}}
- Kod stanu:
Przejdź do etapu AX (rejestrowane dane Analytics) w logu czasu i kliknij go.
- Przewiń w dół do sekcji Szczegóły fazy i Nagłówki błędów i określ wartości w polach X-Apigee-fault-code oraz X-Apigee-fault-source, jak pokazano poniżej:
- Będą widoczne wartości X-Apigee-fault-code i X-Apigee-fault-source jako
messaging.adaptors.http.flow.DecompressionFailureAtRequest
orazpolicy
, co oznacza, że format ładunku żądania nie pasuje do kodowania określonego w nagłówkuContent-Encoding
.Nagłówki odpowiedzi Wartość X-Apigee-fault-code messaging.adaptors.http.flow.DecompressionFailureAtRequest
X-Apigee-fault-source policy
NGINX
Aby zdiagnozować błąd przy użyciu logów dostępu NGINX:
- Jeśli jesteś użytkownikiem Private Cloud, możesz użyć logów dostępu NGINX, aby określić kluczowe informacje o błędach HTTP
400
. Sprawdź logi dostępu do NGINX:
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log
Gdzie: ORG, ENV i PORT# są zastępowane rzeczywistymi wartościami.
- Sprawdź, czy występują jakieś błędy
400
w danym okresie (jeśli problem występował w przeszłości) lub czy są jakieś żądania, które nadal kończą się niepowodzeniem z400
. Jeśli znajdziesz błędy
400
z kodem X-Apigee-fault-code zgodnym z wartościąmessaging.adaptors.http.flow.DecompressionFailureAtRequest
, sprawdź wartość źródła błędów X-Apigee.Przykładowy błąd 400 z dziennika dostępu NGINX:
Powyższy przykładowy wpis z logu dostępu NGINX ma następujące wartości kodu X-Apigee-fault-code i X-Apigee-fault-code :
Nagłówki odpowiedzi Wartość X-Apigee-fault-code messaging.adaptors.http.flow.DecompressionFailureAtRequest
X-Apigee-fault-source policy
Przyczyna: format ładunku żądania nie pasuje do kodowania określonego 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. Dlatego format ładunku żądania powinien być zgodny z kodowaniem określonym w nagłówku żądania Content-Encoding
.
Jeśli występuje niezgodność, pojawia się ten błąd.
Diagnostyka
- Znajdź kod błędu i źródło błędu dla błędu zaobserwowanego przy użyciu interfejsu API Monitoring, narzędzia do śledzenia lub logów dostępu NGINX zgodnie z opisem w częstych krokach diagnostyki.
- Jeśli kod błędu to
messaging.adaptors.http.flow.DecompressionFailureAtRequest
, a źródło błędu ma wartośćpolicy
lubproxy
, 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 sprawdzić w żądaniu HTTP, korzystając z jednej z tych metod:
Komunikat o błędzie
Aby przeprowadzić weryfikację przy użyciu komunikatu o błędzie:
-
Jeśli masz dostęp do pełnego komunikatu o błędzie otrzymanego z Apigee Edge, zapoznaj się z dokumentem
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 żądanie nie mogło zostać zdekompresowane za pomocą kodowania określonego w nagłówkuContent-Encoding
.
Trace
Aby sprawdzić poprawność danych za pomocą logu czasu:
- Ustal wartość nagłówka żądania Content-Encoding i właściwości error.cause za pomocą funkcji Trace zgodnie z opisem w częstych krokach diagnostyki.
Wartości z przykładowego logu czasu są następujące:
- Kodowanie treści:
gzip
- error.cause:
Not in GZIP format
Wartość w nagłówku żądania Content-Encoding to gzip, ale ładunek żądania nie jest w formacie GZIP (jak wskazuje error.cause). Dlatego Apigee Edge w odpowiedzi wysyła
400 Bad Request
i kod błędumessaging.adaptors.http.flow.DecompressionFailureAtRequest
.- Kodowanie treści:
Rzeczywista prośba
Aby sprawdzić poprawność za pomocą rzeczywistego żądania:
Jeśli masz dostęp do rzeczywistego żądania wysłanego przez aplikację kliencką, 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-Encoding
znajduje się na liście obsługiwanego kodowania, ale format ładunku żądania nie pasuje do kodowania określonego w nagłówkuContent-Encoding
, to jest przyczyną problemu.Przykładowe żądanie:
curl -v "http://HOSTALIAS/v1/testgzip"
-H "Content-Encoding: gzip"
-X POST -d @request_payload.zipPowyższe przykładowe żądanie wysyła wartość
gzip
do nagłówkaContent-Encoding
, które jest obsługiwanym kodowaniem w Apigee Edge. Ładunek żądaniarequest_payload.zip
jest jednak w formacie ZIP. Dlatego to żądanie zawiera kod stanu400 Bad Request
i kod błędu:messaging.adaptors.http.flow.DecompressionFailureAtRequest
.
Logi procesora wiadomości
Aby sprawdzić poprawność danych za pomocą dzienników procesora wiadomości:
Jeśli jesteś użytkownikiem Private Cloud, możesz użyć logów procesora wiadomości, aby określić kluczowe informacje o błędach HTTP
400
.- Ustal identyfikator wiadomości niezrealizowanego żądania za pomocą monitorowania interfejsu API, narzędzia do śledzenia lub logów dostępu NGINX zgodnie z opisem w częstych krokach diagnostyki.
Wyszukaj identyfikator wiadomości w dzienniku procesora wiadomości:
/opt/apigee/var/log/edge-message-processor/logs/system.log
Występuje jeden z tych wyjątków:
Scenariusz 1
Scenariusz 1. Żądanie do interfejsu API ma 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() : Exception
java.util.zip.ZipException: Not in GZIP format
occurred 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 format
w powyższym komunikacie o błędzie oznacza, że ładunek żądania nie został wysłany w formacie GZIP, chociażContent-Encoding
jest określony jako gzip. Dlatego Apigee Edge zgłasza wyjątek i zwraca aplikacjom klienckim kod stanu400
z kodem błędumessaging.adaptors.http.flow.DecompressionFailureAtRequest
.Scenariusz 2
Scenariusz 2. Żądanie do interfejsu API ma 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 check
iCaused by: java.util.zip.DataFormatException: incorrect header check
w powyższym komunikacie o błędzie wskazują, że ładunek żądania nie został wysłany w formacie deflate i nie pasuje do kodowania określonego w nagłówkuContent-Encoding
tagu deflate. Dlatego Apigee Edge zgłasza wyjątek i zwraca aplikacjom klienckim kod stanu400
z kodem błędumessaging.adaptors.http.flow.DecompressionFailureAtRequest
.
-
Rozdzielczość
- Jeśli nie potrzebujesz skompresowanego ładunku żądania w przepływie serwera proxy interfejsu API w Apigee Edge i na serwerze backendu, nie przekazuj nagłówka
Content-Encoding
. Jeśli musisz skompresować ładunek żądania, przejdź do kroku 2. - Sprawdź, czy aplikacja kliencka zawsze wysyła te informacje:
- Dowolne
obsługiwane kodowanie jako wartość nagłówka
Content-Encoding
w żądaniu - Ładunek żądania w obsługiwanym formacie Apigee Edge pasuje do formatu kodowania określonego 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 w nagłówku żądania występuje element
Content-Encoding: gzip
. Aby rozwiązać ten problem, wyślij nagłówek żądania jakoContent-Encoding: gzip
, a ładunek żądania także w formaciegzip
:curl -v "https://HOSTALIAS/v1/testgzip" -H "Content-Encoding: gzip" -X POST -d @request_payload.gz
Specyfikacja
Apigee Edge w odpowiedzi przesyła kod stanu 400 Bad Request
z kodem błędu messaging.adaptors.http.flow.DecompressionFailureAtRequest
zgodnie z tą specyfikacją RFC:
Specyfikacja |
---|
RFC 7231, sekcja 6.5.1 |
RFC 7231, sekcja 3.1.2.2 |
Jeśli nadal będziesz potrzebować pomocy zespołu pomocy Apigee, przejdź do artykułu Musisz zebrać informacje diagnostyczne.
Musisz zebrać informacje diagnostyczne
Zbierz te informacje diagnostyczne, a następnie skontaktuj się z zespołem pomocy Apigee Edge:
Jeśli jesteś użytkownikiem chmury publicznej, podaj te informacje:
- Nazwa organizacji
- Nazwa środowiska
- Nazwa serwera proxy interfejsu API
- Wykonaj polecenie
curl
użyte do odtworzenia błędu400
- Plik śledzenia żądań interfejsu API
Jeśli jesteś użytkownikiem Private Cloud, podaj te informacje:
- Zaobserwowany pełny komunikat o błędzie dotyczący nieudanych żądań
- Nazwa środowiska
- Pakiet proxy API
- Plik śledzenia żądań interfejsu API
Logi dostępu NGINX
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log
Gdzie: ORG, ENV i PORT# są zastępowane rzeczywistymi wartościami.
- Dzienniki systemowe procesora wiadomości
/opt/apigee/var/log/edge-message-processor/logs/system.log