500 – wewnętrzny błąd serwera – BadFormData

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 500 Internal Server Error z kodem błędu protocol.http.BadFormData.

Komunikat o błędzie

Aplikacja kliencka otrzymuje ten kod odpowiedzi:

HTTP/1.1 500 Internal Server Error

Oprócz tego może pojawić się ten komunikat o błędzie:

{
   "fault":{
      "faultstring":"Bad Form Data",
      "detail":{
         "errorcode":"protocol.http.BadFormData"
      }
   }
}

Dane formularzy

Zanim przejdziemy do szczegółów rozwiązywania tego problemu, dowiedzmy się, co to są dane formularza.

Dane formularza to informacje podawane przez użytkownika zwykle w formie formularza HTML, która zawiera takie elementy jak pole tekstowe, przycisk czy pole wyboru. Dane formularza są zwykle wysyłane jako seria par klucz-wartość w ramach żądań lub odpowiedzi HTTP.

Transmisja danych formularzy

  1. Content-Type: application/x-www-form-urlencoded
    • Jeśli dane formularza są małe, są wysyłane jako pary klucz-wartość z:

      Przykładowe żądanie z danymi formularza:

      curl https://HOSTALIAS/somepath -H "Content-Type: application/x-www-form-urlencoded" -d "username=abc@google.com&pasword=secret123"
      
    • Wszystkie znaki niealfanumeryczne w kluczach i wartościach są kodowane procentowo, czyli są reprezentowane jako triole znaków %HH, składające się ze znaku procenta, po którym następują 2 cyfry szesnastkowe reprezentujące kod ASCII danego znaku.
    • Dlatego mimo że znak procentu (%) jest dozwolony w danych formularza, jest interpretowany jako początek specjalnej sekwencji zmiany znaczenia. Dlatego, jeśli dane formularza muszą zawierać w kluczu lub wartości znaku procent (%), powinny być przesyłane w formacie %25, , który reprezentuje kod ASCII znaku procenta (%).
  2. Content-Type: wieloczęści/dane-formularza

    Jeśli chcesz przesyłać duże ilości danych binarnych lub tekstu zawierającego znaki spoza zestawu ASCII, możesz wysyłać dane za pomocą Content-Type: danych wieloczęściowych/danych formularzy zgodnie z opisem w Formularzach – sekcja 17.13.4.2

Możliwe przyczyny

Ten błąd występuje tylko wtedy, gdy są spełnione wszystkie te warunki:

  1. Żądanie HTTP wysłane przez klienta do Apigee Edge zawiera:
    1. Content-Type: application/x-www-form-urlencoded i
    2. Dane formularzy ze znakiem procentu (%) lub znakiem procentu (%), po którym następują nieprawidłowe znaki szesnastkowe, które są niedozwolone zgodnie z Formularzami – sekcja 17.13.4.1.
  2. Serwer proxy interfejsu API w Apigee Edge odczytuje określone parametry formularza zawierające znaki, których nie można używać w przepływie żądania za pomocą zasady ExtractVariables lub zasady AssignMessage.

    Jeśli na przykład dane formularza zawierają znak procentu (%) w niezmienionej postaci (bez kodowania) lub znak procentu (%), po którym występują nieprawidłowe znaki szesnastkowe w kluczu lub wartości, wystąpi ten błąd.

    Oto możliwe przyczyny tego błędu:

    Przyczyna Opis Instrukcje rozwiązywania problemów dotyczące
    Parametry formularza w żądaniu zawierają niedozwolone znaki Parametry formularza przekazywane w ramach żądania HTTP przez klienta zawierają wszelkie znaki, których nie wolno używać. 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 o odpowiedniej roli.
  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. Porównaj kod błędu z czasem.

  6. Wybierz komórkę z kodem błędu protocol.http.BadFormData, jak pokazano poniżej:

    (zobacz większy obraz)

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

    (zobacz większy obraz)

  8. Kliknij Wyświetl logi i rozwiń wiersz nieudanego żądania.

  9. W oknie Logi zwróć uwagę na te informacje:
    • Kod stanu: 500
    • Źródło błędu: proxy
    • Kod błędu: protocol.http.BadFormData
    • Zasady dotyczące błędów: extractvariables/EV-ExtractFormParams
  10. Jeśli źródło błędu to proxy, kod błędu ma wartość protocol.http.BadFormData, a zasada błędów nie jest pusta, oznacza to, że błąd wystąpił, gdy konkretna zasada wskazana w zasadzie błędów odczytuje lub wyodrębnia dane formularza (parametry formularza), które zawierają znaki, których nie wolno używać.
  11. W tym przykładzie X-Apigee-fault-policy ma wartość extractvariables/EV- ExtractFormParams, , co oznacza, że zasada ExtractVariables o nazwie EV-ExtractFormParams nie mogła odczytywać lub wyodrębniać parametrów formularza.

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:
    • Poczekaj na wystąpienie błędu 500 Internal Server Error lub
    • Jeśli możesz odtworzyć problem, wykonaj wywołanie interfejsu API, aby go odtworzyć. 500 Internal Server Error
  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. Ten błąd można zwykle znaleźć w jednej z zasad, tak jak poniżej:

    W powyższym przykładowym logu czasu błąd wystąpił w zasadzie ExtractVariables o nazwie EV-ExtractFormParams.

  6. Przejdź do procesu o nazwie Błąd po określonej zasadzie, która nie powiodła się:

  7. Zapisz te wartości ze logu czasu:

    błąd: Bad Form Data

    stan: PROXY_REQ_FLOW

    error.class: com.apigee.rest.framework.BadRequestException

    • Wartość błędu Bad Form Data wskazuje, że parametry formularza zawierają pewne znaki niedozwolone.
    • Wartość stanu PROXY_REQ_FLOW, wskazuje, że błąd wystąpił w przepływie żądania serwera proxy interfejsu API.
  8. Przejdź do fazy AX (rejestrowane dane Analytics) w logu czasu i kliknij ją.
  9. Przewiń w dół do sekcji Szczegóły fazyNagłówki błędów i ustal wartości X-Apigee-fault-code, X-Apigee-fault-source oraz X-Apigee-fault-policy, jak pokazano poniżej:

  10. Zwróć uwagę, że wartości X-Apigee-fault-code i X-Apigee-fault-source to odpowiednio protocol.http.BadFormData i policy, a X-Apigee-fault-policy nie jest puste. Oznacza to, że błąd wystąpił, gdy konkretna zasada wskazana w X-Apigee-fault-policy odczytuje lub wyodrębnia dane formularza (parametry formularza), które zawierają znaki, których nie wolno używać.

    Nagłówki odpowiedzi Wartość
    X-Apigee-fault-code protocol.http.BadFormData
    X-Apigee-fault-source policy
    X-Apigee-fault-policy extractvariables/EV-ExtractFormParams
  11. W tym przykładzie X-Apigee-fault-policy ma wartość extractvariables/EV- ExtractFormParams, , co oznacza, że zasada ExtractVariables o nazwie EV-ExtractFormParams nie mogła odczytywać lub wyodrębniać parametrów formularza.

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 do określenia kluczowych informacji o HTTP 500 Internal Server Error.
  2. Sprawdź logi dostępu do NGINX:

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

  3. Sprawdź, czy w danym okresie wystąpiły jakieś błędy 500 z kodem błędu protocol.http.BadFormData (jeśli problem wystąpił w przeszłości) lub czy są jakieś żądania, które nadal kończą się niepowodzeniem z 500.
  4. Jeśli znajdziesz błędy 500 z kodem X-Apigee-fault-code zgodnym z wartością protocol.http.BadFormData, ustal wartość źródeł błędów X-Apigee i X-Apigee-fault-policy.

    Przykładowy błąd 500 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-source:

    nagłówków, Wartość
    X-Apigee-fault-code protocol.http.BadFormData
    X-Apigee-fault-source policy
    X-Apigee-fault-policy extractvariables/EV-ExtractFormParams
  5. Zwróć uwagę, że wartości w polach X-Apigee-fault-code i X-Apigee-fault-source to protocol.http.BadFormData, policy i X-Apigee-fault-policy. Oznacza to, że błąd wystąpił, gdy konkretna zasada wskazana w X-Apigee-fault-policy, odczytuje lub wyodrębnia dane formularza (parametry formularza), które zawierają znaki, których X-Apigee-fault-policy, używać.
  6. W tym przykładzie X-Apigee-fault-policy ma wartość extractvariables/EV- ExtractFormParams, , co oznacza, że zasada ExtractZmienne o nazwie EV-ExtractFormParams nie powiodła się podczas odczytu parametrów formularza.

Przyczyna: parametry formularza w żądaniu zawierają niedozwolone znaki

Diagnostyka

  1. Określ kod błędu, źródło błędu i zasadę błędów dla usługi 500 Internal Server Error za pomocą monitorowania interfejsów 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 protocol.http.BadFormData, źródło błędu ma wartość proxy lub policy, a zasada błędów nie jest pusta, oznacza to, że zasada określona w zasadzie błędów nie powiodła się podczas odczytywania lub wyodrębniania danych formularza (parametrów formularza).
  3. Sprawdź zasady wskazane w zasadach dotyczących błędów i określ te informacje:
    1. Źródło: określa, czy zasada odczytuje czy wyodrębnia dane z żądania lub odpowiedzi.
    2. Parametry formularza: określają konkretne parametry formularza odczytywane w zasadach.

      Przykład 1

      Przykład 1. Zasady wyodrębniania parametrów formularza:

            <ExtractVariables name="EV-ExtractFormParms">
               <DisplayName>EV-ExtractFormParams</DisplayName>
               <Source>request</Source>
               <FormParam name="username">
                  <Pattern ignoreCase="false">{username}</Pattern>
               </FormParam>
               <FormParam name="password">
                 <Pattern ignoreCase="false">{password}</Pattern>
               </FormParam>
               <VariablePrefix>forminfo</VariablePrefix>
             <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables>
            </ExtractVariables>
            

      W powyższej zasadzie ExtractVariables:

      • Źródło: request

        Jest to określone przez element <Source>

      • Parametry formularza: username i password

        Wskazuje to element <Pattern> w elemencie <FormParam>

      Oznacza to, że parametry formularza username lub password przekazane w ramach żądania HTTP przez klienta do Apigee Edge zawierają znaki, które nie są dozwolone.

      Przykład 2

      Przykład 2. Kopiowanie parametrów formularza w ramach zasady AssignMessage:

            <AssignMessage continueOnError="false" enabled="true" name="AM-CopyFormParams">
              <Copy source="request">
                <FormParams>
                  <FormParam name="username"/>
                  <FormParam name="password"/>
                </FormParams>
              </Copy>
              <AssignTo createNew="true" transport="http" type="request"/>
            </AssignMessage>
            

      W powyższej zasadzie ExtractVariables:

      • Źródło: request

        Wskazuje na to atrybut source w elemencie <Copy>

      • Parametry formularza: username i password

        Wskazuje na to atrybut name w elemencie <FormParam>

      Oznacza to, że parametry formularza username, password lub oba przekazane w ramach żądania HTTP przez klienta do Apigee Edge zawierają wszelkie znaki, które nie są dozwolone.

  4. Sprawdź, czy w parametrach formularza określonych w kroku 3 są jakieś znaki niedozwolone, korzystając z jednej z tych metod:

    Narzędzie do śledzenia

    Aby sprawdzić poprawność danych za pomocą narzędzia Trace:

    1. Jeśli udało Ci się zarejestrować dane śledzenia dla nieudanego żądania w sposób opisany w najczęstszych krokach diagnostyki, wybierz jedno z nieudanych żądań.
    2. Jeśli okaże się, że parametry formularza zawierające wszelkie znaki niedozwolone są częścią żądania HTTP w kroku 3 powyżej,
      1. Przejdź do etapu Prośba otrzymane od klienta.
      2. Przewiń w dół do sekcji Szczegóły etapu i sprawdź Prośba o treść.

        ( wyświetl większy obraz)

      3. W powyższym przykładzie parametr formularza password zawiera znak procentu (%).
      4. Znak procentu (%) jest też używany do kodowania znaków specjalnych, więc nie można go użyć w danych formularza w takiej postaci.
      5. Dlatego Apigee Edge w odpowiedzi wysyła 500 Internal Server Error z kodem błędu protocol.http.BadFormData.

    Rzeczywista prośba

    Aby sprawdzić poprawność za pomocą rzeczywistego żądania:

    1. Jeśli nie masz dostępu do rzeczywistego żądania wysłanego do serwera docelowego, przejdź do sekcji Rozwiązanie.
    2. Jeśli masz dostęp do rzeczywistego żądania wysłanego do Apigee Edge, wykonaj te czynności:
      1. Sprawdź zawartość danych formularza i zobacz, czy zawierają znaki, które nie są dozwolone, np. znak procenta (%) lub procentu (%), po którym następują nieprawidłowe znaki szesnastkowe.

        Przykład 1

        Przykładowe żądanie 1. Dane formularza w ramach żądania

        curl -X GET "https://HOSTALIAS/myproxy -H "Content-Type: application/x-www-form-urlencoded" -d "client_id=123456abc123&client_secret=c23578%ZY"
        

        W tym przykładzie element client_secret zawiera znak procenta (%), po którym następuje nieprawidłowe znaki szesnastkowe ZY.

        Przykład 2

        Przykładowe żądanie 2. Dane formularza przekazywane w pliku:

        curl -X GET "https://HOSTALIAS/myproxy -H "Content-Type: application/x-www-form-urlencoded" -d @form_data.xml
        

        Zawartość pliku form_data.xml:

        xml=<user><username>abc1234@google.com</username><password>qwerty12345!@#$%</password></user>
        

        W tym przykładzie element password zawiera znak procentu (%), którego nie należy przekazywać w danych formularza.

    3. W powyższych 2 przykładach dane formularza wysyłane w ramach żądania HTTP do Apigee Edge zawierają znaki, które nie mogą być używane.
    4. Dlatego Apigee Edge w odpowiedzi wysyła 500 Internal Server Error z kodem błędu protocol.http.BadFormData.

Rozdzielczość

  1. Sprawdź, czy wszystkie znaki specjalne w kluczach i wartościach danych formularza lub parametrów wysyłanych w ramach żądania HTTP przez klienta są zawsze zakodowane w sposób opisany w sekcji Dane formularza – application/x-www-form-urlencoded.
  2. W przypadku powyższych przykładów możesz rozwiązać problemy w następujący sposób:

    Przykład 1

    Przykład 1. Dane formularza przekazywane w ramach żądania:

    Użyj prawidłowych znaków szesnastkowych pasujących do kodu ASCII określonego znaku. Jeśli na przykład chcesz wysłać znak dolara ($), użyj %24, jak pokazano poniżej:

    curl -X GET "https://HOSTALIAS/myproxy -H "Content-Type: application/x-www-form-urlencoded" -d "client_id=123456abc123&client_secret=c23578%24"
    

    Przykład 2

    Przykładowe żądanie 2. Dane formularza przekazywane w pliku:

    curl -X GET "https://HOSTALIAS/myproxy -H "Content-Type: application/x-www-form-urlencoded" -d @form_data.xml
    

    Zawartość pliku form_data.xml:

    Użyj kodowania procentowego znaku procenta (%). Spowoduje to zmianę pliku tak, aby zawierał %25 , jak pokazano poniżej:

    xml=<user><username>abc1234@google.com</username><password>qwerty12345!!@#$%25</password></user>
    

Specyfikacja

Apigee Edge wymaga, aby dane formularzy były wysyłane zgodnie z tymi specyfikacjami:

Specyfikacja
Dane formularza – application/x-www-form-urlencoded

Jeśli nadal będziesz potrzebować pomocy zespołu pomocy Apigee, przejdź do artykułu Wymagane jest zbieranie informacji diagnostycznych.

Musisz zebrać informacje diagnostyczne

Jeśli problem nie ustąpi mimo wykonania powyższych instrukcji, zbierz poniższe informacje diagnostyczne i 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 elementu 500 Internal Server Error z kodem błędu protocol.http.BadFormData
  • 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 interfejsu 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

Odniesienia