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
- 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 (%
).
- Se le dimensioni dei dati del modulo sono ridotte, i dati vengono inviati come coppie chiave-valore con:
- 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:
- La richiesta HTTP inviata dal client ad Apigee Edge contiene:
- .
Content-Type: application/x-www-form-urlencoded
e- 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.
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:
- Accedi alla UI di Apigee Edge come utente con un ruolo appropriato.
Passa all'organizzazione in cui vuoi esaminare il problema.
- Vai al menu Analizza > Monitoraggio delle API > Esamina.
- Seleziona il periodo di tempo specifico in cui hai osservato gli errori.
Traccia il codice di errore in base all'ora.
Seleziona una cella con il codice di errore
protocol.http.BadFormData
come mostrato di seguito:Le informazioni sul codice di errore
protocol.http.BadFormData
sono visualizzato come mostrato di seguito:Fai clic su Visualizza log ed espandi la riga della richiesta non riuscita.
- 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
- Codice di stato:
- 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. - 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:
- 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
- Attendi che si verifichi l'errore
Assicurati che l'opzione Mostra tutte le informazioni di Flow sia attivata:
- Seleziona una delle richieste non riuscite ed esamina la traccia.
- Navigare attraverso le diverse fasi della traccia e individuare il punto in cui si è verificato l'errore si è verificato un errore.
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
.Vai al flusso denominato Error dopo il criterio specifico per il quale non è riuscito:
- 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.
- Il valore dell'errore
- Vai alla fase AX (dati registrati di Analytics) della traccia e fai clic. li annotino.
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:
Si noti che i valori di X-Apigee-fault-code e X-Apigee-fault-source sono rispettivamente
protocol.http.BadFormData
epolicy
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
- In questo esempio, X-Apigee-fault-policy è
extractvariables/EV- ExtractFormParams,
, il che significa che il criterio ExtractVariables denominato Errore diEV-ExtractFormParams
durante la lettura o l'estrazione del modulo parametri.
NGINX
Per diagnosticare l'errore utilizzando i log di accesso NGINX:
- 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
. Controlla i log di accesso NGINX:
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log
- Cerca per vedere se ci sono errori
500
con codice di erroreprotocol.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 positivo500
. Se riscontri errori
500
con il X-Apigee-fault-code corrispondente al valore diprotocol.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
- 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. - In questo esempio, X-Apigee-fault-policy è
extractvariables/EV- ExtractFormParams,
, il che significa che il criterio ExtractVariables denominato Errore diEV-ExtractFormParams
durante la lettura del modulo parametri.
Causa: i parametri del modulo nella richiesta contengono caratteri non consentiti
Diagnosi
- 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. - Se il Codice di errore è
protocol.http.BadFormData
, Origine errore ha il valoreproxy
opolicy
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). - Esamina le norme indicate nelle Norme relative ai guasti e determina quanto segue:
informazioni:
- .
- Origine:consente di stabilire se il criterio legge o estrae i dati da una richiesta o una risposta.
- 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
epassword
Ciò è indicato dall'elemento
<Pattern>
all'interno della Elemento<FormParam>
Questo indica che i parametri del modulo
username
e/o Passaggiopassword
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
epassword
Ciò è indicato dall'attributo
name
in Elemento<FormParam>
Questo indica che i parametri del modulo
username
opassword
oppure entrambi trasmessi come parte della richiesta HTTP dal client ad Apigee Edge contengono qualsiasi di caratteri di cui non è consentito l'utilizzo.
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:
- Se hai acquisito la traccia per la richiesta non riuscita, come spiegato in Passaggi di diagnostica comuni, quindi seleziona una delle richieste non riuscite.
- Se hai stabilito che i parametri del modulo contengono caratteri
che non possono essere utilizzati fanno parte della richiesta HTTP
passaggio 3 qui sopra,
- Vai alla fase Richiesta ricevuta dal client.
Scorri verso il basso fino alla sezione Dettagli fase ed esamina il Richiedere Contenuti.
- Nell'esempio riportato sopra, tieni presente che il parametro del modulo
password
contiene il segno di percentuale (%
). - Poiché il segno di percentuale (
%
) viene utilizzato anche per percentuale per i caratteri speciali, non può essere usato così com'è i dati del modulo. - Pertanto, Apigee Edge risponde
500 Internal Server Error
con il codice di erroreprotocol.http.BadFormData
.
Richiesta effettiva
Per eseguire la convalida utilizzando la richiesta effettiva:
- Se non hai accesso alla richiesta effettiva fatta al server di destinazione, quindi vai a Risoluzione.
- Se hai accesso alla richiesta effettiva inviata ad Apigee Edge, esegui
segui questi passaggi:
- 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 validiZY
.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.
- Esamina i contenuti dei dati del modulo e verifica se contengono caratteri che
non è consentito l'uso, ad esempio il segno di percentuale (
- Nei due esempi precedenti, i dati del modulo inviati come parte di una richiesta HTTP Apigee Edge contiene caratteri non consentiti.
- Pertanto, Apigee Edge risponde con
500 Internal Server Error
con il codice di erroreprotocol.http.BadFormData
.
Risoluzione
- 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.
- 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 il500 Internal Server Error
con il codice di erroreprotocol.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