Wyświetlasz dokumentację Apigee Edge.
Otwórz dokumentację Apigee X. info
Krótki opis problemu
Aplikacja kliencka otrzymuje kod stanu HTTP 500 Internal Server Error z kodem 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ć 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, wyjaśnijmy, czym są dane z formularza.
Dane formularza to informacje podane przez użytkownika, zwykle za pomocą formularza HTML zawierającego elementy takie jak okno do wprowadzania danych, przycisk lub pole wyboru. Dane z formularza są zazwyczaj przesyłane jako seria par klucz-wartość w ramach żądań lub odpowiedzi HTTP.
Przesyłanie danych z formularza
- Content-Type: application/x-www-form-urlencoded
- Jeśli rozmiar danych formularza jest mały, dane są wysyłane jako pary klucz-wartość z tymi elementami:
- Znaki w obu kluczach zakodowane zgodnie z zasadami opisanymi w 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"
- Wszystkie znaki inne niż alfanumeryczne w kluczach i wartościach są
zakodowane procentowo, tzn. są reprezentowane jako trójka znaków
%HHskładająca się ze znaku procenta i dwóch cyfr szesnastkowych reprezentujących kod ASCII danego znaku. - Dlatego nawet jeśli znak procenta (
%) jest dozwolony w danych formularza, jest on interpretowany jako początek specjalnej sekwencji ucieczki. Jeśli więc dane formularza mają zawierać znak procenta (%) w kluczu lub wartości, należy je przesłać jako%25,, co odpowiada kodowi ASCII znaku procenta (%).
- Jeśli rozmiar danych formularza jest mały, dane są wysyłane jako pary klucz-wartość z tymi elementami:
- Content-Type: multipart/form-data
Jeśli chcesz przesyłać duże ilości danych binarnych lub tekstu zawierającego znaki inne niż ASCII, możesz wysłać dane za pomocą
Content-Type:multipart/form-data, jak opisano w Formularze – sekcja 17.13.4.2.
Możliwe przyczyny
Ten błąd występuje tylko wtedy, gdy są spełnione wszystkie te warunki:
- Żądanie HTTP wysłane przez klienta do Apigee Edge zawiera:
Content-Type: application/x-www-form-urlencodedi- Dane formularza ze znakiem procenta (
%) lub znakiem procenta (%) po którym następują nieprawidłowe znaki szesnastkowe, które są niedozwolone zgodnie z Formularze – sekcja 17.13.4.1.
Serwer proxy interfejsu API w Apigee Edge odczytuje konkretne parametry formularza zawierające znaki, których nie można używać w przepływie żądania, za pomocą zasad ExtractVariables lub AssignMessage.
Ten błąd występuje na przykład, gdy dane formularza zawierają znak procenta (
%) w niezmienionej postaci (bez kodowania) lub znak procenta (%), po którym w kluczu lub wartości występują nieprawidłowe znaki szesnastkowe.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 przez klienta w ramach żądania HTTP zawierają znaki, których nie można używać. Użytkownicy publicznej i prywatnej chmury Edge
Typowe etapy diagnostyki
Aby zdiagnozować ten błąd, użyj jednego z tych narzędzi lub technik:
Monitorowanie interfejsów API
Aby zdiagnozować błąd za pomocą monitorowania interfejsu API:
- Zaloguj się w interfejsie Apigee Edge jako użytkownik z odpowiednią rolą.
Przełącz się na organizację, w której chcesz zbadać problem.
- Otwórz stronę Analiza > Monitorowanie interfejsu API > Zbadaj.
- Wybierz konkretny przedział czasowy, w którym wystąpiły błędy.
Wykreśl kod błędu na osi czasu.
Wybierz komórkę z kodem błędu
protocol.http.BadFormData, jak pokazano poniżej:
Informacje o kodzie błędu
protocol.http.BadFormDatasą wyświetlane w sposób pokazany poniżej:
Kliknij Wyświetl logi i rozwiń wiersz nieudanego żądania.
- W oknie Dzienniki zanotuj 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 ma wartośćprotocol.http.BadFormData, a Zasady dotyczące błędu nie są puste, oznacza to, że błąd wystąpił podczas odczytywania lub wyodrębniania danych z formularza (parametrów formularza) przez konkretne zasady wskazane w polu Zasady dotyczące błędu. Dane te zawierają znaki, których nie można używać. - W tym przykładzie wartość X-Apigee-fault-policy to
extractvariables/EV- ExtractFormParams,, co oznacza, że zasada ExtractVariables o nazwie EV-ExtractFormParams nie działała prawidłowo podczas odczytywania lub wyodrębniania parametrów formularza.
Narzędzie śledzenia
Aby zdiagnozować błąd za pomocą narzędzia Trace:
- Włącz śledzenie sesji i wybierz jedną z tych opcji:
- Poczekaj na wystąpienie błędu
500 Internal Server Errorlub - Jeśli możesz odtworzyć problem, wykonaj wywołanie interfejsu API, aby go odtworzyć.
500 Internal Server Error
- Poczekaj na wystąpienie błędu
Sprawdź, czy opcja Pokaż wszystkie informacje o przepływach jest włączona:
- Wybierz jedno z nieudanych żądań i sprawdź ślad.
- Przeglądaj różne fazy śledzenia i sprawdź, gdzie wystąpił błąd.
Błąd zwykle występuje w jednych z zasad, jak pokazano poniżej:
W powyższym przykładowym śledzeniu zwróć uwagę, że błąd wystąpił w zasadach ExtractVariables o nazwie
EV-ExtractFormParams.Otwórz przepływ o nazwie Error po konkretnej zasadzie, która nie została spełniona:
- Zapisz te wartości ze śladu:
błąd:
Bad Form Datastate:
PROXY_REQ_FLOWerror.class:
com.apigee.rest.framework.BadRequestException- Wartość błędu
Bad Form Datawskazuje, że parametry formularza zawierały znaki, których nie można używać. - Wartość stanu
PROXY_REQ_FLOW,wskazuje, że błąd wystąpił w przepływie żądania serwera proxy interfejsu API.
- Wartość błędu
- W śladzie przejdź do fazy AX (Analytics Data Recorded) i kliknij ją.
Przewiń w dół do sekcji Szczegóły fazy – Nagłówki błędów i określ wartości X-Apigee-fault-code, X-Apigee-fault-source i X-Apigee-fault-policy, jak pokazano poniżej:
Pamiętaj, że wartości X-Apigee-fault-code i X-Apigee-fault-source to odpowiednio
protocol.http.BadFormDataipolicy, a X-Apigee-fault-policy nie jest puste. Oznacza to, że błąd wystąpił, gdy zasada wskazana w nagłówku X-Apigee-fault-policy odczytywała lub wyodrębniała dane formularza (parametry formularza), które zawierały znaki niedozwolone do użycia.Nagłówki odpowiedzi Wartość X-Apigee-fault-code protocol.http.BadFormDataX-Apigee-fault-source policyX-Apigee-fault-policy extractvariables/EV-ExtractFormParams- W tym przykładzie X-Apigee-fault-policy to
extractvariables/EV- ExtractFormParams,, co oznacza, że zasada ExtractVariables o nazwieEV-ExtractFormParamsnie powiodła się podczas odczytywania lub wyodrębniania parametrów formularza.
NGINX
Aby zdiagnozować błąd za pomocą dzienników dostępu NGINX:
- Jeśli jesteś użytkownikiem chmury prywatnej, możesz używać dzienników dostępu NGINX, aby określać kluczowe informacje o żądaniach HTTP
500 Internal Server Error. Sprawdź logi dostępu NGINX:
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log- Sprawdź, czy w określonym czasie (jeśli problem wystąpił w przeszłości) nie ma
500błędów z kodem błęduprotocol.http.BadFormDatalub czy nadal występują błędy w żądaniach z kodem500. Jeśli znajdziesz błędy
500, w których X-Apigee-fault-code ma wartośćprotocol.http.BadFormData, sprawdź wartości X-Apigee-fault-source i X-Apigee-fault-policy.Przykładowy błąd 500 z dziennika dostępu NGINX:
Powyższy przykładowy wpis z dziennika dostępu NGINX zawiera te wartości dla X-Apigee-fault-code i X-Apigee-fault-source:
Nagłówki Wartość X-Apigee-fault-code protocol.http.BadFormDataX-Apigee-fault-source policyX-Apigee-fault-policy extractvariables/EV-ExtractFormParams- Pamiętaj, że wartości X-Apigee-fault-code i X-Apigee-fault-source to odpowiednio
protocol.http.BadFormDataipolicy, a wartość X-Apigee-fault-policy nie jest pusta. Oznacza to, że błąd wystąpił, gdy zasada wskazana w nagłówku X-Apigee-fault-policy odczytywała lub wyodrębniała dane formularza (parametry formularza), które zawierały znaki niedozwolone. - W tym przykładzie wartość X-Apigee-fault-policy to
extractvariables/EV- ExtractFormParams,, co oznacza, że zasada ExtractVariables o nazwieEV-ExtractFormParamsnie powiodła się podczas odczytywania parametrów formularza.
Przyczyna: parametry formularza w żądaniu zawierają niedozwolone znaki
Diagnostyka
- Określ kod błędu, źródło błędu i zasady dotyczące błędu dla
500 Internal Server Errorza pomocą monitorowania interfejsu API, narzędzia do śledzenia lub dzienników dostępu NGINX zgodnie z opisem w typowych krokach diagnostycznych. - Jeśli Fault Code ma wartość
protocol.http.BadFormData, Fault Source ma wartośćproxylubpolicy, a Fault Policy nie jest puste, oznacza to, że zasada określona w Fault Policy nie została spełniona podczas odczytywania lub wyodrębniania danych z formularza (parametrów formularza). - Sprawdź zasady wskazane w sekcji Fault Policy i określ te informacje:
- Źródło: określ, czy zasady odczytują lub wyodrębniają dane z żądania czy z odpowiedzi.
- Parametry formularza: określ konkretne parametry formularza, które są odczytywane w zasadach.
Próbka 1
Przykład 1. Zasada ExtractVariables wyodrębniająca parametry 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 zasadach ExtractVariables powyżej:
Źródło:
requestWskazuje na to element
<Source>.Parametry formularza:
usernameipasswordWskazuje to element
<Pattern>w elemencie<FormParam>.
Oznacza to, że parametry formularza
usernamelubpasswordprzekazane w ramach żądania HTTP przez klienta do Apigee Edge zawierają znaki, których nie można używać.Próbka 2
Przykład 2. Kopiowanie parametrów formularza przez 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 zasadach ExtractVariables powyżej:
Źródło:
requestWskazuje to atrybut
sourcew elemencie<Copy>.Parametry formularza:
usernameipasswordWskazuje to atrybut
namew elemencie<FormParam>.
Oznacza to, że parametry formularza
usernamelubpasswordalbo oba przekazane w ramach żądania HTTP przez klienta do Apigee Edge zawierają znaki, których nie można używać.
Sprawdź, czy w parametrach formularza zidentyfikowanych w kroku 3 nie ma niedozwolonych znaków, korzystając z jednej z tych metod:
Narzędzie śledzenia
Aby przeprowadzić weryfikację za pomocą narzędzia Śledzenie:
- Jeśli udało Ci się zarejestrować log czasu nieudanego żądania zgodnie z instrukcjami w sekcji Typowe czynności diagnostyczne, wybierz jedno z nieudanych żądań.
- Jeśli okaże się, że parametry formularza zawierające znaki, których nie można używać, są częścią żądania HTTP w kroku 3 powyżej, wykonaj następujące czynności:
- Przejdź do etapu Prośba otrzymana od klienta.
Przewiń w dół do sekcji Szczegóły etapu i sprawdź Prośbę o treści.
- W powyższym przykładzie zwróć uwagę, że parametr formularza
passwordzawiera znak procenta (%). - Znak procenta (
%) jest też używany do kodowania procentowego znaków specjalnych, więc nie można go używać w danych formularza w niezmienionej postaci. - Dlatego Apigee Edge odpowiada kodem stanu
500 Internal Server Errori kodem błęduprotocol.http.BadFormData.
Rzeczywista prośba
Aby sprawdzić poprawność za pomocą rzeczywistego żądania:
- Jeśli nie masz dostępu do rzeczywistego żądania wysłanego do serwera docelowego, przejdź do sekcji Rozwiązanie.
- Jeśli masz dostęp do rzeczywistego żądania wysłanego do Apigee Edge, wykonaj te czynności:
- Sprawdź zawartość danych formularza i zobacz, czy zawiera ona znaki, których nie można używać, np. znak procenta (
%) lub znak procenta (%), po którym następują nieprawidłowe znaki szesnastkowe.Próbka 1
Przykładowe żądanie 1. Dane z formularza jako część żą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 zwróć uwagę, że element
client_secretzawiera znak procenta (%), po którym występują nieprawidłowe znaki szesnastkoweZY.Próbka 2
Przykładowe żądanie 2. Dane z 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 zwróć uwagę, że element
passwordzawiera znak procenta (%), który nie powinien być przekazywany w danych formularza w niezmienionej postaci.
- Sprawdź zawartość danych formularza i zobacz, czy zawiera ona znaki, których nie można używać, np. znak procenta (
- W obu powyższych przykładach dane formularza wysyłane w ramach żądania HTTP do Apigee Edge zawierają znaki, których nie można używać.
- Dlatego Apigee Edge odpowiada kodem
500 Internal Server Errorz kodem błęduprotocol.http.BadFormData.
Rozdzielczość
- Upewnij się, że wszystkie znaki specjalne w kluczach i wartościach danych formularza lub parametrów wysyłanych w ramach żądania HTTP przez klienta są zawsze kodowane zgodnie z opisem w sekcji Dane formularza – application/x-www-form-urlencoded.
- W przypadku omówionych powyżej przykładów możesz rozwiązać problemy w ten sposób:
Próbka 1
Przykład 1. Dane z formularza przekazywane w ramach żądania:
Używaj prawidłowych znaków szesnastkowych, które odpowiadają kodowi 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"
Próbka 2
Przykładowe żądanie 2. Dane z 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 dla znaku procenta (
%), czyli zmodyfikuj plik tak, aby zawierał%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ą przesyłane zgodnie z tymi specyfikacjami:
| Specyfikacja |
|---|
| Dane formularza – application/x-www-form-urlencoded |
Jeśli nadal potrzebujesz pomocy zespołu pomocy Apigee, zapoznaj się z sekcją Informacje diagnostyczne, które musisz zebrać.
musi zbierać informacje diagnostyczne;
Jeśli problem nadal występuje po wykonaniu powyższych instrukcji, zbierz te 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 proxy interfejsu API
- Użyto polecenia
curl, aby odtworzyć500 Internal Server Errorz kodem błęduprotocol.http.BadFormData - Plik śledzenia żądań do interfejsu API
Jeśli jesteś użytkownikiem chmury Private Cloud, podaj te informacje:
- Pełny komunikat o błędzie dotyczący żądań, które nie zostały zrealizowane
- Nazwa środowiska
- pakiet proxy interfejsu API,
- Plik śledzenia żądań do interfejsu API
Logi dostępu NGINX
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_logGdzie: 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