400 Nieprawidłowe żądanie – DecompressionFailureAtRequest

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,
  • ALE

  • Format ładunku wysłany przez klienta w ramach żądania HTTP nie pasuje do formatu kodowania określonego w nagłówku Content-Encoding

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

Zobacz Format GZIP w standardzie RFC1952.

Pojedyncze kodowanie deflate

Ten format wykorzystuje strukturę zlib z algorytmem kompresji deflate.

Zobacz RFC1950 i RFC1951..

Wiele kodowania

Wiele kodowania

Jeśli na przykład kodowanie zostało wykonane dwukrotnie, może to wyglądać tak:

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

  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 interfejsów API > Zbadaj.
  4. Wybierz przedział czasu, w którym zaobserwowano błędy.
  5. Upewnij się, że filtr Serwer proxy jest ustawiony na wartość Wszystkie.
  6. Porównaj kod błędu z czasem.
  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łędu messaging.adaptors.http.flow.DecompressionFailureAtRequest są wyświetlane jak 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 Logi zwróć uwagę na te informacje:
    • Kod stanu: 400
    • Źródło błędu: proxy
    • Kod błędu: messaging.adaptors.http.flow.DecompressionFailureAtRequest.
  11. 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łówku Content-Encoding.

Narzędzie do śledzenia

Aby zdiagnozować błąd za pomocą narzędzia do śledzenia:

  1. Włącz sesję śledzenia i wykonaj jedną z tych czynności:
    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 Show all FlowInfos (Pokaż wszystkie informacje) jest włączona:

  3. Wybierz 1 z nieudanych żądań i sprawdź log czasu.
  4. Przejdź przez różne fazy śledzenia i znajdź miejsce błędu.
  5. Błąd pojawia się zwykle w procesie tuż po etapie Żądanie odebrane od klienta, jak pokazano poniżej:

    ( wyświetl większy obraz)

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

  7. Określ wartość nagłówka żądania Content-Encoding. W tym celu przejdź do etapu Prośba otrzymane od klienta, jak pokazano poniżej:

    ( wyświetl większy obraz)

    Pamiętaj, że wartość nagłówka żądania Content-Encoding w rzeczywistości to gzip.

    Powyższy przykładowy log czasu 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 dekompresować ładunku za pomocą narzędzia gzip i zwraca błąd Decompression failure at request.

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

    ( wyświetl większy obraz)

    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"}}}
  9. Przejdź do etapu AX (rejestrowane dane Analytics) w logu czasu i kliknij go.

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

    ( wyświetl większy obraz)

  11. Będą widoczne wartości X-Apigee-fault-code i X-Apigee-fault-source jako messaging.adaptors.http.flow.DecompressionFailureAtRequest oraz policy, co oznacza, że format ładunku żądania nie pasuje do kodowania określonego 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 przy użyciu logów dostępu NGINX:

  1. 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.
  2. 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.

  3. 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 z 400.
  4. 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

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

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

    Trace

    Aby sprawdzić poprawność danych za pomocą logu czasu:

    1. 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.
    2. 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łę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ę kliencką, 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ługiwanego kodowania, ale format ładunku żądania nie pasuje do kodowania określonego w nagłówku Content-Encoding, to jest przyczyną problemu.

      Przykładowe żądanie:

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

      Powyższe przykładowe żądanie wysyła wartość gzip do nagłówka Content-Encoding, które jest obsługiwanym kodowaniem w Apigee Edge. Ładunek żądania request_payload.zip jest jednak w formacie ZIP. Dlatego to żądanie zawiera kod stanu 400 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.

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

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

    3. 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 format
      

      Wiersz 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 stanu 400 z kodem błędu messaging.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 i Caused 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łówku Content-Encoding tagu deflate. Dlatego Apigee Edge zgłasza wyjątek i zwraca aplikacjom klienckim kod stanu 400 z kodem błędu messaging.adaptors.http.flow.DecompressionFailureAtRequest.

Rozdzielczość

  1. 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.
  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
  3. 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 jako Content-Encoding: gzip, a ładunek żądania także w formacie gzip:
    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łędu 400
  • 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