Estás viendo la documentación de Apigee Edge.
Ir a la documentación de
Apigee X. info
Síntoma
La aplicación cliente obtiene un código de estado HTTP 500 Internal Server Error con el código de error protocol.http.BadFormData como respuesta a las llamadas a la API.
Mensaje de error
La aplicación cliente obtiene el siguiente código de respuesta:
HTTP/1.1 500 Internal Server Error
Además, es posible que observes el siguiente mensaje de error:
{
"fault":{
"faultstring":"Bad Form Data",
"detail":{
"errorcode":"protocol.http.BadFormData"
}
}
}Datos de formulario
Antes de entrar en los detalles para solucionar este problema, veamos qué son los datos de formulario.
Los datos del formulario son la información que proporciona el usuario, generalmente a través de un formulario HTML que tiene elementos como un cuadro de entrada de texto, un botón o una casilla de verificación. Por lo general, los datos del formulario se envían como una serie de pares clave-valor como parte de las solicitudes o respuestas HTTP.
Transmisión de datos de formulario
- Content-Type: application/x-www-form-urlencoded
- Si el tamaño de los datos del formulario es pequeño, los datos se envían como pares clave-valor con lo siguiente:
- Los caracteres de ambas claves codificados según las reglas explicadas en Formularios - Sección 17.13.4.1
- El encabezado
Content-Type: application/x-www-form-urlencoded
Solicitud de muestra con datos de formulario:
curl https://HOSTALIAS/somepath -H "Content-Type: application/x-www-form-urlencoded" -d "username=abc@google.com&pasword=secret123"
- Todos los caracteres no alfanuméricos en las claves y los valores están
codificados como porcentaje, es decir, se representan como un triplete de caracteres
%HH, que consta de un signo de porcentaje seguido de dos dígitos hexadecimales que representan el código ASCII del carácter específico. - Por lo tanto, aunque el signo de porcentaje (
%) se permite en los datos del formulario, se interpreta como el inicio de una secuencia de escape especial. Por lo tanto, si los datos del formulario deben contener el signo de porcentaje (%) en la clave o el valor, se deben transmitir como%25,, que representa el código ASCII del carácter de signo de porcentaje (%).
- Si el tamaño de los datos del formulario es pequeño, los datos se envían como pares clave-valor con lo siguiente:
- Content-Type: multipart/form-data
Si deseas transmitir grandes cantidades de datos binarios o texto que contenga caracteres que no sean ASCII, puedes enviar los datos con
Content-Type:multipart/form-data, como se explica en Formularios: Sección 17.13.4.2
Causas posibles
Este error se produce si y solo si se cumplen todas las siguientes condiciones:
- La solicitud HTTP que envió el cliente a Apigee Edge contiene lo siguiente:
Content-Type: application/x-www-form-urlencodedy- Datos del formulario con el signo de porcentaje (
%) o el signo de porcentaje (%) seguido de caracteres hexadecimales no válidos que no están permitidos según Formularios: Sección 17.13.4.1.
El proxy de API en Apigee Edge lee los parámetros de formulario específicos que contienen cualquier carácter que no se permita usar en el flujo de solicitud con la política ExtractVariables o AssignMessage.
Por ejemplo, si los datos del formulario contienen el signo de porcentaje (
%) tal como está (sin codificar) o el signo de porcentaje (%) seguido de caracteres hexadecimales no válidos en la clave o el valor, recibirás este error.Estas son las posibles causas de este error:
Causa Descripción Instrucciones de solución de problemas aplicables para Los parámetros del formulario en la solicitud tienen caracteres no permitidos Los parámetros de formulario que el cliente pasa como parte de la solicitud HTTP contienen caracteres que no se permiten. Usuarios de la nube pública y privada de Edge
Pasos comunes de diagnóstico
Usa una de las siguientes herramientas o técnicas para diagnosticar este error:
Supervisión de API
Para diagnosticar el error con API Monitoring, haz lo siguiente:
- Accede a la IU de Apigee Edge como usuario con un rol adecuado.
Cambia a la organización en la que deseas investigar el problema.
- Navega a la página Analizar > Supervisión de API > Investigar.
- Selecciona el período específico en el que observaste los errores.
Representa gráficamente el código de falla en función del tiempo.
Selecciona una celda que tenga el código de falla
protocol.http.BadFormData, como se muestra a continuación:(aumentar el tamaño de la imagen)
La información sobre el código de falla
protocol.http.BadFormDatase muestra como se indica a continuación:(aumentar el tamaño de la imagen)
Haz clic en Ver registros y expande la fila de la solicitud con errores.
- En la ventana Registros, ten en cuenta los siguientes detalles:
- Código de estado:
500 - Fuente del error:
proxy - Código de falla:
protocol.http.BadFormData - Política de fallas:
extractvariables/EV-ExtractFormParams
- Código de estado:
- Si la Fuente de error es
proxy, el Código de error esprotocol.http.BadFormDatay la Política de error no está vacía, esto indica que el error se produjo mientras la política específica indicada en Política de error leía o extraía los datos del formulario (parámetros del formulario) que tienen caracteres que no se permiten usar. - En este ejemplo, X-Apigee-fault-policy es
extractvariables/EV- ExtractFormParams,, lo que significa que la política ExtractVariables llamada EV-ExtractFormParams falló durante la lectura o la extracción de los parámetros del formulario.
Herramienta de Trace
Para diagnosticar el error con la herramienta Trace, haz lo siguiente:
- Habilita la sesión de registro y realiza una de las siguientes acciones:
- Espera a que se produzca el error
500 Internal Server Error. - Si puedes reproducir el problema, realiza la llamada a la API para reproducirlo.
500 Internal Server Error
- Espera a que se produzca el error
Asegúrate de que la opción Mostrar todos los FlowInfos esté habilitada:
- Selecciona una de las solicitudes con errores y examina el registro.
- Navega por las diferentes fases del registro y ubica dónde se produjo la falla.
Por lo general, encontrarás el error en una de las políticas, como se muestra a continuación:
En el registro de muestra anterior, ten en cuenta que la falla se produjo en la política de ExtractVariables llamada
EV-ExtractFormParams.Navega al flujo llamado Error después de la política específica que falló:
- Ten en cuenta los valores de los siguientes elementos del registro:
error:
Bad Form Datastate:
PROXY_REQ_FLOWerror.class:
com.apigee.rest.framework.BadRequestException- El valor del error
Bad Form Dataindica que los parámetros del formulario tenían algunos caracteres que no se permiten usar. - El valor del estado
PROXY_REQ_FLOW,indica que el error se produjo en el flujo de solicitud del proxy de API.
- El valor del error
- Navega a la fase AX (datos de Analytics registrados) en el registro y haz clic en ella.
Desplázate hacia abajo hasta la sección Phase Details - Error Headers y determina los valores de X-Apigee-fault-code, X-Apigee-fault-source y X-Apigee-fault-policy, como se muestra a continuación:
Ten en cuenta que los valores de X-Apigee-fault-code y X-Apigee-fault-source son
protocol.http.BadFormDataypolicy, respectivamente, y X-Apigee-fault-policy no está vacío. Esto indica que el error se produjo mientras la política específica indicada en X-Apigee-fault-policy leía o extraía los datos del formulario (parámetros del formulario), que contenían caracteres que no se permiten usar.Encabezados de respuesta Valor X-Apigee-fault-code protocol.http.BadFormDataX-Apigee-fault-source policyX-Apigee-fault-policy extractvariables/EV-ExtractFormParams- En este ejemplo, X-Apigee-fault-policy es
extractvariables/EV- ExtractFormParams,, lo que significa que la política ExtractVariables llamadaEV-ExtractFormParamsfalló al leer o extraer los parámetros del formulario.
NGINX
Para diagnosticar el error con los registros de acceso de NGINX, haz lo siguiente:
- Si eres usuario de Private Cloud, puedes usar los registros de acceso de NGINX para determinar la información clave sobre
500 Internal Server Errorde HTTP. Verifica los registros de acceso de NGINX:
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log- Busca si hay errores de
500con el código de errorprotocol.http.BadFormDatadurante un período específico (si el problema ocurrió en el pasado) o si aún hay solicitudes que fallan con500. Si encuentras errores de
500con el X-Apigee-fault-code que coincida con el valor deprotocol.http.BadFormData, determina el valor de X-Apigee-fault-source y X-Apigee-fault-policy.Ejemplo de error 500 del registro de acceso de NGINX:
La entrada de ejemplo anterior del registro de acceso de NGINX tiene los siguientes valores para X-Apigee-fault-code y X-Apigee-fault-source:
Encabezados Valor X-Apigee-fault-code protocol.http.BadFormDataX-Apigee-fault-source policyX-Apigee-fault-policy extractvariables/EV-ExtractFormParams- Ten en cuenta que los valores de X-Apigee-fault-code y X-Apigee-fault-source son
protocol.http.BadFormDataypolicy, respectivamente, y que X-Apigee-fault-policy no está vacío. Esto indica que el error se produjo mientras la política específica indicada en X-Apigee-fault-policy leía o extraía los datos del formulario (parámetros del formulario), que contenían caracteres que no se permiten usar. - En este ejemplo, X-Apigee-fault-policy es
extractvariables/EV- ExtractFormParams,, lo que significa que la política ExtractVariables llamadaEV-ExtractFormParamsfalló mientras leía los parámetros del formulario.
Causa: Los parámetros del formulario en la solicitud tienen caracteres no permitidos
Diagnóstico
- Determina el código de error, la fuente del error y la política de errores para
500 Internal Server Errorcon la Supervisión de API, la herramienta Trace o los registros de acceso de NGINX, como se explica en los pasos de diagnóstico comunes. - Si el código de error es
protocol.http.BadFormData, la fuente del error tiene el valorproxyopolicy, y la política de error no está vacía, esto indica que la política especificada en política de error falló durante la lectura o extracción de los datos del formulario (parámetros del formulario). - Examina la política indicada en Política de errores y determina la siguiente información:
- Fuente: Determina si la política lee o extrae los datos de la solicitud o la respuesta.
- Parámetros del formulario: Determinan los parámetros específicos del formulario que se leen en la política.
Ejemplo 1
Ejemplo 1: Política ExtractVariables que extrae parámetros de un formulario:
<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>En la política ExtractVariables anterior, sucede lo siguiente:
Fuente:
requestEsto se indica con el elemento
<Source>.Parámetros del formulario:
usernameypasswordEsto se indica con el elemento
<Pattern>dentro del elemento<FormParam>.
Esto indica que los parámetros de formulario
usernameopasswordque el cliente pasó como parte de la solicitud HTTP a Apigee Edge contienen caracteres que no se permiten.Muestra 2
Ejemplo 2: Política de AssignMessage que copia parámetros de formulario:
<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>
En la política ExtractVariables anterior, sucede lo siguiente:
Origen:
requestEsto se indica con el atributo
sourceen el elemento<Copy>.Parámetros del formulario:
usernameypasswordEsto se indica con el atributo
nameen el elemento<FormParam>.
Esto indica que los parámetros de formulario
usernameopassword, o ambos, que el cliente pasó como parte de la solicitud HTTP a Apigee Edge contienen caracteres que no se permiten.
Verifica si hay caracteres que no se permiten en los parámetros del formulario identificados en el paso 3 con uno de los siguientes métodos:
Herramienta de Trace
Para realizar la validación con la herramienta de seguimiento, sigue estos pasos:
- Si capturaste el registro de la solicitud con errores como se explica en Pasos comunes de diagnóstico, selecciona una de las solicitudes con errores.
- Si determinaste que los parámetros del formulario que contienen caracteres que no se permiten usar forman parte de la solicitud HTTP en el paso 3 anterior, haz lo siguiente:
- Navega a la fase Solicitud recibida del cliente.
Desplázate hacia abajo hasta la sección Phase Details y revisa el Request Content.
( aumentar el tamaño de la imagen)
- En el ejemplo anterior, ten en cuenta que el parámetro de formulario
passwordcontiene el signo de porcentaje (%). - Dado que el signo de porcentaje (
%) también se usa para la codificación de porcentaje de los caracteres especiales, no se puede usar tal como está en los datos del formulario. - Por lo tanto, Apigee Edge responde con
500 Internal Server Errory el código de errorprotocol.http.BadFormData.
Solicitud real
Para validar con la solicitud real, haz lo siguiente:
- Si no tienes acceso a la solicitud real que se envió al servidor de destino, ve a Resolución.
- Si tienes acceso a la solicitud real que se envió a Apigee Edge, realiza los siguientes pasos:
- Revisa el contenido de los datos del formulario y comprueba si contiene caracteres que no se permiten, como el signo de porcentaje (
%) o el signo de porcentaje (%) seguido de caracteres hexadecimales no válidos.Ejemplo 1
Solicitud de ejemplo núm. 1: Datos del formulario como parte de la solicitud
curl -X GET "https://HOSTALIAS/myproxy -H "Content-Type: application/x-www-form-urlencoded" -d "client_id=123456abc123&client_secret=c23578%ZY"
En este ejemplo, ten en cuenta que el elemento
client_secretcontiene el signo de porcentaje (%) seguido de caracteres hexadecimales no válidosZY.Muestra 2
Solicitud de ejemplo núm. 2: Datos del formulario que se pasan en un archivo:
curl -X GET "https://HOSTALIAS/myproxy -H "Content-Type: application/x-www-form-urlencoded" -d @form_data.xml
Contenido de form_data.xml:
xml=<user><username>abc1234@google.com</username><password>qwerty12345!@#$%</password></user>
En este ejemplo, ten en cuenta que el elemento
passwordcontiene el signo de porcentaje (%), que no se debe pasar tal cual en los datos del formulario.
- Revisa el contenido de los datos del formulario y comprueba si contiene caracteres que no se permiten, como el signo de porcentaje (
- En los dos ejemplos anteriores, los datos del formulario que se enviaron como parte de la solicitud HTTP a Apigee Edge contienen caracteres que no se permiten.
- Por lo tanto, Apigee Edge responde con
500 Internal Server Errorcon el código de errorprotocol.http.BadFormData.
Solución
- Asegúrate de que los caracteres especiales en las claves y los valores de los datos o parámetros del formulario que envía el cliente como parte de la solicitud HTTP siempre estén codificados como se explica en Form Data - application/x-www-form-urlencoded.
- En los ejemplos anteriores, puedes corregir los problemas de la siguiente manera:
Ejemplo 1
Ejemplo 1: Datos del formulario que se pasan como parte de la solicitud:
Usa caracteres hexadecimales válidos que coincidan con el código ASCII de un carácter específico. Por ejemplo, si quieres enviar el signo de dólar (
$), usa%24, como se muestra a continuación:curl -X GET "https://HOSTALIAS/myproxy -H "Content-Type: application/x-www-form-urlencoded" -d "client_id=123456abc123&client_secret=c23578%24"
Muestra 2
Solicitud de ejemplo núm. 2: Datos del formulario que se pasan en un archivo:
curl -X GET "https://HOSTALIAS/myproxy -H "Content-Type: application/x-www-form-urlencoded" -d @form_data.xml
Contenido de form_data.xml:
Usa la codificación de porcentaje para el signo de porcentaje (
%), es decir, modifica el archivo para que tenga%25, como se muestra a continuación:xml=<user><username>abc1234@google.com</username><password>qwerty12345!!@#$%25</password></user>
Especificación
Apigee Edge espera que los datos del formulario se envíen según las siguientes especificaciones:
| Especificación |
|---|
| Datos de formulario: application/x-www-form-urlencoded |
Si aún necesitas ayuda del equipo de asistencia de Apigee, consulta Recopila información de diagnóstico.
Se debe recopilar información de diagnóstico
Si el problema persiste incluso después de seguir las instrucciones anteriores, recopila la siguiente información de diagnóstico y, luego, comunícate con Asistencia de Apigee Edge:
Si eres usuario de la nube pública, proporciona la siguiente información:
- Nombre de la organización
- Nombre del entorno
- Nombre del proxy de API
- Comando
curlcompleto que se usa para reproducir el500 Internal Server Errorcon el código de errorprotocol.http.BadFormData - Archivo de registro de las solicitudes a la API
Si eres usuario de la nube privada, proporciona la siguiente información:
- Mensaje de error completo observado para las solicitudes con errores
- Nombre del entorno
- Paquete de proxy de API
- Archivo de registro de las solicitudes a la API
Registros de acceso de NGINX
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_logDónde: ORG, ENV y PORT# se reemplazan por valores reales.
Registros del sistema del Message Processor
/opt/apigee/var/log/edge-message-processor/logs/system.log