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
- Content-Type: application/x-www-form-urlencoded
- Jeśli dane formularza są małe, są wysyłane jako pary klucz-wartość z:
- Znaki w obu kluczach zakodowane zgodnie z zasadami omówionymi w Formularzach – 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 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 (%
).
- Jeśli dane formularza są małe, są wysyłane jako pary klucz-wartość z:
- 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:
- Żądanie HTTP wysłane przez klienta do Apigee Edge zawiera:
Content-Type: application/x-www-form-urlencoded
i- 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.
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:
- Zaloguj się w interfejsie Apigee Edge jako użytkownik o odpowiedniej roli.
Przełącz się na organizację, w której chcesz zbadać problem.
- Otwórz stronę Analiza > Monitorowanie interfejsów API > Zbadaj.
- Wybierz przedział czasu, w którym zaobserwowano błędy.
Porównaj kod błędu z czasem.
Wybierz komórkę z kodem błędu
protocol.http.BadFormData
, jak pokazano poniżej:Informacje o kodzie błędu
protocol.http.BadFormData
są wyświetlane jak 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 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ć. - 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:
- 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
- Poczekaj na wystąpienie błędu
Sprawdź, czy opcja Show all FlowInfos (Pokaż wszystkie informacje) jest włączona:
- Wybierz 1 z nieudanych żądań i sprawdź log czasu.
- Przejdź przez różne fazy śledzenia i znajdź miejsce błędu.
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
.Przejdź do procesu o nazwie Błąd po określonej zasadzie, która nie powiodła się:
- 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.
- Wartość błędu
- Przejdź do fazy AX (rejestrowane dane Analytics) w logu czasu i kliknij ją.
Przewiń w dół do sekcji Szczegóły fazy – Nagłó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:
Zwróć uwagę, że wartości X-Apigee-fault-code i X-Apigee-fault-source to odpowiednio
protocol.http.BadFormData
ipolicy
, 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
- W tym przykładzie X-Apigee-fault-policy ma wartość
extractvariables/EV- ExtractFormParams,
, co oznacza, że zasada ExtractVariables o nazwieEV-ExtractFormParams
nie mogła odczytywać lub wyodrębniać parametrów formularza.
NGINX
Aby zdiagnozować błąd przy użyciu logów dostępu NGINX:
- 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
. Sprawdź logi dostępu do NGINX:
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log
- Sprawdź, czy w danym okresie wystąpiły jakieś błędy
500
z kodem błęduprotocol.http.BadFormData
(jeśli problem wystąpił w przeszłości) lub czy są jakieś żądania, które nadal kończą się niepowodzeniem z500
. 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
- 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ć. - W tym przykładzie X-Apigee-fault-policy ma wartość
extractvariables/EV- ExtractFormParams,
, co oznacza, że zasada ExtractZmienne o nazwieEV-ExtractFormParams
nie powiodła się podczas odczytu parametrów formularza.
Przyczyna: parametry formularza w żądaniu zawierają niedozwolone znaki
Diagnostyka
- 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. - Jeśli kod błędu to
protocol.http.BadFormData
, źródło błędu ma wartośćproxy
lubpolicy
, 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). - Sprawdź zasady wskazane w zasadach dotyczących błędów i określ te informacje:
- Źródło: określa, czy zasada odczytuje czy wyodrębnia dane z żądania lub odpowiedzi.
- 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
ipassword
Wskazuje to element
<Pattern>
w elemencie<FormParam>
Oznacza to, że parametry formularza
username
lubpassword
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
ipassword
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.
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:
- 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ń.
- Jeśli okaże się, że parametry formularza zawierające wszelkie znaki niedozwolone są częścią żądania HTTP w kroku 3 powyżej,
- Przejdź do etapu Prośba otrzymane od klienta.
Przewiń w dół do sekcji Szczegóły etapu i sprawdź Prośba o treść.
- W powyższym przykładzie parametr formularza
password
zawiera znak procentu (%
). - 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. - Dlatego Apigee Edge w odpowiedzi wysyła
500 Internal Server Error
z 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 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 szesnastkoweZY
.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.
- Sprawdź zawartość danych formularza i zobacz, czy zawierają znaki, które nie są dozwolone, np. znak procenta (
- 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.
- Dlatego Apigee Edge w odpowiedzi wysyła
500 Internal Server Error
z kodem błęduprotocol.http.BadFormData
.
Rozdzielczość
- 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.
- 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 elementu500 Internal Server Error
z kodem błęduprotocol.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