500 Interner Serverfehler – BadFormData

Sie sehen die Dokumentation zu Apigee Edge.
Zur Apigee X-Dokumentation
weitere Informationen

Symptom

Die Clientanwendung erhält als Antwort auf API-Aufrufe den HTTP-Statuscode 500 Internal Server Error mit dem Fehlercode protocol.http.BadFormData.

Fehlermeldung

Die Clientanwendung ruft den folgenden Antwortcode ab:

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 auf die Fehlerbehebung für dieses Problem eingehen, sehen wir uns einmal an, 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 angibt. Die Formulardaten werden im Rahmen von HTTP-Anfragen oder -Antworten normalerweise als eine Reihe von Schlüssel/Wert-Paaren gesendet.

Formulardatenübertragung

  1. Content-Type: application/x-www-form-urlencoded
    • Wenn die Formulardaten klein sind, werden die Daten als Schlüssel/Wert-Paare mit folgenden Elementen gesendet:
      • Die Zeichen in beiden Schlüsseln, die gemäß den in Formulare – Abschnitt 17.13.4.1 erläuterten Regeln codiert werden
      • Den 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 sowohl in Schlüsseln als auch in Werten werden prozentcodiert, d. h., sie werden als Zeichendreieck %HH dargestellt, das aus einem Prozentzeichen gefolgt von zwei Hexadezimalziffern besteht, die den ASCII-Code des jeweiligen Zeichens darstellen.
    • Obwohl das Prozentzeichen (%) in 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, sollten sie als %25, übertragen werden. Dies ist der ASCII-Code für das Prozentzeichen (%).
  2. Inhaltstyp: 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 der Methode Content-Type: multipart/form-data senden. Eine Erläuterung hierzu finden Sie unter Formulare – Abschnitt 17.13.4.2.

Mögliche Ursachen

Dieser Fehler tritt nur dann auf, wenn alle folgenden Bedingungen erfüllt sind:

  1. Die HTTP-Anfrage, die vom Client an Apigee Edge gesendet wird, enthält:
    1. Content-Type: application/x-www-form-urlencoded und
    2. Formulardaten mit dem Prozentzeichen (%) oder dem Prozentzeichen (%), gefolgt von ungültigen Hexadezimalzeichen, die gemäß Formularen – Abschnitt 17.13.4.1 nicht zulässig sind.
  2. Der API-Proxy in Apigee Edge liest die spezifischen Formularparameter, die alle Zeichen enthalten, die im Anfrageablauf nicht verwendet werden dürfen. Dazu wird die Richtlinie ExtractVariables oder die AttributionMessage verwendet.

    Wenn die Formulardaten beispielsweise das Prozentzeichen (%) unverändert (ohne Codierung) oder das Prozentzeichen (%) gefolgt von ungültigen Hexadezimalzeichen im Schlüssel und/oder Wert enthalten, wird dieser Fehler zurückgegeben.

    Mögliche Ursachen für diesen Fehler:

    Ursache Beschreibung Anleitungen zur Fehlerbehebung gelten für
    Formularparameter in Anfrage enthalten unzulässige Zeichen Die Formularparameter, die als Teil der HTTP-Anfrage vom Client übergeben werden, enthalten alle Zeichen, die nicht verwendet werden dürfen. Nutzer von Edge Public und Private Cloud

Allgemeine Diagnoseschritte

Verwenden Sie eines der folgenden Tools oder Methoden, um diesen Fehler zu diagnostizieren:

API-Monitoring

So diagnostizieren Sie den Fehler mithilfe von API-Monitoring:

  1. Melden Sie sich in der Apigee Edge-UI als Nutzer mit einer entsprechenden Rolle an.
  2. Wechseln Sie zu der Organisation, in der Sie das Problem untersuchen möchten.

  3. Rufen Sie die Seite Analysieren > API-Überwachung > Untersuchen auf.
  4. Wählen Sie den Zeitraum aus, in dem Sie die Fehler beobachtet haben.
  5. Stellen Sie den Fehlercode der Zeit gegenüber.

  6. Wählen Sie eine Zelle mit dem Fehlercode protocol.http.BadFormData aus, wie unten dargestellt:

    (größeres Bild anzeigen)

  7. Informationen zum Fehlercode protocol.http.BadFormData werden wie unten dargestellt angezeigt:

    (größeres Bild anzeigen)

  8. Klicken Sie auf Logs ansehen und maximieren Sie die Zeile für die fehlgeschlagene Anfrage.

  9. Notieren Sie sich im Fenster Logs die folgenden Details:
    • Statuscode: 500
    • Fehlerquelle: proxy
    • Fehlercode: protocol.http.BadFormData
    • Richtlinien für Fehler:extractvariables/EV-ExtractFormParams
  10. Wenn die Fehlerquelle proxy, der Fehlercode protocol.http.BadFormData und die Fehlerrichtlinie nicht leer ist, bedeutet dies, dass der Fehler aufgetreten ist, als die in der Fehlerrichtlinie angegebene Richtlinie die Formulardaten (Formularparameter) gelesen oder extrahiert hat, die Zeichen enthalten, die nicht verwendet werden dürfen.
  11. In diesem Beispiel ist X-Apigee-fault-policy X-Apigee-fault-policy. Das bedeutet, dass die ExtractVariables-Richtlinie namens X-Apigee-fault-policy beim Lesen oder Extrahieren der Formularparameter fehlgeschlagen ist.

Trace-Tool

So diagnostizieren Sie den Fehler mit dem Trace-Tool:

  1. Aktivieren Sie die Trace-Sitzung und entweder:
    • Warten Sie, bis der Fehler 500 Internal Server Error auftritt, oder
    • Wenn Sie das Problem reproduzieren können, führen Sie den API-Aufruf aus, um das Problem zu reproduzieren. 500 Internal Server Error
  2. Achten Sie darauf, dass Show all FlowInfos aktiviert ist:

  3. Wählen Sie eine der fehlgeschlagenen Anfragen aus und prüfen Sie den Trace.
  4. Gehen Sie die verschiedenen Phasen des Trace durch und ermitteln Sie, wo der Fehler aufgetreten ist.
  5. Der Fehler tritt normalerweise in einer der folgenden Richtlinien auf:

    Beachten Sie im obigen Beispiel-Trace, dass der Fehler in der ExtractVariables-Richtlinie namens EV-ExtractFormParams aufgetreten ist.

  6. Rufen Sie den Ablauf mit dem Namen Error nach der Richtlinie auf, bei der der Fehler aufgetreten ist:

  7. Notieren Sie sich die folgenden Werte aus dem Trace:

    Fehler: Bad Form Data

    Bundesland: PROXY_REQ_FLOW

    error.class::com.apigee.rest.framework.BadRequestException

    • Der Wert des Fehlers Bad Form Data gibt an, dass die Formularparameter einige Zeichen enthielten, die nicht verwendet werden dürfen.
    • Der Wert des Status PROXY_REQ_FLOW, gibt an, dass der Fehler im Anfrageablauf des API-Proxys aufgetreten ist.
  8. Gehen Sie im Trace zur Phase AX (Analytics Data Recorded) und klicken Sie darauf.
  9. Scrollen Sie nach unten zum Abschnitt Phase DetailsError Headers und ermitteln Sie die Werte für X-Apigee-Fehler-Code, X-Apigee-Fehler-Quelle und X-Apigee-Fehler-Richtlinie, wie unten dargestellt:

  10. Beachten Sie, dass die Werte von X-Apigee-fault-code und X-Apigee-fault-code protocol.http.BadFormData bzw. policy sind und X-Apigee-fault-code nicht leer ist. Dies weist darauf hin, dass der Fehler aufgetreten ist, als die in X-Apigee-fault-policy angegebene Richtlinie die Formulardaten (Formparameter) gelesen oder extrahiert hat, die Zeichen enthielten, die X-Apigee-fault-policy.

    Antwortheader Wert
    X-Apigee-fault-code protocol.http.BadFormData
    X-Apigee-fault-source policy
    X-Apigee-fault-policy extractvariables/EV-ExtractFormParams
  11. In diesem Beispiel ist X-Apigee-fault-policy extractvariables/EV- ExtractFormParams, . Das bedeutet, dass die ExtractVariables-Richtlinie namens EV-ExtractFormParams beim Lesen oder Extrahieren der Formularparameter fehlgeschlagen ist.

NGINX

So diagnostizieren Sie den Fehler mithilfe von NGINX-Zugriffslogs:

  1. Wenn Sie ein Private Cloud-Nutzer sind, können Sie mithilfe von NGINX-Zugriffslogs die wichtigsten Informationen zu HTTP-500 Internal Server Error ermitteln.
  2. Prüfen Sie die NGINX-Zugriffslogs:

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

  3. Suchen Sie, ob während eines bestimmten Zeitraums (ob das Problem in der Vergangenheit aufgetreten ist) 500-Fehler mit dem Fehlercode protocol.http.BadFormData aufgetreten sind oder ob Anfragen immer noch mit 500 fehlschlagen.
  4. Wenn Sie 500-Fehler mit dem X-Apigee-fault-code finden, der mit dem Wert von X-Apigee-fault-code übereinstimmt, bestimmen Sie den Wert für X-Apigee-fault-code und X-Apigee-fault-code.

    Beispiel für einen 500-Fehler aus dem NGINX-Zugriffslog:

    Der obige Beispieleintrag aus dem NGINX-Zugriffslog enthält die folgenden Werte für X-Apigee-fault-code und X-Apigee-fault-code:

    Header Wert
    X-Apigee-fault-code protocol.http.BadFormData
    X-Apigee-fault-source policy
    X-Apigee-fault-policy extractvariables/EV-ExtractFormParams
  5. Beachten Sie, dass die Werte für X-Apigee-fault-code, X-Apigee-fault-code protocol.http.BadFormData und policy sind und X-Apigee-fault-code nicht leer ist. Dies weist darauf hin, dass der Fehler aufgetreten ist, während die in X-Apigee-fault-policy, angegebene Richtlinie die Formulardaten (Formparameter) gelesen oder extrahiert hat, die Zeichen enthielten, die X-Apigee-fault-policy, verwendet werden dürfen.
  6. In diesem Beispiel ist X-Apigee-fault-policy extractvariables/EV- ExtractFormParams, . Das bedeutet, dass die ExtractVariables-Richtlinie namens EV-ExtractFormParams beim Lesen der Formularparameter fehlgeschlagen ist.

Ursache: Formularparameter in der Anfrage enthalten unzulässige Zeichen.

Diagnose

  1. Bestimmen Sie den Fehlercode, die Fehlerquelle und die Fehlerrichtlinie für 500 Internal Server Error mithilfe von API-Monitoring, Trace-Tool oder NGINX-Zugriffslogs, wie unter Allgemeine Diagnoseschritte erläutert.
  2. Wenn der Fehlercode protocol.http.BadFormData lautet, die Fehlerquelle den Wert proxy oder policy hat und die Fehlerrichtlinie nicht leer ist, weist dies darauf hin,dass die in der Fehlerrichtlinie angegebene Richtlinie beim Lesen oder Extrahieren der Formulardaten (Formularparameter) fehlgeschlagen ist.
  3. Prüfen Sie die in der Fehlerrichtlinie angegebene Richtlinie und ermitteln Sie die folgenden Informationen:
    1. Quelle:Ermitteln Sie, ob die Richtlinie die Daten aus einer Anfrage oder Antwort liest oder extrahiert.
    2. 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 obigen ExtractVariables-Richtlinie:

      • Quelle: request

        Dies wird durch das Element <Source> angezeigt.

      • Formularparameter: username und password

        Dies wird durch das Element <Pattern> im Element <FormParam> angegeben.

      Dies zeigt an, dass die Formularparameter username und/oder password, die als Teil der HTTP-Anfrage des Clients an Apigee Edge übergeben werden, Zeichen enthalten, die nicht verwendet werden dürfen.

      Beispiel 2

      Beispiel 2: ConfirmMessage-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 obigen ExtractVariables-Richtlinie:

      • Quelle: request

        Dies wird durch das Attribut source im Element <Copy> angegeben.

      • Formularparameter: username und password

        Dies wird durch das Attribut name im Element <FormParam> angegeben.

      Dies gibt an, dass die Formularparameter username oder password oder beide, die als Teil der HTTP-Anfrage vom Client an Apigee Edge übergeben werden, Zeichen enthalten, die nicht verwendet werden dürfen.

  4. Prüfen Sie mit einer der folgenden Methoden, ob Zeichen in den in Schritt 3 identifizierten Formularparametern nicht zulässig sind:

    Trace-Tool

    So validieren Sie mit dem Trace-Tool:

    1. Wenn Sie den Trace für die fehlgeschlagene Anfrage wie unter Allgemeine Diagnoseschritte erläutert erfasst haben, wählen Sie eine der fehlgeschlagenen Anfragen aus.
    2. Wenn Sie festgestellt haben, dass die Formularparameter, die nicht zulässige Zeichen enthalten, Teil der HTTP-Anfrage in Schritt 3 sind, dann gilt:
      1. Gehen Sie zur Phase Anfrage vom Client erhalten.
      2. Scrollen Sie nach unten zum Abschnitt Phasendetails und überprüfen Sie den Anfrageinhalt.

        ( größeres Bild ansehen)

      3. Beachten Sie, dass im obigen Beispiel der Formularparameter password das Prozentzeichen (%) enthält.
      4. Da das Prozentzeichen (%) auch für die Prozentcodierung der Sonderzeichen verwendet wird, kann es in den Formulardaten nicht unverändert verwendet werden.
      5. Daher antwortet Apigee Edge mit 500 Internal Server Error und dem Fehlercode protocol.http.BadFormData.

    Tatsächliche Anfrage

    So validieren Sie mithilfe der tatsächlichen Anfrage:

    1. Wenn Sie keinen Zugriff auf die eigentliche Anfrage an den Zielserver haben, wechseln Sie zu Lösung.
    2. Wenn Sie Zugriff auf die eigentliche Anfrage an Apigee Edge haben, führen Sie die folgenden Schritte aus:
      1. Prüfen Sie, ob die Inhalte der Formulardaten Zeichen enthalten, 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_secret das Prozentzeichen (%) gefolgt von ungültigen Hexadezimalzeichen ZY enthält.

        Beispiel 2

        Beispielanfrage 2: Formulardaten in einer Datei übergeben:

        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 password das Prozentzeichen (%) enthält, das nicht unverändert in den Formulardaten übergeben werden sollte.

    3. 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.
    4. Daher antwortet Apigee Edge mit 500 Internal Server Error und dem Fehlercode protocol.http.BadFormData.

Auflösung

  1. Achten Sie darauf, dass alle Sonderzeichen in den Schlüsseln und Werten von Formulardaten oder Parametern, die als Teil einer HTTP-Anfrage vom Client gesendet werden, immer wie unter Form Data – application/x-www-form-urlencoded erläutert codiert sind.
  2. Bei den oben beschriebenen Beispielen können Sie die Probleme so beheben:

    Beispiel 1

    Beispiel 1: Formulardaten, die als Teil der Anfrage übergeben werden:

    Verwenden Sie gültige Hexadezimalzeichen, die mit dem ASCII-Code eines bestimmten Zeichens übereinstimmen. Wenn Sie beispielsweise das Dollarzeichen ($) senden möchten, verwenden Sie %24 so:

    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 in einer Datei übergeben:

    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 (%), um die Datei so zu ändern, dass sie %25 enthält:

    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, lesen Sie den Abschnitt Diagnoseinformationen müssen erfasst werden.

Erfassen von Diagnoseinformationen erforderlich

Wenn das Problem auch nach Befolgen der obigen Anleitung weiterhin besteht, stellen Sie die folgenden Diagnoseinformationen zusammen und wenden Sie sich 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
  • Führen Sie den Befehl curl aus, der zum Reproduzieren von 500 Internal Server Error mit dem Fehlercode protocol.http.BadFormData verwendet wurde.
  • Ablaufverfolgungsdatei für die API-Anfragen

Wenn Sie ein Private Cloud-Nutzer sind, geben Sie die folgenden Informationen an:

  • Vollständige Fehlermeldung bei fehlgeschlagenen Anfragen
  • Name der Umgebung
  • API-Proxy-Bundle
  • Ablaufverfolgungsdatei für die API-Anfragen
  • NGINX-Zugriffslogs

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

    Hierbei gilt: ORG, ENV und PORT# werden durch tatsächliche Werte ersetzt.

  • Systemprotokolle von Message Processor

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

Verweise