400 Nieprawidłowe żądanie – HeaderHeader

Wyświetlasz dokumentację Apigee Edge.
Otwórz dokumentację Apigee X.
info

Krótki opis problemu

Aplikacja kliencka otrzymuje kod stanu HTTP 400 Bad Request z kodem błędu protocol.http.DuplicateHeader w odpowiedzi na wywołania interfejsu API.

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":"Duplicate Header \"Expires\"",
      "detail":{
         "errorcode":"protocol.http.DuplicateHeader"
      }
   }
}

Możliwe przyczyny

Ten błąd występuje, jeśli określony nagłówek HTTP, który nie może mieć duplikatów w Apigee Edge, pojawia się więcej niż raz z tymi samymi lub różnymi wartościami w żądaniu HTTP wysłanym przez klienta do Apigee Edge.

Zgodnie z sekcją 3.2.2 dokumentu RFC 7230: Field Order, nadawca NIE MOŻE generować w wiadomości wielu pól nagłówka o tej samej nazwie, chyba że cała wartość pola nagłówka jest zdefiniowana jako lista rozdzielona przecinkami [tzn. #(values)] lub pole nagłówka jest a dobrze znanym wyjątkiem. Jeśli Apigee Edge znajdzie określony nagłówek, który nie może mieć duplikatów, więcej niż raz w żądaniu HTTP wysłanym przez klienta, odpowie kodem 400 Bad Request i kodem błędu protocol.http.DuplicateHeader.

Oto możliwe przyczyny tego błędu:

Przyczyna Opis Instrukcje rozwiązywania problemów, których dotyczy
Zduplikowany nagłówek w żądaniu Żądanie HTTP z aplikacji klienckiej do Apigee zawiera zduplikowane nagłówki. Użytkownicy chmury publicznej i prywatnej Edge

Typowe czynności diagnostyczne

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 interfejsów 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ę Analyze > API Monitoring > Investigate (Analiza > Monitorowanie interfejsów API > Zbadaj).
  4. Wybierz konkretny przedział czasu, w którym wystąpiły błędy.
  5. Upewnij się, że filtr Proxy jest ustawiony na All (Wszystkie).
  6. Wykreśl Fault Code (Kod błędu) na osi Time (Czas).
  7. Wybierz komórkę z kodem błędu protocol.http.DuplicateHeader jak pokazano poniżej:

  8. Informacje o kodzie błędu protocol.http.DuplicateHeader są wyświetlane jak poniżej:

  9. Kliknij View logs (Wyświetl logi) i rozwiń wiersz nieudanego żądania.
  10. W oknie Logs (Logi) zanotuj te informacje:
    1. Status Code (Kod stanu): 400
    2. Fault Source (Źródło błędu): apigee
    3. Fault Code (Kod błędu): protocol.http.DuplicateHeader.
  11. Jeśli Fault Source (Źródło błędu) ma wartość apigee lub MP , a Fault Code (Kod błędu) ma wartość protocol.http.DuplicateHeader, oznacza to, że żądanie HTTP od klienta zawierało zduplikowane nagłówki.

Narzędzie Trace

NGINX

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

  1. Jeśli jesteś użytkownikiem chmury prywatnej, możesz użyć logów dostępu NGINX, aby określić kluczowe informacje 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, ENV i PORT# są zastępowane rzeczywistymi wartościami.

  3. Sprawdź, czy w określonym czasie występują błędy 400 (jeśli problem wystąpił w przeszłości) lub czy nadal występują żądania, które kończą się błędem 400.
  4. Jeśli znajdziesz błędy 400, w których X-Apigee-fault-code pasuje do wartości protocol.http.DuplicateHeader, określ wartość X-Apigee-fault-source.

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

    Powyższy przykładowy wpis z logu dostępu NGINX ma te wartości dla X-Apigee- fault-code i X-Apigee-fault-source:

    Nagłówki odpowiedzi Wartość
    X-Apigee-fault-code protocol.http.DuplicateHeader
    X-Apigee-fault-source MP

Przyczyna: zduplikowany nagłówek w żądaniu

Diagnostyka

  1. Określ Fault Code (Kod błędu) i Fault Source (Źródło błędu) zaobserwowanego błędu za pomocą monitorowania interfejsów API lub logów dostępu NGINX, jak opisano w sekcji Typowe czynności diagnostyczne.
  2. Jeśli Fault Source (Źródło błędu) ma wartość apigee lub MP, oznacza to, że żądanie wysłane przez aplikację kliencką do Apigee zawiera zduplikowane nagłówki.
  3. Rzeczywisty nagłówek, który jest wysyłany więcej niż raz w ramach żądania, możesz określić za pomocą jednej z tych metod:

    Komunikat o błędzie

    Używanie komunikatu o błędzie

    1. Jeśli masz dostęp do pełnego komunikatu o błędzie otrzymanego z Apigee Edge, to zapoznaj się z elementem faultstring. Element faultstring zawiera nazwę nagłówka, który został wysłany więcej niż raz.

      Przykładowy komunikat o błędzie:

      "faultstring":"Duplicate Header \"Expires\""
    2. W powyższym komunikacie o błędzie widać, że nagłówek Expires został wysłany więcej niż raz, co widać w elemencie faultstring.

    Rzeczywiste żądanie

    Używanie rzeczywistego żądania

    1. Jeśli masz dostęp do rzeczywistego żądania wysłanego przez aplikację kliencką, wykonaj te czynności:

      1. Sprawdź listę nagłówków przekazanych w żądaniu.
      2. Jeśli zauważysz, że określony nagłówek pojawia się w żądaniu więcej niż raz z tą samą lub różnymi wartościami, jest to przyczyna tego błędu.

      Przykładowe żądanie:

      curl https://HOST_ALIAS/duplicateheadertest -v -H "Expires: Mon, 21 June 2021 07:28:00 GMT" -H "Expires: Mon, 21 June 2021 07:28:00 GMT"
      

      W powyższym przykładowym żądaniu nagłówek Expires został wysłany więcej niż raz. Dlatego to żądanie kończy się błędem 400 Bad Request i kodem błędu: protocol.http.DuplicateHeader.

    2. Jeśli masz dostęp do logów klienta, możesz sprawdzić, czy zawierają one informacje o rzeczywistym żądaniu wysłanym do Apigee Edge, i określić nagłówek, który został wysłany więcej niż raz.

Rozdzielczość

Naprawianie duplikatów

Opcja 1. [zalecana] Popraw aplikację kliencką, aby nie zawierała zduplikowanych nagłówków

  1. Przeanalizuj przyczynę wysyłania przez konkretnego klienta zduplikowanego nagłówka. Na przykład Expires w powyższym przypadku. Sprawdź, czy serwery proxy interfejsu API mogą akceptować zduplikowany nagłówek. Zgodnie ze specyfikacją HTTP RFC7230 zwykle nie jest to pożądane.
  2. Jeśli nie jest to pożądane, zmodyfikuj aplikację kliencką, aby nie wysyłała zduplikowanych nagłówków.

    W omówionym powyżej przykładzie zauważono, że nagłówek Expires jest wysyłany 2 razy z tą samą wartością, co jest niepożądane. Problem możesz rozwiązać, przekazując nagłówek Expires tylko raz, jak pokazano poniżej:

    curl https://HOST_ALIAS/duplicateheadertest -v -H "Expires: Mon, 21 June 2021 07:28:00 GMT"
    
  3. Jeśli jest to pożądane i chcesz zezwolić na zduplikowane nagłówki, przejdź do opcji 2. Używanie właściwości CwC.

CwC

Opcja 2. Używanie właściwości CwC

Apigee udostępnia właściwość CwC CwC HTTPHeader.<HeaderName> ,która umożliwia aplikacjom klienckim i serwerom docelowym wysyłanie zduplikowanych nagłówków do serwerów proxy interfejsu API w Apigee Edge.

Właściwość CwC Wartości
HTTPHeader.<HeaderName> allowDuplicates,multivalued

Na przykład tę właściwość można ustawić w procesorach komunikatów, aby zezwolić na duplikaty i wiele wartości w nagłówku Expires.

HTTPHeader.Expires=allowDuplicates, multiValued
  1. Jeśli jesteś użytkownikiem chmury prywatnej, możesz skonfigurować tę właściwość, aby uniemożliwić Apigee Edge zgłaszanie błędu 400 Bad Request, nawet jeśli żądanie zawiera zduplikowane nagłówki. W tym celu skorzystaj z instrukcji Konfigurowanie procesorów komunikatów do używania zduplikowanych nagłówków.
  2. Jeśli jesteś użytkownikiem chmury publicznej, skontaktuj się z zespołem pomocy Apigee Edge, aby skonfigurować tę właściwość dla swojej organizacji.

Specyfikacja

Apigee oczekuje, że aplikacja kliencka nie będzie wysyłać zduplikowanych nagłówków w ramach żądania zgodnie z tymi specyfikacjami RFC:

Specyfikacja
RFC 7230, sekcja 3.2.2: Field Order
RFC 7230, sekcja 3.2 Header Fields

Jeśli nadal potrzebujesz pomocy zespołu pomocy Apigee, zapoznaj się z sekcją Informacje diagnostyczne, które musisz zebrać.

Informacje diagnostyczne, które musisz zebrać

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 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 prywatnej, podaj te informacje:

  • Pełny komunikat o błędzie zaobserwowany w przypadku nieudanych żądań
  • Nazwa środowiska
  • Pakiet proxy interfejsu API
  • Pełne polecenie curl użyte do odtworzenia błędu 400
  • 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 rzeczywistymi wartościami.

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