Sie lesen gerade die Dokumentation zu Apigee Edge.
Apigee X-Dokumentation aufrufen info
Symptom
Die Clientanwendung erhält den HTTP-Statuscode 500 Internal Server Error mit dem Fehlercode protocol.http.BadFormData als Antwort auf API-Aufrufe.
Fehlermeldung
Die Clientanwendung erhält den folgenden Antwortcode:
HTTP/1.1 500 Internal Server Error
Außerdem wird möglicherweise die folgende Fehlermeldung angezeigt:
{
"fault":{
"faultstring":"Bad Form Data",
"detail":{
"errorcode":"protocol.http.BadFormData"
}
}
}Formulardaten
Bevor wir uns mit der Fehlerbehebung dieses Problems befassen, wollen wir uns ansehen, was Formulardaten sind.
Formulardaten sind die Informationen, die der Nutzer in der Regel über ein HTML-Formular mit Elementen wie einem Texteingabefeld, einer Schaltfläche oder einem Kästchen bereitstellt. Die Formulardaten werden in der Regel als Reihe von Schlüssel/Wert-Paaren im Rahmen von HTTP-Anfragen oder -Antworten gesendet.
Übertragung von Formulardaten
- Content-Type: application/x-www-form-urlencoded
- Wenn die Größe der Formulardaten gering ist, werden die Daten als Schlüssel/Wert-Paare mit Folgendem gesendet:
- Die Zeichen in beiden Schlüsseln sind gemäß den Regeln in Formulare – Abschnitt 17.13.4.1 codiert.
- Der Header
Content-Type: application/x-www-form-urlencoded
Beispielanfrage mit Formulardaten:
curl https://HOSTALIAS/somepath -H "Content-Type: application/x-www-form-urlencoded" -d "username=abc@google.com&pasword=secret123"
- Alle nicht alphanumerischen Zeichen in Schlüsseln und Werten werden
prozentcodiert. Das heißt, sie werden als Zeichentriplett
%HHdargestellt, das aus einem Prozentzeichen gefolgt von zwei Hexadezimalziffern besteht, die den ASCII-Code des jeweiligen Zeichens darstellen. - Auch wenn das Prozentzeichen (
%) in den Formulardaten zulässig ist, wird es als Beginn einer speziellen Escape-Sequenz interpretiert. Wenn die Formulardaten also das Prozentzeichen (%) im Schlüssel oder Wert enthalten müssen, sollte es als%25,übertragen werden. Das ist der ASCII-Code für das Prozentzeichen (%).
- Wenn die Größe der Formulardaten gering ist, werden die Daten als Schlüssel/Wert-Paare mit Folgendem gesendet:
- Content-Type: multipart/form-data
Wenn Sie große Mengen an Binärdaten oder Text mit Nicht-ASCII-Zeichen übertragen möchten, können Sie die Daten mit
Content-Type:multipart/form-data senden, wie in Formulare – Abschnitt 17.13.4.2 beschrieben.
Mögliche Ursachen
Dieser Fehler tritt nur dann auf, wenn alle folgenden Bedingungen erfüllt sind:
- Die HTTP-Anfrage, die vom Client an Apigee Edge gesendet wird, enthält Folgendes:
Content-Type: application/x-www-form-urlencodedund- Formulardaten mit dem Prozentzeichen (
%) oder dem Prozentzeichen (%), gefolgt von ungültigen Hexadezimalzeichen, die nicht gemäß der Formulare – Abschnitt 17.13.4.1 zulässig sind.
Der API-Proxy in Apigee Edge liest die spezifischen Formularparameter, die alle Zeichen enthalten, die nicht mit der ExtractVariables- oder der AssignMessage-Richtlinie im Anfrageablauf verwendet werden dürfen.
Dieser Fehler tritt beispielsweise auf, wenn die Formulardaten das Prozentzeichen (
%) unverändert (ohne Codierung) oder das Prozentzeichen (%) gefolgt von ungültigen Hexadezimalzeichen im Schlüssel und/oder Wert enthalten.Mögliche Ursachen für diesen Fehler:
Ursache Beschreibung Anleitungen zur Fehlerbehebung gelten für Formularparameter in der Anfrage enthalten unzulässige Zeichen Die Formularparameter, die vom Client als Teil der HTTP-Anfrage übergeben werden, enthalten Zeichen, die nicht verwendet werden dürfen. Nutzer der Edge Public und Private Cloud
Allgemeine Diagnoseschritte
Verwenden Sie eines der folgenden Tools oder Verfahren, um diesen Fehler zu diagnostizieren:
API-Monitoring
So diagnostizieren Sie den Fehler mit API Monitoring:
- Bei der Apigee Edge-Benutzeroberfläche anmelden als Nutzer mit einer geeigneten Rolle.
Wechseln Sie zu der Organisation, in der Sie das Problem untersuchen möchten.
- Rufen Sie die Seite Analysieren > API-Monitoring > Untersuchen auf.
- Wählen Sie den Zeitraum aus, in dem die Fehler aufgetreten sind.
Stellen Sie den Fehlercode im Vergleich zur Zeit dar.
Wählen Sie eine Zelle mit dem Fehlercode
protocol.http.BadFormDataaus, wie unten dargestellt:
Informationen zum Fehlercode
protocol.http.BadFormDatawerden wie unten dargestellt angezeigt:
Klicken Sie auf Logs ansehen und maximieren Sie die Zeile für die fehlgeschlagene Anfrage.
- Notieren Sie sich im Fenster Logs die folgenden Details:
- Statuscode:
500 - Fehlerquelle:
proxy - Fehlercode:
protocol.http.BadFormData - Richtlinie für Fehler:
extractvariables/EV-ExtractFormParams
- Statuscode:
- Wenn Fault Source
proxy, Fault Codeprotocol.http.BadFormDataund Fault Policy nicht leer ist, bedeutet das, dass der Fehler aufgetreten ist, als die in Fault Policy angegebene Richtlinie die Formulardaten (Formularparameter) gelesen oder extrahiert hat, die Zeichen enthalten, die nicht verwendet werden dürfen. - In diesem Beispiel ist X-Apigee-fault-policy
extractvariables/EV- ExtractFormParams,. Das bedeutet, dass die ExtractVariables-Richtlinie mit dem Namen EV-ExtractFormParams beim Lesen oder Extrahieren der Formularparameter fehlgeschlagen ist.
Trace-Tool
So diagnostizieren Sie den Fehler mit dem Trace-Tool:
- Aktivieren Sie die Trace-Sitzung und führen Sie einen der folgenden Schritte aus:
- Warten Sie, bis der Fehler
500 Internal Server Errorauftritt. - Wenn Sie das Problem reproduzieren können, führen Sie den API-Aufruf aus, um das Problem zu reproduzieren:
500 Internal Server Error
- Warten Sie, bis der Fehler
Prüfen Sie, ob Alle FlowInfos anzeigen aktiviert ist:
- Wählen Sie eine der fehlgeschlagenen Anfragen aus und sehen Sie sich den Trace an.
- Navigieren Sie durch die verschiedenen Phasen des Traces und suchen Sie nach der Stelle, an der der Fehler aufgetreten ist.
Der Fehler wird in der Regel in einer der Richtlinien wie unten dargestellt angezeigt:
Im obigen Beispiel-Trace ist zu sehen, dass der Fehler in der ExtractVariables-Richtlinie mit dem Namen
EV-ExtractFormParamsaufgetreten ist.Rufen Sie nach der fehlgeschlagenen Richtlinie den Ablauf mit dem Namen Error auf:
- Notieren Sie sich die Werte der folgenden Elemente aus dem Trace:
Fehler:
Bad Form Datastate:
PROXY_REQ_FLOWerror.class::
com.apigee.rest.framework.BadRequestException- Der Wert des Fehlers
Bad Form Datagibt an, dass die Formularparameter Zeichen enthalten, die nicht verwendet werden dürfen. - Der Wert des Status
PROXY_REQ_FLOW,gibt an, dass der Fehler im Anfragefluss des API-Proxys aufgetreten ist.
- Der Wert des Fehlers
- Suchen Sie im Trace nach der Phase AX (Analytics Data Recorded) und klicken Sie darauf.
Scrollen Sie nach unten zum Abschnitt Phasendetails – Fehlerheader und ermitteln Sie die Werte von X-Apigee-fault-code, X-Apigee-fault-source und X-Apigee-fault-policy, wie unten dargestellt:
Beachten Sie, dass die Werte von X-Apigee-fault-code und X-Apigee-fault-source
protocol.http.BadFormDatabzw.policysind und X-Apigee-fault-policy nicht leer ist. Dies weist darauf hin, dass der Fehler aufgetreten ist, als die in X-Apigee-fault-policy angegebene Richtlinie die Formulardaten (Formularparameter) gelesen oder extrahiert hat, die Zeichen enthielten, die nicht verwendet werden dürfen.Antwortheader Wert X-Apigee-fault-code protocol.http.BadFormDataX-Apigee-fault-source policyX-Apigee-fault-policy extractvariables/EV-ExtractFormParams- In diesem Beispiel ist X-Apigee-fault-policy
extractvariables/EV- ExtractFormParams,. Das bedeutet, dass die ExtractVariables-Richtlinie mit dem NamenEV-ExtractFormParamsbeim Lesen oder Extrahieren der Formularparameter fehlgeschlagen ist.
NGINX
So diagnostizieren Sie den Fehler mithilfe von NGINX-Zugriffslogs:
- Wenn Sie ein Private Cloud-Nutzer sind, können Sie die NGINX-Zugriffsprotokolle verwenden, um die wichtigsten Informationen zu HTTP
500 Internal Server Errorzu ermitteln. NGINX-Zugriffslogs prüfen:
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log- Suchen Sie nach
500-Fehlern mit dem Fehlercodeprotocol.http.BadFormDatafür einen bestimmten Zeitraum (wenn das Problem in der Vergangenheit aufgetreten ist) oder nach Anfragen, bei denen weiterhin500-Fehler auftreten. Wenn Sie
500-Fehler mit dem X-Apigee-fault-code finden, der mit dem Wert vonprotocol.http.BadFormDataübereinstimmt, ermitteln Sie den Wert von X-Apigee-fault-source und X-Apigee-fault-policy.Beispiel für einen 500-Fehler aus dem NGINX-Zugriffslog:
Der obige Beispiel-Eintrag aus dem NGINX-Zugriffslog hat die folgenden Werte für X-Apigee-fault-code und X-Apigee-fault-source:
Header Wert X-Apigee-fault-code protocol.http.BadFormDataX-Apigee-fault-source policyX-Apigee-fault-policy extractvariables/EV-ExtractFormParams- Beachten Sie, dass die Werte von X-Apigee-fault-code und X-Apigee-fault-source
protocol.http.BadFormDatabzw.policysind und X-Apigee-fault-policy nicht leer ist. Dies weist darauf hin, dass der Fehler aufgetreten ist, als die in X-Apigee-fault-policy angegebene Richtlinie die Formulardaten (Formularparameter) gelesen oder extrahiert hat, die Zeichen enthielten, die nicht verwendet werden dürfen. - In diesem Beispiel ist X-Apigee-fault-policy
extractvariables/EV- ExtractFormParams,. Das bedeutet, dass die ExtractVariables-Richtlinie mit dem NamenEV-ExtractFormParamsbeim Lesen der Formularparameter fehlgeschlagen ist.
Ursache: Formularparameter in der Anfrage enthalten unzulässige Zeichen
Diagnose
- Ermitteln Sie den Fehlercode, die Fehlerquelle und die Fehlerrichtlinie für
500 Internal Server Errormit API-Monitoring, dem Trace-Tool oder NGINX-Zugriffsprotokollen, wie in Häufige Diagnoseschritte beschrieben. - Wenn der Fehlercode
protocol.http.BadFormDataist, die Fehlerquelle den Wertproxyoderpolicyhat und die Fehlerrichtlinie nicht leer ist, bedeutet dies,dass die in der Fehlerrichtlinie angegebene Richtlinie beim Lesen oder Extrahieren der Formulardaten (Formularparameter) fehlgeschlagen ist. - Sehen Sie sich die in der Fault Policy (Fehlerrichtlinie) angegebene Richtlinie an und ermitteln Sie die folgenden Informationen:
- Quelle:Legen Sie fest, ob die Richtlinie die Daten aus der Anfrage oder Antwort liest oder extrahiert.
- Formularparameter:Bestimmen Sie die spezifischen Formularparameter, die in der Richtlinie gelesen werden.
Beispiel 1
Beispiel 1: ExtractVariables-Richtlinie zum Extrahieren von Formularparametern
<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>In der oben genannten ExtractVariables-Richtlinie gilt Folgendes:
Quelle:
requestDies wird durch das
<Source>-Element angegeben.Formularparameter:
usernameundpasswordDies wird durch das
<Pattern>-Element innerhalb des<FormParam>-Elements angegeben.
Dies weist darauf hin, dass die Formularparameter
usernameund/oderpassword, die vom Client als Teil der HTTP-Anfrage an Apigee Edge übergeben wurden, Zeichen enthalten, die nicht verwendet werden dürfen.Beispiel 2
Beispiel 2: AssignMessage-Richtlinie zum Kopieren von Formularparametern
<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>
In der oben genannten ExtractVariables-Richtlinie gilt Folgendes:
Quelle:
requestDies wird durch das Attribut
sourceim Element<Copy>angegeben.Formularparameter:
usernameundpasswordDies wird durch das Attribut
nameim Element<FormParam>angegeben.
Dies weist darauf hin, dass die Formularparameter
usernameoderpasswordoder beide, die vom Client als Teil der HTTP-Anfrage an Apigee Edge übergeben wurden, Zeichen enthalten, die nicht verwendet werden dürfen.
Prüfen Sie mit einer der folgenden Methoden, ob in den in Schritt 3 ermittelten Formularparametern Zeichen verwendet werden, die nicht zulässig sind:
Trace-Tool
So validieren Sie mit dem Trace-Tool:
- Wenn Sie den Trace für die fehlgeschlagene Anfrage wie unter Allgemeine Diagnoseschritte beschrieben erfasst haben, wählen Sie eine der fehlgeschlagenen Anfragen aus.
- Wenn Sie festgestellt haben, dass die Formularparameter, die Zeichen enthalten, die nicht zulässig sind, Teil der HTTP-Anfrage in Schritt 3 oben sind, dann
- Rufen Sie die Phase Anfrage vom Kunden erhalten auf.
Scrollen Sie nach unten zum Abschnitt Phasendetails und sehen Sie sich die Inhaltsanfrage an.
- Beachten Sie, dass im obigen Beispiel der Formularparameter
passworddas Prozentzeichen (%) enthält. - Da das Prozentzeichen (
%) auch für die Prozentcodierung der Sonderzeichen verwendet wird, kann es nicht unverändert in den Formulardaten verwendet werden. - Daher antwortet Apigee Edge mit
500 Internal Server Errorund dem Fehlercodeprotocol.http.BadFormData.
Tatsächliche Anfrage
So validieren Sie die Anfrage:
- Wenn Sie keinen Zugriff auf die tatsächliche Anfrage an den Zielserver haben, fahren Sie mit Lösung fort.
- Wenn Sie Zugriff auf die tatsächliche Anfrage an Apigee Edge haben, führen Sie die folgenden Schritte aus:
- Prüfen Sie den Inhalt der Formulardaten und sehen Sie nach, ob er Zeichen enthält, die nicht verwendet werden dürfen, z. B. das Prozentzeichen (
%) oder das Prozentzeichen (%) gefolgt von ungültigen Hexadezimalzeichen.Beispiel 1
Beispielanfrage 1: Formulardaten als Teil der Anfrage
curl -X GET "https://HOSTALIAS/myproxy -H "Content-Type: application/x-www-form-urlencoded" -d "client_id=123456abc123&client_secret=c23578%ZY"
Beachten Sie in diesem Beispiel, dass das Element
client_secretdas Prozentzeichen (%) gefolgt von ungültigen HexadezimalzeichenZYenthält.Beispiel 2
Beispielanfrage 2: Formulardaten, die in einer Datei übergeben werden:
curl -X GET "https://HOSTALIAS/myproxy -H "Content-Type: application/x-www-form-urlencoded" -d @form_data.xml
Inhalt von „form_data.xml“:
xml=<user><username>abc1234@google.com</username><password>qwerty12345!@#$%</password></user>
Beachten Sie in diesem Beispiel, dass das Element
passworddas Prozentzeichen (%) enthält, das nicht unverändert in den Formulardaten übergeben werden sollte.
- Prüfen Sie den Inhalt der Formulardaten und sehen Sie nach, ob er Zeichen enthält, die nicht verwendet werden dürfen, z. B. das Prozentzeichen (
- In den beiden obigen Beispielen enthalten die Formulardaten, die als Teil der HTTP-Anfrage an Apigee Edge gesendet werden, Zeichen, die nicht verwendet werden dürfen.
- Daher antwortet Apigee Edge mit
500 Internal Server Errorund dem Fehlercodeprotocol.http.BadFormData.
Auflösung
- Achten Sie darauf, dass alle Sonderzeichen in den Schlüsseln und Werten von Formulardaten oder Parametern, die vom Client als Teil der HTTP-Anfrage gesendet werden, immer wie unter Formulardaten – application/x-www-form-urlencoded beschrieben codiert werden.
- Bei den oben genannten Beispielen können Sie die Probleme so beheben:
Beispiel 1
Beispiel 1: Formulardaten, die als Teil der Anfrage übergeben werden:
Verwenden Sie gültige hexadezimale Zeichen, die dem ASCII-Code für ein bestimmtes Zeichen entsprechen. Wenn Sie beispielsweise das Dollarzeichen (
$) senden möchten, verwenden Sie%24, wie unten gezeigt:curl -X GET "https://HOSTALIAS/myproxy -H "Content-Type: application/x-www-form-urlencoded" -d "client_id=123456abc123&client_secret=c23578%24"
Beispiel 2
Beispielanfrage 2: Formulardaten, die in einer Datei übergeben werden:
curl -X GET "https://HOSTALIAS/myproxy -H "Content-Type: application/x-www-form-urlencoded" -d @form_data.xml
Inhalt von „form_data.xml“:
Verwenden Sie die Prozentcodierung für das Prozentzeichen (
%). Ändern Sie die Datei also so, dass sie%25enthält, wie unten gezeigt:xml=<user><username>abc1234@google.com</username><password>qwerty12345!!@#$%25</password></user>
Spezifikation
Apigee Edge erwartet, dass die Formulardaten gemäß den folgenden Spezifikationen gesendet werden:
| Spezifikation |
|---|
| Formulardaten – application/x-www-form-urlencoded |
Wenn Sie weiterhin Unterstützung vom Apigee-Support benötigen, gehen Sie zu Erfassen von Diagnoseinformationen erforderlich.
Erfassen von Diagnoseinformationen erforderlich
Wenn das Problem auch nach Befolgen der obigen Anweisungen weiterhin besteht, sammeln Sie die folgenden Diagnoseinformationen und wenden Sie sich dann an den Apigee Edge-Support:
Wenn Sie ein Public Cloud-Nutzer sind, geben Sie die folgenden Informationen an:
- Name der Organisation
- Name der Umgebung
- Name des API-Proxys
- Vollständiger
curl-Befehl, der zum Reproduzieren des500 Internal Server Errormit dem Fehlercodeprotocol.http.BadFormDataverwendet wird - Trace-Datei für die API-Anfragen
Wenn Sie ein Private Cloud-Nutzer sind, geben Sie die folgenden Informationen an:
- Vollständige Fehlermeldung für die fehlgeschlagenen Anfragen
- Name der Umgebung
- API-Proxy-Bundle
- Trace-Datei für die API-Anfragen
NGINX-Zugriffslogs
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_logDabei gilt:ORG, ENV und PORT# werden durch tatsächliche Werte ersetzt.
Systemprotokolle des Message Processors
/opt/apigee/var/log/edge-message-processor/logs/system.log