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
- 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:
- Znaki w obu kluczach zakodowane zgodnie z regułami opisanymi na Formularze – sekcja 17.13.4.1
- Nagłówek
Content-Type: application/x-www-form-urlencoded
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 (%
).
- Jeśli rozmiar danych formularza jest mały, są one wysyłane w postaci par klucz-wartość z:
- 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:
- Żądanie HTTP wysłane przez klienta do Apigee Edge:
Content-Type: application/x-www-form-urlencoded
i- 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.
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:
- Zaloguj się w interfejsie Apigee Edge jako użytkownik z odpowiedniej roli.
Przełącz się na organizację, w której chcesz zbadać problem.
- Przejdź do przycisku Analiza > Monitorowanie interfejsów API > Zbadaj stronę.
- Wybierz okres, w którym zaobserwowano błędy.
Porównaj Kod błędu z czasem.
Wybierz komórkę, która ma kod błędu
protocol.http.BadFormData
jako poniżej:Informacje o kodzie błędu
protocol.http.BadFormData
to Jak pokazano poniżej:Kliknij Wyświetl logi i rozwiń wiersz nieudanego żądania.
- 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
- Kod stanu:
- Jeśli Źródło błędu ma wartość
proxy
, Kod błędu to Poleprotocol.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. - 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:
- 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
- Poczekaj, aż wystąpi błąd
Sprawdź, czy opcja Show all FlowInfos jest włączona:
- Wybierz jedno z nieudanych żądań i sprawdź log czasu.
- Przejdź przez różne fazy śledzenia i znajdź miejsca, w których wystąpił błąd .
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
.Przejdź do procesu o nazwie Error (Błąd) po konkretnej zasadzie, w której wystąpił błąd:
- 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.
- Wartość błędu
- Przejdź do fazy AX (zarejestrowane dane Analytics) w śledzeniu i kliknij .
Przewiń w dół do sekcji Szczegóły etapu – Nagłówki błędów. określać wartości X-Apigee-fault-code, X-Apigee-fault-source, i X-Apigee-fault-policy jak poniżej:
Zwróć uwagę na wartości X-Apigee-fault-code i X-Apigee-fault-source to odpowiednio
protocol.http.BadFormData
ipolicy
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
- 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:
- 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
. Sprawdź logi dostępu NGINX:
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log
- Wyszukaj błędy (
500
) z kodem błęduprotocol.http.BadFormData
w określonym czasie (jeśli problem występuje) w przeszłości) lub jeśli jakieś żądania nadal kończą się niepowodzeniem500
Jeśli znajdziesz błędy
500
z kodem błędu X-Apigee-fault-code pasujące do wartościprotocol.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
- 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. - 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ściEV-ExtractFormParams
.
Przyczyna: parametry formularza w żądaniu zawierają niedozwolone znaki
Diagnostyka
- 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. - Jeśli Kod błędu ma wartość
protocol.http.BadFormData
, Źródło błędu ma wartość wartośćproxy
lubpolicy
, 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). - Zapoznaj się z zasadami wymienionymi w zasadach dotyczących błędów i określ:
informacje:
- Źródło:określ, czy zasada odczytuje czy wyodrębnia dane. żądania lub odpowiedzi.
- 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
ipassword
Jest to sygnalizowane przez element
<Pattern>
w parametrze Element<FormParam>
Oznacza to, że parametry formularza
username
lubpassword
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
ipassword
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.
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:
- 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ń.
- 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
- Przejdź do etapu Prośba otrzymana od klienta.
Przewiń w dół do sekcji Etapy i sprawdź Poproś o treści.
- W powyższym przykładzie zwróć uwagę, że parametr formularza
password
zawiera znak procenta (%
). - 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. - Dlatego Apigee Edge przekazuje odpowiedź
500 Internal Server Error
z kodem błęduprotocol.http.BadFormData
Rzeczywiste żądanie
Aby przeprowadzić weryfikację na podstawie rzeczywistego żądania:
- Jeśli nie masz dostępu do rzeczywistego żądania wysłanego do serwera docelowego, i wybierz Rozwiązanie.
- Jeśli masz dostęp do rzeczywistego żądania wysłanego do Apigee Edge, wykonaj
te kroki:
- 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.
- Sprawdź, czy dane formularza zawierają znaki, które
nie są dozwolone, np. znak procenta (
- 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ć.
- Dlatego Apigee Edge odpowiada następującym poleceniem:
500 Internal Server Error
z kodem błęduprotocol.http.BadFormData
.
Rozdzielczość
- 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
- 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 odtworzenia500 Internal Server Error
z kodem błęduprotocol.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