400 Nieprawidłowe żądanie – DecompressionFailureAtRequest

Przeglądasz dokumentację Apigee Edge.
Przejdź do Dokumentacja Apigee X.
informacje.

Krótki opis problemu

Aplikacja kliencka otrzymuje kod stanu HTTP 400 Bad Request z kodem błędu messaging.adaptors.http.flow.DecompressionFailureAtRequest jako odpowiedź na interfejs API połączeń.

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 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łowy i . obsługiwane przez Apigee Edge,
  • ALE

  • Format ładunku wysyłany przez klienta w ramach żądania HTTP nie pasuje do formatu kodowania określonego w 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 parametrze Nagłówek Content-Encoding.

Oto kilka przykładów obsługiwanych wartości Content-Encoding oraz sposób działania Apigee Edge oczekuje formatu ładunku w tych przypadkach:

Scenariusz Content-Encoding Oczekiwany format ładunku
Pojedyncze kodowanie gzip

Format uniksowy gzip.

Zobacz RFC1952 GZIP Format.

Pojedyncze kodowanie Deflate

Ten format wykorzystuje strukturę zlib z algorytmem kompresji deflate.

Zobacz RFC1950 i RFC1951.

Wielokrotne kodowanie

Wielokrotne kodowanie

Jeśli na przykład kodowanie jest wykonywane 2 razy, może to być:

  • gzip, deflate, gzip, deflate
  • gzip, gzip
  • deflate, gzip
  • deflate, deflate
Do ładunku zastosowano wiele kodowania, w podanej kolejności, w jakiej występuje w nagłówku.

Możliwe przyczyny tego błędu są następujące:

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 Edge

Typowe kroki diagnostyki

Użyj jednego z tych narzędzi lub metod, aby zdiagnozować ten błąd:

Monitorowanie interfejsów API

Aby zdiagnozować błąd za pomocą monitorowania interfejsów API:

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

  3. Przejdź do przycisku Analiza > Monitorowanie interfejsów API > Zbadaj stronę.
  4. Wybierz okres, w którym zaobserwowano błędy.
  5. Upewnij się, że filtr Serwer proxy jest ustawiony na Wszystkie.
  6. Porównaj Kod błędu z czasem.
  7. Wybierz komórkę, która ma kod błędu messaging.adaptors.http.flow.DecompressionFailureAtRequest jako poniżej:

    ( wyświetl większy obraz)

  8. Informacje o kodzie błędu messaging.adaptors.http.flow.DecompressionFailureAtRequest jest wyświetlany w następujący sposób:

    ( 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łędu ma wartość proxy, oznacza to, że format ładunku żądania nie pasuje do . obsługiwane kodowanie określone w nagłówku Content-Encoding.

Narzędzie śledzenia

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

  1. Włącz sesję śledzenia. oraz:
    1. Poczekaj, aż wystąpi błąd 400 Bad Request lub
    2. Jeśli możesz odtworzyć problem, wywołaj interfejs API i odtwórz te dane. 400 Bad Request
  2. Sprawdź, czy opcja Show all FlowInfos jest włączona:

  3. Wybierz jedno z nieudanych żądań i sprawdź log czasu.
  4. Przejdź przez różne fazy śledzenia i znajdź miejsca, w których wystąpił błąd .
  5. Błąd pojawia się zazwyczaj zaraz po Etap Prośbę otrzymano od klienta, jak pokazano poniżej:

    ( wyświetl większy obraz)

  6. Zanotuj wartości właściwości ze logu czasu:

    • błąd: Decompression failure at request
    • error.class: com.apigee.rest.framework.BadRequestException
    • error.cause: Not in GZIP format

    Zapis error.cause wskazuje, że ładunek żądania NIE jest w formacie GZIP. Oznacza to, że Apigee Edge oczekiwała, że ładunek żądania będzie w formacie GZIP zgodnie z nagłówkiem Content-Encoding.

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

    ( wyświetl większy obraz)

    Zauważ, że wartość nagłówka żądania Content-Encoding rzeczywiście gzip

    Powyższy przykładowy log czasu pokazuje, że kodowanie określone w nagłówku żądania Content-Encodinggzip; jednak ładunek żądania nie jest w formacie GZIP. Dlatego Apigee nie może dekompresować ładunku za pomocą gzip i zwraca błąd Decompression failure at request.

  8. Znajdź kod stanu i komunikat o błędzie zwrócony przez Apigee Edge

    do etapu Odpowiedź wysłana do klienta w śledzeniu, jak pokazano poniżej:

    ( wyświetl większy obraz)

    Zanotuj te informacje ze śledzenia:

    • Kod stanu: 400 Bad Request.
    • Treść błędu: {"fault":{"faultstring":"Decompression failure at request","detail":{"errorcode":"messaging.adaptors.http.flow.DecompressionFailureAtRequest"}}}
  9. Przejdź do fazy AX (zarejestrowane dane Analytics) w śledzeniu i kliknij ją.

  10. Przewiń w dół do sekcji Phase Details (Szczegóły etapu), Error Headers (Nagłówki błędów). Wyznacz wartości X-Apigee-fault-code i X-Apigee-fault-source jak poniżej:

    ( wyświetl większy obraz)

  11. Zobaczysz wartości X-Apigee-fault-code i X-Apigee-fault-source. jako messaging.adaptors.http.flow.DecompressionFailureAtRequest i policy, co oznacza, że format ładunku żądania nie pasuje do kodowanie określone 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żywać logów dostępu NGINX do: określenie najważniejszych 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: wartości ORG, ENV i PORT# są zastępowane rzeczywistymi wartościami.

  3. Wyszukaj błędy (400) w danym okresie (jeśli problem wystąpił w przeszłości) lub jeśli masz jakieś żądania, które nadal kończą się niepowodzeniem 400
  4. Jeśli znajdziesz błędy 400 z kodem błędu X-Apigee-fault-code pasujący do wartości messaging.adaptors.http.flow.DecompressionFailureAtRequest, a następnie określ wartość źródła X-Apigee-fault-source..

    Przykładowy błąd 400 z dziennika dostępu NGINX:

    Powyższy przykładowy wpis z logu dostępu NGINX zawiera następujące wartości dla: 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 określonego kodowania w nagłówku Content-Encoding

Domyślnie Apigee Edge zawsze dekompresuje ładunek, jeśli nagłówek żądania Content-Encoding zawiera prawidłowe i a obsługiwane kodowanie. Można więc oczekiwać, że format ładunku żądania powinien być zgodny z kodowaniem określonym w nagłówku żądania Content-Encoding. Ten błąd pojawia się w przypadku niezgodności.

Diagnostyka

  1. Określ kod błędu i źródło błędu dla błędu zaobserwowanego za pomocą interfejsu API. Logi monitorowania, narzędzia śledzenia lub logi dostępu NGINX zgodnie z opisem w artykule Najczęstsze czynności diagnostyczne.
  2. Jeśli kod błędu to messaging.adaptors.http.flow.DecompressionFailureAtRequest oraz Źródło błędu ma wartość policy lub proxy, a następnie wskazuje, że żądanie wysłane przez aplikację kliencką zawiera ładunek niepasujący do obsługiwane kodowanie określone w nagłówku żądania Content-Encoding.
  3. Możesz określić niezgodność w ramach żądania HTTP za pomocą jednej z tych metod: metody:

    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, przeczytaj faultstring.

      Przykładowy komunikat o błędzie:

      "faultstring":"Decompression failure at request"
      
    2. W powyższym komunikacie o błędzie pojawia się "Decompression failure at request", co oznacza, że żądanie nie można zdekompresować przy użyciu kodowania określonego w Content-Encoding.

    Śledzenie

    Aby przeprowadzić weryfikację za pomocą logu czasu:

    1. Ustal wartość nagłówka żądania Content-Encoding oraz właściwość error.cause za pomocą Trace zgodnie z opisem w sekcji Typowe kroki 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, ładunek żądania nie jest w formacie GZIP, (jak wskazuje error.cause). Dlatego Apigee Edge przekazuje odpowiedź 400 Bad Request i kod błędu messaging.adaptors.http.flow.DecompressionFailureAtRequest

    Rzeczywiste żądanie

    Aby przeprowadzić weryfikację na podstawie rzeczywistego żądania:

    Jeśli masz dostęp do faktycznego żądania zgłoszonego przez klienta aplikacji, a następnie wykonaj te czynności:

    1. Określ wartość przekazywaną do nagłówka żądania Content-Encoding.
    2. Określ format ładunku wysłanego w ramach żądania.
    3. Jeśli wartość nagłówka Content-Encoding znajduje się na liście jest obsługiwane kodowanie, ale format ładunku żądania nie pasuje do kodowania określonego w nagłówku Content-Encoding, to jest właśnie 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 funkcji Content-Encoding, który jest obsługiwane kodowanie w Apigee Edge. Jednak ładunek żądania request_payload.zip jest w formacie ZIP. W związku z tym prośba kończy się niepowodzeniem i otrzymuje kod stanu 400 Bad Request i kod błędu: messaging.adaptors.http.flow.DecompressionFailureAtRequest

    Logi procesora wiadomości

    Aby przeprowadzić weryfikację za pomocą logów procesora wiadomości:

    Jeśli jesteś użytkownikiem Private Cloud, możesz używać logów procesora wiadomości w celu ustalenia najważniejszych informacji o błędach HTTP 400.

    1. Ustal identyfikator wiadomości nieudanego żądania za pomocą monitorowania interfejsów API, narzędzia Trace lub dzienników dostępu NGINX, zgodnie z opisem w sekcji Typowe kroki diagnostyki.
    2. Wyszukaj identyfikator wiadomości w dzienniku procesora wiadomości:

      /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 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 żądanie nie jest wysyłany w formacie GZIP, chociaż 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 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)
      

      Linie java.util.zip.ZipException: incorrect header check oraz Caused by: java.util.zip.DataFormatException: incorrect header check w powyższym komunikacie o błędzie wskazuje, że ładunek żądania nie został wysłany w deflate i nie pasuje do kodowania określonego w Content-Encoding nagłówek deflate. W związku z tym Apigee Edge zgłasza wyjątek i zwraca kod stanu 400 z kod błędu messaging.adaptors.http.flow.DecompressionFailureAtRequest do aplikacji klienckich.

Rozdzielczość

  1. Jeśli nie ma potrzeby skompresowanego ładunku żądania w procesie serwera proxy interfejsu API w Apigee Edge i na serwerze backendu, nie przekazuj nagłówka Content-Encoding. Jeśli konieczne jest skompresowanie ładunku żądania, przejdź do kroku 2.
  2. Upewnij się, że aplikacja kliencka zawsze wysyła to:
    • Dowolny obsługiwane kodowanie jako wartość nagłówka Content-Encoding w polu prośba
    • Ładunek żądania do Apigee Edge w obsługiwanym formacie pasuje do kodowania format określony w nagłówku Content-Encoding
  3. W omówionym powyżej przykładzie ładunek żądania ma format ZIP, ale nagłówek żądania. określa Content-Encoding: gzip. Możesz rozwiązać problem, wysyłając prośbę nagłówek jako Content-Encoding: gzip, a ładunek żądania także w gzip format:
    curl -v "https://HOSTALIAS/v1/testgzip" -H "Content-Encoding: gzip" -X POST -d @request_payload.gz
    

Specyfikacja

Apigee Edge wysyła kod stanu 400 Bad Request zawierający kod błędu messaging.adaptors.http.flow.DecompressionFailureAtRequest zgodnie z poniższym RFC specyfikacje:

Specyfikacja
RFC 7231, sekcja 6.5.1
RFC 7231, sekcja 3.1.2.2

Jeśli nadal potrzebujesz pomocy zespołu pomocy Apigee, wejdź na Musi zbierać informacje diagnostyczne.

Musi zbierać informacje diagnostyczne

Zbierz te informacje diagnostyczne, a następnie skontaktuj się z zespołem pomocy Apigee Edge:

Jeśli jesteś użytkownikiem Public Cloud, 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ń do interfejsu API

Jeśli jesteś użytkownikiem Private Cloud, podaj te informacje:

  • Pełny komunikat o błędzie zaobserwowany dla nieudanych żądań
  • Nazwa środowiska
  • Pakiet serwera 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, ENV i PORT# są zastępowane przez wartości rzeczywiste.

  • Dzienniki systemowe procesora wiadomości /opt/apigee/var/log/edge-message-processor/logs/system.log