Vous consultez la documentation Apigee Edge.
Accédez à la documentation Apigee X.
Problème constaté
L'application cliente reçoit un code d'état HTTP 500 Internal Server Error avec le code d'erreur protocol.http.BadFormData en réponse aux appels d'API.
Message d'erreur
L'application cliente reçoit le code de réponse suivant :
HTTP/1.1 500 Internal Server Error
De plus, le message d'erreur suivant peut s'afficher :
{
"fault":{
"faultstring":"Bad Form Data",
"detail":{
"errorcode":"protocol.http.BadFormData"
}
}
}Données de formulaire
Avant d'examiner en détail comment résoudre ce problème, voyons ce que sont les données de formulaire.
Les données de formulaire sont les informations fournies par l'utilisateur, généralement via un formulaire HTML comportant des éléments tels qu'une zone de saisie de texte, un bouton ou une case à cocher. Les données du formulaire sont généralement envoyées sous la forme d'une série de paires clé/valeur dans les requêtes ou réponses HTTP.
Transmission des données de formulaire
- Content-Type: application/x-www-form-urlencoded
- Si la taille des données du formulaire est petite, les données sont envoyées sous forme de paires clé/valeur avec :
- Les caractères des deux clés sont encodés conformément aux règles expliquées dans Forms – Section 17.13.4.1.
- En-tête
Content-Type: application/x-www-form-urlencoded
Exemple de requête avec des données de formulaire :
curl https://HOSTALIAS/somepath -H "Content-Type: application/x-www-form-urlencoded" -d "username=abc@google.com&pasword=secret123"
- Tous les caractères non alphanumériques des clés et des valeurs sont
encodés en pourcentage, c'est-à-dire qu'ils sont représentés par un triplet de caractères
%HH, composé d'un signe de pourcentage suivi de deux chiffres hexadécimaux représentant le code ASCII du caractère spécifique. - Ainsi, même si le signe pourcentage (
%) est autorisé dans les données du formulaire, il est interprété comme le début d'une séquence d'échappement spéciale. Par conséquent, si les données du formulaire doivent contenir le signe pourcentage (%) dans la clé ou la valeur, elles doivent être transmises sous la forme%25,, qui représente le code ASCII du caractère signe pourcentage (%).
- Si la taille des données du formulaire est petite, les données sont envoyées sous forme de paires clé/valeur avec :
- Content-Type: multipart/form-data
Si vous souhaitez transmettre de grandes quantités de données binaires ou de texte contenant des caractères non-ASCII, vous pouvez envoyer les données avec
Content-Type:multipart/form-data, comme expliqué dans Forms – Section 17.13.4.2.
Causes possibles
Cette erreur se produit si et seulement si toutes les conditions suivantes sont remplies :
- La requête HTTP envoyée par le client à Apigee Edge contient :
Content-Type: application/x-www-form-urlencodedet- Données de formulaire avec le signe de pourcentage (
%) ou le signe de pourcentage (%) suivi de caractères hexadécimaux non valides qui ne sont pas autorisés conformément à Forms – Section 17.13.4.1 (en anglais).
Le proxy d'API dans Apigee Edge lit les paramètres de formulaire spécifiques contenant des caractères non autorisés à utiliser dans le flux de requête à l'aide de la règle ExtractVariables ou AssignMessage.
Par exemple, si les données du formulaire contiennent le signe de pourcentage (
%) tel quel (sans encodage) ou le signe de pourcentage (%) suivi de caractères hexadécimaux non valides dans la clé et/ou la valeur, cette erreur s'affiche.Voici les causes possibles de cette erreur :
Cause Description Instructions de dépannage applicables Les paramètres du formulaire dans la demande contiennent des caractères non autorisés Les paramètres de formulaire transmis dans la requête HTTP par le client contiennent des caractères non autorisés. Utilisateurs du cloud public et privé Edge
Étapes de diagnostic courantes
Utilisez l'un des outils/techniques suivants pour diagnostiquer cette erreur :
Surveillance des API
Pour diagnostiquer l'erreur à l'aide d'API Monitoring :
- Connectez-vous à l'UI Apigee Edge en tant qu'utilisateur disposant d'un rôle approprié.
Basculez vers l'organisation dans laquelle vous souhaitez examiner le problème.
- Accédez à la page Analyser > API Monitoring > Examiner.
- Sélectionnez la période spécifique au cours de laquelle vous avez observé les erreurs.
Représentez graphiquement Code d'erreur par rapport à Heure.
Sélectionnez une cellule contenant le code d'erreur
protocol.http.BadFormData, comme indiqué ci-dessous :
Les informations sur le code d'erreur
protocol.http.BadFormDatas'affichent comme indiqué ci-dessous :
Cliquez sur Afficher les journaux, puis développez la ligne correspondant à la demande ayant échoué.
- Dans la fenêtre Journaux, notez les informations suivantes :
- Code d'état :
500 - Source de la défaillance :
proxy - Code d'erreur :
protocol.http.BadFormData - Règlement sur les défaillances :
extractvariables/EV-ExtractFormParams
- Code d'état :
- Si la source de l'erreur est
proxy, le code d'erreur estprotocol.http.BadFormDataet la règle d'erreur n'est pas vide, cela indique que l'erreur s'est produite lors de la lecture ou de l'extraction des données du formulaire (paramètres du formulaire) par la règle spécifique indiquée dans Règle d'erreur, qui contient des caractères non autorisés. - Dans cet exemple, X-Apigee-fault-policy est défini sur
extractvariables/EV- ExtractFormParams,, ce qui signifie que la règle ExtractVariables nommée EV-ExtractFormParams a échoué lors de la lecture ou de l'extraction des paramètres de formulaire.
Outil Trace
Pour diagnostiquer l'erreur à l'aide de l'outil Trace :
- Activez la session de trace, puis :
- Attendez que l'erreur
500 Internal Server Errorse produise. - Si vous pouvez reproduire le problème, effectuez l'appel d'API pour le reproduire.
500 Internal Server Error
- Attendez que l'erreur
Assurez-vous que l'option Afficher toutes les FlowInfos est activée :
- Sélectionnez l'une des requêtes ayant échoué et examinez la trace.
- Parcourez les différentes phases de la trace et identifiez l'emplacement de l'échec.
L'erreur se trouve généralement dans l'un des règlements, comme indiqué ci-dessous :
Dans l'exemple de trace ci-dessus, notez que l'échec s'est produit dans la règle ExtractVariables nommée
EV-ExtractFormParams.Accédez au flux nommé Error après la règle spécifique qui a échoué :
- Notez les valeurs suivantes à partir de la trace :
Erreur :
Bad Form Datastate:
PROXY_REQ_FLOWerror.class: :
com.apigee.rest.framework.BadRequestException- La valeur de l'erreur
Bad Form Dataindique que les paramètres du formulaire contenaient des caractères non autorisés. - La valeur de l'état
PROXY_REQ_FLOW,indique que l'erreur s'est produite dans le flux de requête du proxy d'API.
- La valeur de l'erreur
- Accédez à la phase AX (données Analytics enregistrées) dans la trace, puis cliquez dessus.
Faites défiler la page jusqu'à la section Détails de la phase > En-têtes d'erreur, puis déterminez les valeurs de X-Apigee-fault-code, X-Apigee-fault-source et X-Apigee-fault-policy, comme indiqué ci-dessous :
Notez que les valeurs de X-Apigee-fault-code et X-Apigee-fault-source sont respectivement
protocol.http.BadFormDataetpolicy, et que X-Apigee-fault-policy n'est pas vide. Cela indique que l'erreur s'est produite lors de la lecture ou de l'extraction des données de formulaire (paramètres de formulaire) par la règle spécifique indiquée dans X-Apigee-fault-policy, qui contenait des caractères non autorisés.En-têtes de réponse Valeur X-Apigee-fault-code protocol.http.BadFormDataX-Apigee-fault-source policyX-Apigee-fault-policy extractvariables/EV-ExtractFormParams- Dans cet exemple, X-Apigee-fault-policy est défini sur
extractvariables/EV- ExtractFormParams,, ce qui signifie que la règle ExtractVariables nomméeEV-ExtractFormParamsa échoué lors de la lecture ou de l'extraction des paramètres de formulaire.
NGINX
Pour diagnostiquer l'erreur à l'aide des journaux d'accès NGINX :
- Si vous êtes un utilisateur Private Cloud, vous pouvez utiliser les journaux d'accès NGINX pour déterminer les informations clés sur HTTP
500 Internal Server Error. Vérifiez les journaux d'accès NGINX :
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log- Recherchez les éventuelles erreurs
500avec le code d'erreurprotocol.http.BadFormDatapendant une durée spécifique (si le problème s'est produit dans le passé) ou s'il existe des requêtes qui échouent toujours avec500. Si vous trouvez des erreurs
500avec le code d'erreur X-Apigee-fault-code correspondant à la valeurprotocol.http.BadFormData, déterminez la valeur de X-Apigee-fault-source et X-Apigee-fault-policy.Exemple d'erreur 500 dans le journal d'accès NGINX :
L'exemple d'entrée ci-dessus du journal d'accès NGINX présente les valeurs suivantes pour X-Apigee-fault-code et X-Apigee-fault-source :
En-têtes Valeur X-Apigee-fault-code protocol.http.BadFormDataX-Apigee-fault-source policyX-Apigee-fault-policy extractvariables/EV-ExtractFormParams- Notez que les valeurs de X-Apigee-fault-code et X-Apigee-fault-source sont respectivement
protocol.http.BadFormDataetpolicy, et que X-Apigee-fault-policy n'est pas vide. Cela indique que l'erreur s'est produite lorsque la règle spécifique indiquée dans X-Apigee-fault-policy lisait ou extrayait les données du formulaire (paramètres du formulaire), qui contenaient des caractères non autorisés. - Dans cet exemple, X-Apigee-fault-policy est défini sur
extractvariables/EV- ExtractFormParams,, ce qui signifie que la règle ExtractVariables nomméeEV-ExtractFormParamsa échoué lors de la lecture des paramètres de formulaire.
Cause : Les paramètres de formulaire de la requête contiennent des caractères non autorisés.
Diagnostic
- Déterminez le code d'erreur, la source de l'erreur et la règle d'erreur pour
500 Internal Server Errorà l'aide d'API Monitoring, de l'outil Trace ou des journaux d'accès NGINX, comme expliqué dans Étapes de diagnostic courantes. - Si le code d'erreur est
protocol.http.BadFormData, que la source de l'erreur a la valeurproxyoupolicy, et que la règle d'erreur n'est pas vide, cela indique que la règle spécifiée dans règle d'erreur a échoué lors de la lecture ou de l'extraction des données du formulaire (paramètres du formulaire). - Examinez la règle indiquée dans la Règle d'erreur et déterminez les informations suivantes :
- Source : déterminez si la règle lit ou extrait les données de la requête ou de la réponse.
- Paramètres de formulaire : identifiez les paramètres de formulaire spécifiques qui sont lus dans le règlement.
Exemple 1
Exemple 1 : règle ExtractVariables extrayant les paramètres du formulaire :
<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>Dans la règle ExtractVariables ci-dessus :
Source :
requestCela est indiqué par l'élément
<Source>.Paramètres de formulaire :
usernameetpasswordCela est indiqué par l'élément
<Pattern>dans l'élément<FormParam>.
Cela indique que les paramètres de formulaire
usernameet/oupasswordtransmis dans le cadre de la requête HTTP par le client à Apigee Edge contiennent des caractères non autorisés.Exemple 2
Exemple 2 : Règle AssignMessage copiant les paramètres du formulaire :
<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>
Dans la règle ExtractVariables ci-dessus :
Source :
requestCela est indiqué par l'attribut
sourcedans l'élément<Copy>.Paramètres de formulaire :
usernameetpasswordCela est indiqué par l'attribut
namedans l'élément<FormParam>.
Cela indique que les paramètres de formulaire
usernameoupassword, ou les deux, transmis dans le cadre de la requête HTTP par le client à Apigee Edge contiennent des caractères non autorisés.
Vérifiez si des caractères non autorisés sont utilisés dans les paramètres de formulaire identifiés à l'étape 3, en utilisant l'une des méthodes suivantes :
Outil Trace
Pour valider à l'aide de l'outil Trace :
- Si vous avez capturé la trace de la requête défaillante comme expliqué dans les étapes de diagnostic courantes, sélectionnez l'une des requêtes défaillantes.
- Si vous avez déterminé que les paramètres de formulaire contenant des caractères non autorisés font partie de la requête HTTP à l'étape 3 ci-dessus, alors
- Accédez à la phase Demande reçue du client.
Faites défiler la page jusqu'à la section Détails de la phase et examinez le contenu de la demande.
- Dans l'exemple ci-dessus, notez que le paramètre de formulaire
passwordcontient le signe pourcentage (%). - Étant donné que le signe pourcentage (
%) est également utilisé pour l' encodage en pourcentage des caractères spéciaux, il ne peut pas être utilisé tel quel dans les données du formulaire. - Par conséquent, Apigee Edge répond avec
500 Internal Server Erroret le code d'erreurprotocol.http.BadFormData.
Demande réelle
Pour valider les résultats à l'aide de la requête réelle :
- Si vous n'avez pas accès à la requête réelle envoyée au serveur cible, passez à Résolution.
- Si vous avez accès à la requête réelle envoyée à Apigee Edge, procédez comme suit :
- Examinez le contenu des données du formulaire et vérifiez s'il contient des caractères non autorisés, tels que le signe de pourcentage (
%) ou le signe de pourcentage (%) suivi de caractères hexadécimaux non valides.Exemple 1
Exemple de requête 1 : données de formulaire incluses dans la requête
curl -X GET "https://HOSTALIAS/myproxy -H "Content-Type: application/x-www-form-urlencoded" -d "client_id=123456abc123&client_secret=c23578%ZY"
Dans cet exemple, notez que l'élément
client_secretcontient le signe pourcentage (%) suivi des caractères hexadécimaux non validesZY.Exemple 2
Exemple de demande 2 : données de formulaire transmises dans un fichier
curl -X GET "https://HOSTALIAS/myproxy -H "Content-Type: application/x-www-form-urlencoded" -d @form_data.xml
Contenu de form_data.xml :
xml=<user><username>abc1234@google.com</username><password>qwerty12345!@#$%</password></user>
Dans cet exemple, notez que l'élément
passwordcontient le signe pourcentage (%), qui ne doit pas être transmis tel quel dans les données du formulaire.
- Examinez le contenu des données du formulaire et vérifiez s'il contient des caractères non autorisés, tels que le signe de pourcentage (
- Dans les deux exemples ci-dessus, les données de formulaire envoyées dans le cadre de la requête HTTP à Apigee Edge contiennent des caractères non autorisés.
- Par conséquent, Apigee Edge répond avec
500 Internal Server Erroret le code d'erreurprotocol.http.BadFormData.
Solution
- Assurez-vous que tous les caractères spéciaux des clés et des valeurs des données ou paramètres de formulaire envoyés dans le cadre d'une requête HTTP par le client sont toujours encodés comme expliqué dans Données de formulaire : application/x-www-form-urlencoded.
- Pour les exemples ci-dessus, vous pouvez résoudre les problèmes comme suit :
Exemple 1
Exemple 1 : Données de formulaire transmises dans la requête :
Utilisez des caractères hexadécimaux valides correspondant au code ASCII d'un caractère spécifique. Par exemple, si vous souhaitez envoyer le signe dollar (
$), utilisez%24, comme indiqué ci-dessous :curl -X GET "https://HOSTALIAS/myproxy -H "Content-Type: application/x-www-form-urlencoded" -d "client_id=123456abc123&client_secret=c23578%24"
Exemple 2
Exemple de demande 2 : données de formulaire transmises dans un fichier
curl -X GET "https://HOSTALIAS/myproxy -H "Content-Type: application/x-www-form-urlencoded" -d @form_data.xml
Contenu de form_data.xml :
Utilisez l' encodage en pourcentage pour le signe pourcentage (
%), c'est-à-dire modifiez le fichier pour qu'il contienne%25, comme indiqué ci-dessous :xml=<user><username>abc1234@google.com</username><password>qwerty12345!!@#$%25</password></user>
Spécification
Apigee Edge s'attend à ce que les données du formulaire soient envoyées conformément aux spécifications suivantes :
| Spécification |
|---|
| Données de formulaire : application/x-www-form-urlencoded |
Si vous avez encore besoin d'aide de l'assistance Apigee, consultez la page Vous devez collecter des informations de diagnostic.
Vous devez collecter des informations de diagnostic
Si le problème persiste, même après avoir suivi les instructions ci-dessus, rassemblez les informations de diagnostic suivantes, puis contactez l'assistance Apigee Edge :
Si vous êtes un utilisateur du cloud public, fournissez les informations suivantes :
- Nom de l'organisation
- Nom de l'environnement
- Nom de proxy d'API
- Commande
curlcomplète utilisée pour reproduire500 Internal Server Erroravec le code d'erreurprotocol.http.BadFormData - Fichier de trace pour les requêtes API
Si vous êtes un utilisateur du cloud privé, fournissez les informations suivantes :
- Message d'erreur complet observé pour les requêtes ayant échoué
- Nom de l'environnement
- Bundle de proxy d'API
- Fichier de trace pour les requêtes API
Journaux d'accès NGINX
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_logOù : ORG, ENV et PORT# sont remplacés par des valeurs réelles.
Journaux système du processeur de messages
/opt/apigee/var/log/edge-message-processor/logs/system.log