400 Nieprawidłowe żądanie – DecompressionFailureAtRequest

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-Encoding jest prawidłowe i  obsługiwane przez Apigee Edge.
  • BUT

  • Format ładunku wysłanego przez klienta w ramach żądania HTTP nie jest zgodny z formatem kodowania określonym w nagłówku Content-Encoding .

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 gzip.

Zobacz RFC1952 GZIP Format.

Pojedyncze kodowanie spuszczać powietrze,

Ten format używa struktury zlib z algorytmem kompresji deflate.

Zobacz RFC1950 i RFC1951.

Wiele kodowań

Wiele kodowań

Na przykład w przypadku dwukrotnego kodowania może to być:

  • gzip, deflate
  • gzip, gzip
  • deflate, gzip
  • deflate, deflate
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:

  1. Zaloguj się w interfejsie Apigee Edge jako użytkownik z  odpowiednią rolą.
  2. Przełącz się na organizację, w której chcesz zbadać problem.

  3. Otwórz stronę Analiza > Monitorowanie interfejsu API > Zbadaj.
  4. Wybierz konkretny przedział czasowy, w którym wystąpiły błędy.
  5. Sprawdź, czy filtr Proxy jest ustawiony na Wszystkie.
  6. Wykreśl kod błędu na osi czasu.
  7. Wybierz komórkę z kodem błędu messaging.adaptors.http.flow.DecompressionFailureAtRequest, jak pokazano poniżej:

    ( wyświetl większy obraz)

  8. Informacje o kodzie błędumessaging.adaptors.http.flow.DecompressionFailureAtRequest są wyświetlane w sposób pokazany poniżej:

    ( wyświetl większy obraz)

  9. Kliknij Wyświetl logi i rozwiń wiersz, w którym wystąpił błąd 400.

    ( wyświetl większy obraz)

  10. W oknie Dzienniki zanotuj te informacje:
    • Kod stanu: 400
    • Źródło błędu: proxy
    • Kod błędu: messaging.adaptors.http.flow.DecompressionFailureAtRequest.
  11. 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łówku Content-Encoding.

Narzędzie śledzenia

Aby zdiagnozować błąd za pomocą narzędzia Trace:

  1. Włącz śledzenie sesji i wybierz jedną z tych opcji:
    1. Poczekaj na wystąpienie błędu 400 Bad Request lub
    2. Jeśli możesz odtworzyć problem, wykonaj wywołanie interfejsu API i odtwórz 400 Bad Request.
  2. Sprawdź, czy opcja Pokaż wszystkie informacje o przepływach jest włączona:

  3. Wybierz jedno z nieudanych żądań i sprawdź ślad.
  4. Przeglądaj różne fazy śledzenia i sprawdź, gdzie wystąpił błąd.
  5. Błąd zwykle występuje w procesie bezpośrednio po fazie Otrzymano prośbę od klienta, jak pokazano poniżej:

    ( wyświetl większy obraz)

  6. 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.

  7. 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:

    ( wyświetl większy obraz)

    Zwróć uwagę, że wartość nagłówka żądania Content-Encoding to gzip.

    Powyższy przykładowy ślad pokazuje, że kodowanie określone w nagłówku żądania Content-Encoding to gzip, ale ładunek żądania nie jest w formacie GZIP. Dlatego Apigee nie może zdekompresować ładunku za pomocą gzip i zwraca błąd Decompression failure at request.

  8. 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:

    ( wyświetl większy obraz)

    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"}}}
  9. Otwórz fazę AX (Analytics Data Recorded) w śladzie i kliknij ją.

  10. Przewiń w dół do sekcji Szczegóły fazyNagłówki błędów i określ wartości X-Apigee-fault-codeX-Apigee-fault-source, jak pokazano poniżej:

    ( wyświetl większy obraz)

  11. Wartości X-Apigee-fault-codeX-Apigee-fault-source będą miały postać messaging.adaptors.http.flow.DecompressionFailureAtRequestpolicy, co oznacza, że format ładunku żądania nie odpowiada kodowaniu określonemu w nagłówku Content-Encoding.
    Nagłówki odpowiedzi Wartość
    X-Apigee-fault-code messaging.adaptors.http.flow.DecompressionFailureAtRequest
    X-Apigee-fault-source policy

NGINX

Aby zdiagnozować błąd za pomocą dzienników dostępu NGINX:

  1. 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.
  2. Sprawdź logi dostępu NGINX:

    /opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log

    Gdzie: ORG, ENVPORT# są zastępowane rzeczywistymi wartościami.

  3. 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 kodem 400.
  4. Jeśli znajdziesz błędy 400 z 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-codeX-Apigee-fault-source:

    Nagłówki odpowiedzi Wartość
    X-Apigee-fault-code messaging.adaptors.http.flow.DecompressionFailureAtRequest
    X-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

  1. Określ kod błęduź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.
  2. Jeśli kod błędu to messaging.adaptors.http.flow.DecompressionFailureAtRequest, a źródło błędu ma wartość policy lub proxy, oznacza to, że żądanie wysłane przez aplikację kliencką zawiera ładunek, który nie pasuje do obsługiwanego kodowania określonego w nagłówku żądania Content-Encoding.
  3. 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:

    1. 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"
    2. 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łówku Content-Encoding.

    Śledzenie

    Aby sprawdzić poprawność za pomocą śladu:

    1. 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.
    2. 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 Request i kodem błędu messaging.adaptors.http.flow.DecompressionFailureAtRequest.

    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:

    1. Określ wartość przekazaną do nagłówka żądania Content-Encoding.
    2. Określ format ładunku wysyłanego w ramach żądania.
    3. Jeśli wartość nagłówka Content-Encoding znajduje się na liście obsługiwanych kodowań, ale format ładunku żądania nie jest zgodny z kodowaniem określonym w nagłówku Content-Encoding, to jest to przyczyną problemu.

      Przykładowe żądanie:

      curl -v "http://HOSTALIAS/v1/testgzip" -H "Content-Encoding: gzip" -X POST -d @request_payload.zip
      

      W podanym wyżej przykładowym żądaniu wartość gzip jest wysyłana do nagłówka Content-Encoding, który jest obsługiwanym kodowaniem w Apigee Edge. Jednak ładunek żądaniarequest_payload.zip jest w formacie ZIP. Dlatego to żądanie kończy się niepowodzeniem i zwraca kod stanu 400 Bad Request oraz kod błędu messaging.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.

    1. 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.
    2. Wyszukaj identyfikator wiadomości w logu procesora komunikatów:

      /opt/apigee/var/log/edge-message-processor/logs/system.log

    3. Zobaczysz 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() :
      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 format
      

      Wiersz java.util.zip.ZipException: Not in GZIP format w powyższym komunikacie o błędzie wskazuje, że ładunek żądania nie jest wysyłany w formacie GZIP, mimo że Content-Encoding jest określony jako gzip. Dlatego Apigee Edge zgłasza wyjątek i zwraca kod stanu 400 z kodem błędu messaging.adaptors.http.flow.DecompressionFailureAtRequest do 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 check i Caused by: java.util.zip.DataFormatException: incorrect header check w 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łówku Content-Encoding deflate. Dlatego Apigee Edge zgłasza wyjątek i zwraca kod stanu 400 z kodem błędu messaging.adaptors.http.flow.DecompressionFailureAtRequest do aplikacji klienckich.

Rozdzielczość

  1. 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.
  2. Upewnij się, że 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 do Apigee Edge jest zgodny z formatem kodowania określonym w nagłówku Content-Encoding.
  3. 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 jako Content-Encoding: gzip, a ładunek żądania również w formacie gzip:
    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 curl użyte do odtworzenia błędu 400
  • 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_log

    Gdzie: ORG, ENVPORT# są zastępowane rzeczywistymi wartościami.

  • Dzienniki systemowe procesora komunikatów /opt/apigee/var/log/edge-message-processor/logs/system.log