500 Errore interno del server - BadFormData

Stai visualizzando la documentazione di Apigee Edge.
Vai alla sezione Documentazione di Apigee X.
Informazioni

Sintomo

L'applicazione client riceve un codice di stato HTTP di 500 Internal Server Error con il codice di errore protocol.http.BadFormData in risposta alle chiamate API.

Messaggio di errore

L'applicazione client riceve il seguente codice di risposta:

HTTP/1.1 500 Internal Server Error

Potresti inoltre visualizzare il seguente messaggio di errore:

{
   "fault":{
      "faultstring":"Bad Form Data",
      "detail":{
         "errorcode":"protocol.http.BadFormData"
      }
   }
}

Dati modulo

Prima di entrare nel dettaglio della risoluzione di questo problema, vediamo cosa sono i dati del modulo.

I dati del modulo sono le informazioni fornite dall'utente di solito tramite un modulo HTML contenente elementi come una casella di immissione di testo, un pulsante o una casella di controllo. I dati dei moduli vengono generalmente inviati come una serie coppie chiave-valore come parte di richieste o risposte HTTP.

Trasmissione dei dati dei moduli

  1. Content-Type: application/x-www-form-urlcoded
      .
    • Se le dimensioni dei dati del modulo sono ridotte, i dati vengono inviati come coppie chiave-valore con:
      • I caratteri in entrambe le chiavi codificati secondo le regole spiegate Moduli - Sezione 17.13.4.1
      • L'intestazione Content-Type: application/x-www-form-urlencoded

      Esempio di richiesta con i dati del modulo:

      curl https://HOSTALIAS/somepath -H "Content-Type: application/x-www-form-urlencoded" -d "username=abc@google.com&pasword=secret123"
      
    • I caratteri non alfanumerici nelle chiavi e nei valori vengono percentuale di codifica, ovvero sono rappresentate come una terzina di caratteri %HH, costituito da un segno di percentuale seguito da due cifre esadecimali che rappresenta il codice ASCII del carattere specifico.
    • Di conseguenza, anche se il segno di percentuale (%) è consentito nei dati del modulo, interpretato come l'inizio di una sequenza di escape speciale. Pertanto, se i dati del modulo devono Contenere il segno di percentuale (%) nella chiave o nel valore, dovrebbe essere trasmesso come %25, , che rappresenta il codice ASCII per il segno percentuale (%).
  2. Content-Type: multipart/form-data

    Se desideri trasmettere grandi quantità di dati binari o testo contenente puoi inviare i dati con Content-Type: multipart/form-data come spiegato in Moduli - Sezione 17.13.4.2

Possibili cause

Questo errore si verifica solo se vengono soddisfatte tutte le seguenti condizioni:

  1. La richiesta HTTP inviata dal client ad Apigee Edge contiene:
      .
    1. Content-Type: application/x-www-form-urlencoded e
    2. Dati del modulo con il segno della percentuale (%) o della percentuale (%) seguiti da caratteri esadecimali non validi che non sono consentiti in base a Moduli - Sezione 17.13.4.1.
  2. Il proxy API in Apigee Edge legge i parametri specifici del modulo contenenti qualsiasi carattere che non possono essere utilizzati nel flusso di richiesta utilizzando il parametro ExtractVariables o Assegna il criterioAssignMessage.

    Ad esempio, se i dati del modulo contengono il segno della percentuale (%) così com'è (senza codifica) o il segno di percentuale (%) seguito da un valore esadecimale non valido caratteri nella chiave e/o nel valore, viene visualizzato questo errore.

    Ecco le possibili cause di questo errore:

    Causa Descrizione Le istruzioni di risoluzione dei problemi applicabili a
    I parametri del modulo nella richiesta contengono caratteri non consentiti I parametri del modulo passati come parte della richiesta HTTP dal client contengono caratteri non consentiti. Utenti perimetrali di cloud pubblici e privati

Passaggi diagnostici comuni

Utilizza uno dei seguenti strumenti/tecniche per diagnosticare questo errore:

Monitoraggio delle API

Per diagnosticare l'errore utilizzando API Monitoring:

  1. Accedi alla UI di Apigee Edge come utente con un ruolo appropriato.
  2. Passa all'organizzazione in cui vuoi esaminare il problema.

  3. Vai al menu Analizza > Monitoraggio delle API > Esamina.
  4. Seleziona il periodo di tempo specifico in cui hai osservato gli errori.
  5. Traccia il codice di errore in base all'ora.

  6. Seleziona una cella con il codice di errore protocol.http.BadFormData come mostrato di seguito:

    (visualizza immagine più grande)

  7. Le informazioni sul codice di errore protocol.http.BadFormData sono visualizzato come mostrato di seguito:

    (visualizza immagine più grande)

  8. Fai clic su Visualizza log ed espandi la riga della richiesta non riuscita.

  9. Nella finestra Log, tieni presente i seguenti dettagli:
      .
    • Codice di stato: 500
    • Origine errore:proxy
    • Codice di errore: protocol.http.BadFormData
    • Norme relative agli errori: extractvariables/EV-ExtractFormParams
  10. Se l'origine di errore è proxy, il Codice di errore è protocol.http.BadFormData e Criterio di errore non sono vuoti, indica che l'errore si è verificato mentre il criterio specifico indicato in Errore Il criterio leggeva o estraeva i dati del modulo (parametri del modulo) che hanno uno caratteri non consentiti.
  11. In questo esempio, X-Apigee-fault-policy è extractvariables/EV- ExtractFormParams, , il che significa che il criterio ExtractVariables denominato EV-ExtractFormParams non è riuscito durante la lettura o l'estrazione del modulo parametri.

Strumento Trace

Per diagnosticare l'errore utilizzando lo strumento Trace:

  1. Attiva la sessione di traccia e:
      .
    • Attendi che si verifichi l'errore 500 Internal Server Error oppure
    • Se riesci a riprodurre il problema, esegui la chiamata API per riprodurlo. 500 Internal Server Error
  2. Assicurati che l'opzione Mostra tutte le informazioni di Flow sia attivata:

  3. Seleziona una delle richieste non riuscite ed esamina la traccia.
  4. Navigare attraverso le diverse fasi della traccia e individuare il punto in cui si è verificato l'errore si è verificato un errore.
  5. In genere, troverai l'errore in una delle norme indicate di seguito:

    Nella traccia di esempio precedente, tieni presente che l'errore si è verificato nella Criterio ExtractVariables denominato EV-ExtractFormParams.

  6. Vai al flusso denominato Error dopo il criterio specifico per il quale non è riuscito:

  7. Prendi nota dei seguenti valori della traccia:

    errore: Bad Form Data

    stato: PROXY_REQ_FLOW

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

    • Il valore dell'errore Bad Form Data indica che il modulo aveva alcuni caratteri non consentiti da utilizzare.
    • Il valore dello stato PROXY_REQ_FLOW, indica che l'errore si è verificato nel flusso di richiesta del proxy API.
  8. Vai alla fase AX (dati registrati di Analytics) della traccia e fai clic. li annotino.
  9. Scorri verso il basso fino alla sezione Dettagli fase - Intestazioni degli errori e determinano i valori di X-Apigee-fault-code, X-Apigee-fault-source, e X-Apigee-fault-policy come mostrato di seguito:

  10. Si noti che i valori di X-Apigee-fault-code e X-Apigee-fault-source sono rispettivamente protocol.http.BadFormData e policy e X-Apigee-fault-policy non è vuoto. Ciò indica che l'errore si è verificato mentre la norma specifica indicata in X-Apigee-fault-policy era leggere o estrarre i dati del modulo (parametri di forma), che contenevano caratteri che non possono essere utilizzati.

    Intestazioni della risposta Valore
    X-Apigee-fault-code protocol.http.BadFormData
    X-Apigee-fault-source policy
    X-Apigee-fault-policy extractvariables/EV-ExtractFormParams
  11. In questo esempio, X-Apigee-fault-policy è extractvariables/EV- ExtractFormParams, , il che significa che il criterio ExtractVariables denominato Errore di EV-ExtractFormParams durante la lettura o l'estrazione del modulo parametri.

NGINX

Per diagnosticare l'errore utilizzando i log di accesso NGINX:

  1. Se sei un utente Private Cloud, puoi utilizzare i log di accesso NGINX per per determinare le informazioni chiave su HTTP 500 Internal Server Error.
  2. Controlla i log di accesso NGINX:

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

  3. Cerca per vedere se ci sono errori 500 con codice di errore protocol.http.BadFormData per un periodo di tempo specifico (se il problema successo in passato) o se ci sono ancora richieste che non hanno avuto esito positivo 500.
  4. Se riscontri errori 500 con il X-Apigee-fault-code corrispondente al valore di protocol.http.BadFormData, determinare il valore della X-Apigee-fault-source X-Apigee-fault-policy.

    Esempio di errore 500 nel log di accesso NGINX:

    La voce di esempio riportata sopra del log di accesso NGINX ha i seguenti valori per X-Apigee-fault-code e X-Apigee-fault-code

    Intestazioni Valore
    X-Apigee-fault-code protocol.http.BadFormData
    X-Apigee-fault-source policy
    X-Apigee-fault-policy extractvariables/EV-ExtractFormParams
  5. Tieni presente che i valori di X-Apigee-fault-code, X-Apigee-fault-source sono protocol.http.BadFormData, policy rispettivamente e X-Apigee-fault-policy non è vuoto. Ciò indica che l'errore si è verificato mentre la norma specifica indicata in X-Apigee-fault-policy, era leggere o estrarre i dati del modulo (parametri di forma), che contenevano caratteri che non possono essere utilizzati.
  6. In questo esempio, X-Apigee-fault-policy è extractvariables/EV- ExtractFormParams, , il che significa che il criterio ExtractVariables denominato Errore di EV-ExtractFormParams durante la lettura del modulo parametri.

Causa: i parametri del modulo nella richiesta contengono caratteri non consentiti

Diagnosi

  1. Determina il codice di errore, l'origine errore e il criterio di errore per 500 Internal Server Error utilizzando il monitoraggio delle API, lo strumento Trace o i log di accesso NGINX come spiegato in Passaggi di diagnostica comuni.
  2. Se il Codice di errore è protocol.http.BadFormData, Origine errore ha il valore proxy o policy e il criterio di errore non è vuoto, questo indica che il criterio specificato in Criterio di errore non ha funzionato leggere o estrarre i dati del modulo (parametri del modulo).
  3. Esamina le norme indicate nelle Norme relative ai guasti e determina quanto segue: informazioni:
      .
    1. Origine:consente di stabilire se il criterio legge o estrae i dati da una richiesta o una risposta.
    2. Parametri modulo: determinano i parametri specifici del modulo che vengono letti nel .

      Esempio 1

      Esempio 1: criterio ExtractVariables che estrae parametri modulo:

            <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>
            

      Nel criterio ExtractVariables precedente:

      • Fonte: request

        Ciò è indicato dall'elemento <Source>

      • Parametri modulo: username e password

        Ciò è indicato dall'elemento <Pattern> all'interno della Elemento <FormParam>

      Questo indica che i parametri del modulo username e/o Passaggio password passato come parte della richiesta HTTP dal client a Apigee Edge contiene caratteri di cui non è consentito l'utilizzo.

      Esempio 2

      Esempio 2: copia dei parametri del modulo per il criterio AssegnaMessage:

            <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>
            

      Nel criterio ExtractVariables precedente:

      • Origine: request

        Ciò è indicato dall'attributo source in Elemento <Copy>

      • Parametri modulo: username e password

        Ciò è indicato dall'attributo name in Elemento <FormParam>

      Questo indica che i parametri del modulo username o password oppure entrambi trasmessi come parte della richiesta HTTP dal client ad Apigee Edge contengono qualsiasi di caratteri di cui non è consentito l'utilizzo.

  4. Verifica se sono presenti caratteri non consentiti Caratteri utilizzati nei parametri del modulo identificati nel passaggio 3 utilizzando uno dei seguenti metodi:

    Strumento Trace

    Per eseguire la convalida utilizzando lo strumento Trace:

    1. Se hai acquisito la traccia per la richiesta non riuscita, come spiegato in Passaggi di diagnostica comuni, quindi seleziona una delle richieste non riuscite.
    2. Se hai stabilito che i parametri del modulo contengono caratteri che non possono essere utilizzati fanno parte della richiesta HTTP passaggio 3 qui sopra,
      1. Vai alla fase Richiesta ricevuta dal client.
      2. Scorri verso il basso fino alla sezione Dettagli fase ed esamina il Richiedere Contenuti.

        ( visualizza immagine ingrandita)

      3. Nell'esempio riportato sopra, tieni presente che il parametro del modulo password contiene il segno di percentuale (%).
      4. Poiché il segno di percentuale (%) viene utilizzato anche per percentuale per i caratteri speciali, non può essere usato così com'è i dati del modulo.
      5. Pertanto, Apigee Edge risponde 500 Internal Server Error con il codice di errore protocol.http.BadFormData.

    Richiesta effettiva

    Per eseguire la convalida utilizzando la richiesta effettiva:

    1. Se non hai accesso alla richiesta effettiva fatta al server di destinazione, quindi vai a Risoluzione.
    2. Se hai accesso alla richiesta effettiva inviata ad Apigee Edge, esegui segui questi passaggi:
      1. Esamina i contenuti dei dati del modulo e verifica se contengono caratteri che non è consentito l'uso, ad esempio il segno di percentuale (%) o il segno della percentuale (%) seguito da non valido esadecimali.

        Esempio 1

        Richiesta di esempio n. 1: dati del modulo nell'ambito della richiesta

        curl -X GET "https://HOSTALIAS/myproxy -H "Content-Type: application/x-www-form-urlencoded" -d "client_id=123456abc123&client_secret=c23578%ZY"
        

        In questo esempio, tieni presente che l'elemento client_secret contiene il segno di percentuale (%) seguito da caratteri esadecimali non validi ZY.

        Esempio 2

        Richiesta di esempio n. 2: dati del modulo passati in un file:

        curl -X GET "https://HOSTALIAS/myproxy -H "Content-Type: application/x-www-form-urlencoded" -d @form_data.xml
        

        Contenuto di form_data.xml:

        xml=<user><username>abc1234@google.com</username><password>qwerty12345!@#$%</password></user>
        

        In questo esempio, tieni presente che l'elemento password contiene il simbolo di percentuale (%), che non deve essere passati così come sono nei dati del modulo.

    3. Nei due esempi precedenti, i dati del modulo inviati come parte di una richiesta HTTP Apigee Edge contiene caratteri non consentiti.
    4. Pertanto, Apigee Edge risponde con 500 Internal Server Error con il codice di errore protocol.http.BadFormData.

Risoluzione

  1. Assicurati che tutti i caratteri speciali nelle chiavi e nei valori dei dati del modulo o dei parametri inviati come parte di una richiesta HTTP dal client sono sempre codificati come spiegato in Dati del modulo: application/x-www-form-urlEncoding.
  2. Per gli esempi di cui sopra, puoi risolvere i problemi come segue:

    Esempio 1

    Esempio 1: dati del modulo trasmessi nell'ambito della richiesta:

    Utilizza valide esadecimali che corrispondono al codice ASCII per un carattere specifico. Ad esempio, se vuoi inviare il simbolo del dollaro ($), utilizza %24 come mostrato di seguito:

    curl -X GET "https://HOSTALIAS/myproxy -H "Content-Type: application/x-www-form-urlencoded" -d "client_id=123456abc123&client_secret=c23578%24"
    

    Esempio 2

    Richiesta di esempio n. 2: dati del modulo passati in un file:

    curl -X GET "https://HOSTALIAS/myproxy -H "Content-Type: application/x-www-form-urlencoded" -d @form_data.xml
    

    Contenuto di form_data.xml:

    Utilizza la con la codifica percentuale per il segno della percentuale (%), ovvero modificare il file in hanno %25 come mostrato di seguito:

    xml=<user><username>abc1234@google.com</username><password>qwerty12345!!@#$%25</password></user>
    

Specifica

Apigee Edge prevede che i dati del modulo vengano inviati in base alle seguenti specifiche:

Specifica
Dati del modulo: application/x-www-form-urlcoded

Se hai ancora bisogno di aiuto dall'assistenza Apigee, vai a Devo raccogliere informazioni diagnostiche.

Raccogliere dati diagnostici

Se il problema persiste anche dopo aver seguito le istruzioni riportate sopra, raccogli i seguenti dati informazioni diagnostiche e contattare l'assistenza Apigee Edge:

Se sei un utente del cloud pubblico, fornisci le seguenti informazioni:

  • Nome organizzazione
  • Nome ambiente
  • Nome proxy API
  • Completa il comando curl utilizzato per riprodurre il 500 Internal Server Error con il codice di errore protocol.http.BadFormData
  • File di traccia per le richieste API

Se sei un utente di Private Cloud, fornisci le seguenti informazioni:

  • Messaggio di errore completo osservato per le richieste non riuscite
  • Nome ambiente
  • Bundle proxy API
  • File di traccia per le richieste API
  • Log di accesso NGINX

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

    Dove: ORG, ENV e PORT# vengono sostituiti con valori effettivi.

  • Log di sistema del processore di messaggi

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

Riferimenti