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

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

Krótki opis problemu

Aplikacja kliencka otrzymuje kod stanu HTTP 500 Internal Server Error z kod błędu protocol.http.BadFormData w odpowiedzi na wywołania interfejsu API.

Komunikat o błędzie

Aplikacja kliencka otrzymuje ten kod odpowiedzi:

HTTP/1.1 500 Internal Server Error

Możesz też zobaczyć następujący 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, wyjaśnijmy, czym są dane formularzy.

Dane formularzy to informacje podawane przez użytkownika, zazwyczaj za pomocą formularza HTML zawierającego elementy np. pole do wprowadzania tekstu, przycisk lub pole wyboru. Dane formularza są zwykle wysyłane jako seria par klucz-wartość w żądaniach lub odpowiedziach HTTP.

Przenoszenie danych formularzy

  1. Content-Type: application/x-www-form-urlencoded
    • Jeśli rozmiar danych formularza jest mały, są one wysyłane w postaci par 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"
      
    • Wszelkie znaki inne niż alfanumeryczne w kluczach i wartościach są zakodowanych procentowo, czyli są reprezentowane jako triole %HH składający się ze znaku procenta, po którym występują dwie cyfry szesnastkowe reprezentujący kod ASCII danego znaku.
    • Dlatego, mimo że znak procentu (%) jest dozwolony w danych formularza, jest on jednak interpretowane jako początek specjalnej sekwencji zmiany znaczenia. Dlatego, jeśli dane formularza muszą zawierają znak procentu (%) w kluczu lub wartości, powinien zostać przesłany. jako %25, , która reprezentuje kod ASCII znaku procenta (%).
  2. Typ treści: dane wieloczęściowe/dane formularzy

    Jeśli chcesz przesyłać duże ilości danych binarnych lub tekstu zawierającego znaki spoza zestawu ASCII znaków, możesz wysłać dane wraz z Content-Type: multipart/dane-form, jak wyjaśniono w . Formularze – sekcja 17.13.4.2

Możliwe przyczyny

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

  1. Żądanie HTTP wysłane przez klienta do Apigee Edge:
    1. Content-Type: application/x-www-form-urlencoded i
    2. Dane formularza ze znakiem procentu (%) lub znakiem procenta (%), po których występują nieprawidłowe znaki szesnastkowe, które są niedozwolone w Formularze – artykuł 17.13.4.1.
  2. Serwer proxy interfejsu API w Apigee Edge odczytuje określone parametry formularza zawierające dowolne znaki których nie wolno używać w procesie żądania za pomocą funkcji ExtractZmienne lub Zasada AssignMessage.

    Jeśli na przykład dane formularza zawierają znak procentu (%) w niezmienionej formie (bez kodowanie), lub znak procentu (%), po którym występują nieprawidłowe wartości szesnastkowe znaków 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ą takich jak te znaki, które są niedozwolone do używania. 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 odpowiedniej roli.
  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. Porównaj Kod błędu z czasem.

  6. Wybierz komórkę, która ma kod błędu protocol.http.BadFormData jako poniżej:

    (wyświetl większy obraz)

  7. Informacje o kodzie błędu protocol.http.BadFormData to Jak pokazano poniżej:

    (wyświetl 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 ma wartość proxy, Kod błędu to Pole protocol.http.BadFormData oraz Zasady dotyczące błędów nie są puste, wskazuje, że błąd wystąpił, gdy określona zasada wskazana w polu Błąd Policy odczytał lub wyodrębnił dane formularza (parametry formularza), które zawierają jakiekolwiek takich jak te znaki, które są niedozwolone do używania.
  11. W tym przykładzie X-Apigee-fault-policy to extractvariables/EV- ExtractFormParams, , co oznacza, że zasada ExtractZmienne o nazwie Podczas odczytu lub wyodrębniania formularza wystąpił błąd EV-ExtractFormParams .

Narzędzie śledzenia

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

  1. Włącz sesję śledzenia. oraz:
    • Poczekaj, aż wystąpi błąd 500 Internal Server Error lub
    • Jeśli możesz odtworzyć problem, wykonaj wywołanie interfejsu API, aby odtworzyć problem. 500 Internal Server Error
  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 zwykle występuje w jednej z tych zasad:

    W powyższym przykładowym logu czasu błąd wystąpił w Zasada Wyodrębnianie zmiennych o nazwie EV-ExtractFormParams.

  6. Przejdź do procesu o nazwie Error (Błąd) po konkretnej zasadzie, w której wystąpił błąd:

  7. Zanotuj 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 oznacza, że formularz Zawierały one znaki, których nie wolno używać.
    • Wartość stanu PROXY_REQ_FLOW, wskazuje, że wystąpił błąd w przepływie żądania serwera proxy interfejsu API.
  8. Przejdź do fazy AX (zarejestrowane dane Analytics) w śledzeniu i kliknij .
  9. Przewiń w dół do sekcji Szczegóły etapuNagłówki błędów. określać wartości X-Apigee-fault-code, X-Apigee-fault-source, i X-Apigee-fault-policy jak poniżej:

  10. Zwróć uwagę na 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 pusta. Oznacza to, że błąd miało miejsce, gdy konkretna zasada wskazana w zasadzie X-Apigee-fault-policy była odczytywanie lub wyodrębnianie danych formularza (parametrów formularza), które zawierają jakiekolwiek znaki nie mogą być używane.

    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 to extractvariables/EV- ExtractFormParams, , co oznacza, że dla nazwy zasady Extractvariables Nie udało się odczytać lub wyodrębnić formularza (EV-ExtractFormParams) .

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ślić kluczowe informacje o tagu HTTP 500 Internal Server Error.
  2. Sprawdź logi dostępu NGINX:

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

  3. Wyszukaj błędy (500) z kodem błędu protocol.http.BadFormData w określonym czasie (jeśli problem występuje) w przeszłości) lub jeśli jakieś żądania nadal kończą się niepowodzeniem 500
  4. Jeśli znajdziesz błędy 500 z kodem błędu X-Apigee-fault-code pasujące do wartości protocol.http.BadFormData, a następnie określić wartość źródła X-Apigee-fault-source oraz X-Apigee-fault-policy.

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

    Nagłówki Wartość
    X-Apigee-fault-code protocol.http.BadFormData
    X-Apigee-fault-source policy
    X-Apigee-fault-policy extractvariables/EV-ExtractFormParams
  5. Zwróć uwagę na wartości X-Apigee-fault-code i X-Apigee-fault-source to protocol.http.BadFormData, policy odpowiednio a X-Apigee-fault-policy nie jest pusta. Oznacza to, że błąd miało miejsce,gdy konkretna zasada określona w zasadzie X-Apigee-fault-policy, była odczytywanie lub wyodrębnianie danych formularza (parametrów formularza), które zawierają jakiekolwiek znaki nie mogą być używane.
  6. W tym przykładzie X-Apigee-fault-policy to extractvariables/EV- ExtractFormParams, , co oznacza, że dla nazwy zasady Extractvariables Podczas odczytywania formularza nie udało się wykonać czynności EV-ExtractFormParams .

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

Diagnostyka

  1. Określ kod błędu, źródło błędu i zasadę błędu dla 500 Internal Server Error przy użyciu monitorowania interfejsów API, narzędzia Trace lub logów dostępu NGINX zgodnie z objaśnieniem Częste kroki diagnostyki.
  2. Jeśli Kod błędu ma wartość protocol.http.BadFormData, Źródło błędu ma wartość wartość proxy lub policy, a zasada błędów nie jest- pusty, oznacza to, że zasada określona w zasadzie błędów zakończyła się niepowodzeniem podczas odczytywanie lub wyodrębnianie danych formularza (parametry formularza).
  3. Zapoznaj się z zasadami wymienionymi w zasadach dotyczących błędów i określ: informacje:
    1. Źródło:określ, czy zasada odczytuje czy wyodrębnia dane. żądania lub odpowiedzi.
    2. Parametry formularza: określ parametry formularza, które są odczytywane w .

      Przykład 1

      Przykład 1. Zasady wyodrębniania zmiennych w formularzu:

            <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 sygnalizowane przez element <Source>

      • Parametry formularza: username i password

        Jest to sygnalizowane przez element <Pattern> w parametrze Element <FormParam>

      Oznacza to, że parametry formularza username lub password przekazana przez klienta w ramach żądania HTTP do Apigee Edge zawiera znaki, których nie wolno używać.

      Przykład 2

      Przykład 2. Parametry formularza kopiowania zasad 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

        Jest to wskazywane przez atrybut source w Element <Copy>

      • Parametry formularza: username i password

        Jest to wskazywane przez atrybut name w Element <FormParam>

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

  4. Sprawdź, czy są jakieś znaki, których nie wolno używać. użyte znaki w parametrach formularza zidentyfikowanych w kroku 3, korzystając z jednej z tych metod:

    Narzędzie śledzenia

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

    1. Jeśli masz zarejestrowany ślad dla nieudanego żądania, tak jak to opisano w sekcji Typowe kroki diagnostyki, a następnie wybierz jeden z nieudanych żądań.
    2. Jeśli okaże się, że parametry formularza zawierające jakiekolwiek znaki które nie mogą być używane, są częścią żądania HTTP w krok 3 powyżej, a potem
      1. Przejdź do etapu Prośba otrzymana od klienta.
      2. Przewiń w dół do sekcji Etapy i sprawdź Poproś o treści.

        ( wyświetl większy obraz)

      3. W powyższym przykładzie zwróć uwagę, że parametr formularza password zawiera znak procenta (%).
      4. Ponieważ znak procentu (%) jest używany również do argumentu procentowego kodowania znaków specjalnych, nie można go użyć w takiej postaci, w jakiej jest dane formularza.
      5. Dlatego Apigee Edge przekazuje odpowiedź 500 Internal Server Error z kodem błędu protocol.http.BadFormData

    Rzeczywiste żądanie

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

    1. Jeśli nie masz dostępu do rzeczywistego żądania wysłanego do serwera docelowego, i wybierz Rozwiązanie.
    2. Jeśli masz dostęp do rzeczywistego żądania wysłanego do Apigee Edge, wykonaj te kroki:
      1. Sprawdź, czy dane formularza zawierają znaki, które nie są dozwolone, np. znak procenta (%) lub znak procentu (%), po którym następuje nieprawidłowa znaków szesnastkowych.

        Przykład 1

        Przykładowe żądanie 1. Dane z formularza stanowią część prośby

        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 procentu (%), 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 stosować przekazywane w niezmienionej formie w danych formularza.

    3. W 2 powyższych przykładach dane formularzy wysyłane w ramach żądania HTTP do Apigee Edge zawiera znaki, których nie wolno używać.
    4. Dlatego Apigee Edge odpowiada następującym poleceniem: 500 Internal Server Error z kodem błędu protocol.http.BadFormData.

Rozdzielczość

  1. Upewnij się, że wszelkie znaki specjalne zarówno w kluczach, jak i wartościach w danych formularza lub parametrach wysyłane w ramach żądania HTTP przez klienta są zawsze kodowane zgodnie z opisem w sekcji Dane formularzy – application/x-www-form-urlencoded
  2. W przykładach opisanych powyżej możesz rozwiązać problemy w ten sposób:

    Przykład 1

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

    Użyj prawidłowych wartości znaki szesnastkowe, które pasują do kodu ASCII określonego znaku. Jeśli na przykład chcesz przesłać znak dolara ($), użyj metody %24 jak 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 kodowanie procentowe dla znaku procentu (%), czyli zmiany w pliku na mają %25 jak pokazano poniżej:

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

Specyfikacja

Apigee Edge oczekuje, że dane formularza będą wysyłane zgodnie z tymi specyfikacjami:

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

Jeśli nadal potrzebujesz pomocy zespołu pomocy Apigee, przejdź do sekcji Musisz zebrać informacje diagnostyczne.

Musi zbierać informacje diagnostyczne

Jeśli po wykonaniu powyższych czynności problem nie ustąpi, zwróć uwagę na 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 500 Internal Server Error z kodem błędu protocol.http.BadFormData
  • 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 serwerów 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.

  • Logi systemowe procesora wiadomości

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

Pliki referencyjne