Estás viendo la documentación de Apigee Edge.
Ve a la
Documentación de Apigee X. información
Síntoma
La aplicación cliente obtiene un código de estado HTTP de 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, puedes observar el siguiente mensaje de error:
{ "fault":{ "faultstring":"Bad Form Data", "detail":{ "errorcode":"protocol.http.BadFormData" } } }
Datos de formulario
Antes de adentrarnos en los detalles de la solución de este problema, veamos qué son los datos de formularios.
Los datos de un formulario son la información que proporciona el usuario normalmente a través de un formulario HTML con elementos como una casilla de entrada de texto, un botón o una casilla de verificación. Los datos del formulario generalmente se envían como una serie de pares clave-valor como parte de las solicitudes o respuestas HTTP.
Transmisión de datos de formularios
- 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: Artículo 17.13.4.1
- El encabezado
Content-Type: application/x-www-form-urlencoded
Solicitud de muestra con datos del formulario:
curl https://HOSTALIAS/somepath -H "Content-Type: application/x-www-form-urlencoded" -d "username=abc@google.com&pasword=secret123"
- Todos los caracteres que no sean alfanuméricos en las claves y los valores
porcentaje codificado, es decir, se representan como un triplete de caracteres
%HH
, que consiste en 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 (
%
) está permitido en los datos del formulario, es se interpreta como el inicio de una secuencia de escape especial. Por lo tanto, si los datos del formulario deben contienen el signo de porcentaje (%
) en la clave o el valor, se deben transmitir como%25,
, que representa el código ASCII del 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 quieres transmitir grandes cantidades de datos binarios o texto que contiene datos no ASCII caracteres, puedes enviar los datos con el
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-urlencoded
y- Datos de formulario con el signo de porcentaje (
%
) o de porcentaje (%
) seguido de caracteres hexadecimales no válidos que no se permiten según Formularios: Artículo 17.13.4.1
El proxy de API en Apigee Edge lee los parámetros específicos del formulario que contienen cualquier carácter. que no están permitidas para usarse en el flujo de solicitud con las variables ExtractVariables o de la política deAssignMessage.
Por ejemplo, si los datos del formulario contienen el signo de porcentaje (
%
) tal como está (sin codificación) o el signo de porcentaje (%
) seguido de cualquier hexadecimal no válido caracteres en la clave o el valor, verá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 de la solicitud tienen caracteres no permitidos Los parámetros de formulario que pasa el cliente como parte de la solicitud HTTP contienen cualquier caracteres que no están permitidos en uso. Usuarios perimetrales de nubes públicas y privadas
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 la supervisión de API, haz lo siguiente:
- Accede a la IU de Apigee Edge como usuario con un el rol adecuado.
Cambia a la organización en la que quieres investigar el problema.
- Navega a Analyze > Supervisión de API > Investigar.
- Selecciona el período específico en el que observaste los errores.
Traza Código de error en Tiempo.
Selecciona una celda que tenga el código de error
protocol.http.BadFormData
como como se muestra a continuación:La información sobre el código de falla
protocol.http.BadFormData
es se muestra a continuación:Haz clic en Ver registros y expande la fila de la solicitud con errores.
- En la ventana Registros, observa los siguientes detalles:
- Código de estado:
500
- Fuente del error:
proxy
- Código de error:
protocol.http.BadFormData
- Política de fallas:
extractvariables/EV-ExtractFormParams
- Código de estado:
- Si Fault Source es
proxy
, Fault Code esprotocol.http.BadFormData
y Fault Policy no están vacíos; entonces, indica que el error se produjo mientras la política específica indicada en Fault La política era leer o extraer los datos del formulario (parámetros de formulario) que tienen caracteres que no están permitidos en uso. - En este ejemplo, X-Apigee-fault-policy es
extractvariables/EV- ExtractFormParams,
, lo que significa que la política ExtractVariables llamada Se produjo un error en EV-ExtractFormParams mientras se leía o extraía el formulario. parámetros.
Herramienta de seguimiento
Para diagnosticar el error con la herramienta Trace, sigue estos pasos:
- Habilita la sesión de seguimiento.
y:
- Espera a que se produzca el error
500 Internal Server Error
. - Si puedes reproducir el problema, realiza la llamada a la API para hacerlo.
500 Internal Server Error
- Espera a que se produzca el error
Asegúrate de que Show all FlowInfos esté habilitado:
- Selecciona una de las solicitudes fallidas y examina el seguimiento.
- Navega por las diferentes fases del seguimiento y localiza dónde se produjo la falla para determinar si se produjo un error.
Por lo general, encontrarás el error en una de las políticas, como se muestra a continuación:
En el seguimiento de muestra anterior, ten en cuenta que el error ocurrió en el La política ExtractVariables llamada
EV-ExtractFormParams
.Navega al flujo llamado Error después de la política específica que falló:
- Toma nota de los valores de lo siguiente del seguimiento:
error:
Bad Form Data
estado:
PROXY_REQ_FLOW
error.class:
com.apigee.rest.framework.BadRequestException
- El valor del error
Bad Form Data
indica que el formulario tenían algunos caracteres que no se permite. - El valor del estado
PROXY_REQ_FLOW,
indica que el error ocurrió en el flujo de solicitud del proxy de API.
- El valor del error
- Navega a la fase AX (datos registrados de Analytics) en el seguimiento y haz clic en que la modifica.
Desplázate hacia abajo hasta la sección Detalles de la fase - Encabezados de error y, luego, determinar 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.BadFormData
ypolicy
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 se leer o extraer los datos del formulario (parámetros de formulario), que tenían caracteres que no están permitidos.Encabezados de respuesta Valor X-Apigee-fault-code protocol.http.BadFormData
X-Apigee-fault-source policy
X-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 llamada Se produjo un error conEV-ExtractFormParams
mientras se leía o extraía el formulario. parámetros.
NGINX
Para diagnosticar el error con los registros de acceso de NGINX, haz lo siguiente:
- Si eres un usuario de la nube privada, puedes usar los registros de acceso de NGINX para
determina la información clave sobre
500 Internal Server Error
HTTP. Verifica los registros de acceso de NGINX:
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log
- Realiza una búsqueda para ver si hay algún error
500
con el código de errorprotocol.http.BadFormData
durante un período específico (si el problema en el pasado) o si todavía hay solicitudes que fallan500
Si encuentras algún error
500
con el código X-Apigee-fault-code coincide con el valor deprotocol.http.BadFormData
, luego determinar 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.BadFormData
X-Apigee-fault-source policy
X-Apigee-fault-policy extractvariables/EV-ExtractFormParams
- Ten en cuenta que los valores de X-Apigee-fault-code, X-Apigee-fault-source
son
protocol.http.BadFormData
,policy
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, se leer o extraer los datos del formulario (parámetros de formulario), que tenían caracteres que no están permitidos. - En este ejemplo, X-Apigee-fault-policy es
extractvariables/EV- ExtractFormParams,
, lo que significa que la política ExtractVariables llamadaEV-ExtractFormParams
falló al leer el formulario parámetros.
Causa: Los parámetros de formulario de la solicitud tienen caracteres no permitidos
Diagnóstico
- Determina el código de errores, la fuente de errores y la política de errores de
500 Internal Server Error
con la supervisión de API, la herramienta de seguimiento o los registros de acceso de NGINX como se explica. en Pasos comunes del diagnóstico. - Si Fault Code es
protocol.http.BadFormData
, la Fault Source tiene el valorproxy
opolicy
, y Fault Policy no es vacía, significa que la política especificada en Política de errores falló mientras leer o extraer los datos del formulario (parámetros de formulario). - Examina la política indicada en la Política de fallas y determina lo siguiente:
información:
- Fuente: Determina si la política lee o extrae los datos de solicitud o respuesta.
- Parámetros de formulario: Determina los parámetros de forma específicos que se leen en el
política de la empresa.
Ejemplo 1
Ejemplo 1: Política ExtractVariables que extrae los parámetros del 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, haz lo siguiente:
Fuente:
request
Esto se indica con el elemento
<Source>
.Parámetros del formulario:
username
ypassword
Esto se indica mediante el elemento
<Pattern>
dentro del Elemento<FormParam>
Esto indica que los parámetros de forma
username
opassword
pasado como parte de la solicitud HTTP del cliente al Apigee Edge contiene caracteres que no están permitidos en su uso.Ejemplo 2
Ejemplo 2: Parámetros del formulario de copia de la política deAssignMessage:
<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, haz lo siguiente:
Origen:
request
Esto se indica mediante el atributo
source
en el Elemento<Copy>
Parámetros del formulario:
username
ypassword
Esto se indica mediante el atributo
name
en el Elemento<FormParam>
Esto indica que los parámetros de forma
username
,password
o que el cliente pasa como parte de la solicitud HTTP a Apigee Edge contiene cualquier caracteres que no están permitidos.
Comprueba si hay caracteres que no se permiten caracteres usados en los parámetros de forma identificados en el paso 3 con uno de los siguientes métodos:
Herramienta de seguimiento
Para validar con la herramienta Trace, haz lo siguiente:
- Si capturaste el seguimiento de la solicitud con errores como se explica en Pasos comunes del diagnóstico y, luego, seleccione uno de los para las solicitudes erróneas.
- Si determinaste que los parámetros del formulario que contienen caracteres
que no pueden usarse son parte de la solicitud HTTP en
el paso 3 anterior y, luego,
- .
- Navega a la fase Solicitud recibida del cliente.
Desplázate hasta la sección Detalles de la fase y revisa las Solicita Contenido.
- En el ejemplo anterior, ten en cuenta que el parámetro de formulario
password
contiene el signo de porcentaje (%
). - Dado que el signo de porcentaje (
%
) también se usa para codificación porcentual los caracteres especiales, no se puede usar tal como están los datos del formulario. - Por lo tanto, Apigee Edge responde con
500 Internal Server Error
por 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 hizo al servidor de destino, luego ve a Resolución.
- Si tienes acceso a la solicitud real que se hizo a Apigee Edge, realiza
sigue estos pasos:
- Revisa el contenido de los datos del formulario y fíjate si contiene algún carácter que
no se permiten, por ejemplo, el signo de porcentaje (
%
) o el signo de porcentaje (%
) seguido de los caracteres no válidos con caracteres hexadecimales.Ejemplo 1
Solicitud de ejemplo n.o 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_secret
contiene el signo de porcentaje (%
) seguido del caracteres hexadecimales no válidosZY
.Ejemplo 2
Solicitud de ejemplo n° 2: Datos del formulario pasados en un archivo:
curl -X GET "https://HOSTALIAS/myproxy -H "Content-Type: application/x-www-form-urlencoded" -d @form_data.xml
Contenidos de form_data.xml:
xml=<user><username>abc1234@google.com</username><password>qwerty12345!@#$%</password></user>
En este ejemplo, ten en cuenta que el elemento
password
contiene el signo de porcentaje (%
), que no debe ser y se pasan tal como están en los datos del formulario.
- Revisa el contenido de los datos del formulario y fíjate si contiene algún carácter que
no se permiten, por ejemplo, el signo de porcentaje (
- En los dos ejemplos anteriores, los datos del formulario enviados como parte de la solicitud HTTP a Apigee Edge contiene caracteres que no están permitidos en su uso.
- Por lo tanto, Apigee Edge responde con
500 Internal Server Error
con el código de errorprotocol.http.BadFormData
.
Solución
- Asegúrate de que se incluyan caracteres especiales en las claves y los valores de los datos o parámetros del formulario que el cliente envía como parte de la solicitud HTTP, siempre se codifican como se explica en Datos de formulario: application/x-www-form-urlencoded.
- En el caso de los ejemplos que se mencionaron anteriormente, puedes solucionar los problemas de la siguiente manera:
Ejemplo 1
Ejemplo 1: Datos del formulario que se pasan como parte de la solicitud:
Usa válidas caracteres hexadecimales que coinciden 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"
Ejemplo 2
Solicitud de ejemplo n° 2: Datos del formulario pasados en un archivo:
curl -X GET "https://HOSTALIAS/myproxy -H "Content-Type: application/x-www-form-urlencoded" -d @form_data.xml
Contenidos de form_data.xml:
Usa el codificación porcentual para el signo de porcentaje (
%
), que es la modificación del archivo al tienen%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 de formulario se envíen de acuerdo con las siguientes especificaciones:
Especificación |
---|
Datos de formulario: application/x-www-form-urlencoded |
Si aún necesitas asistencia del equipo de asistencia de Apigee, ve a Debes recopilar y la 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, reúne la siguiente información de diagnóstico y, luego, comunícate con el equipo de 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
- Completa el comando
curl
que se usa para reproducir la500 Internal Server Error
con el código de errorprotocol.http.BadFormData
- Archivo de seguimiento de las solicitudes a la API
Si eres un usuario de la Nube privada, proporciona la siguiente información:
- Mensaje de error completo observado para las solicitudes fallidas
- Nombre del entorno
- Paquete de proxy de API
- Archivo de seguimiento de las solicitudes a la API
Registros de acceso de NGINX
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log
Dónde: ORG, ENV y PORT# se reemplazan por valores reales.
Registros del sistema del procesador de mensajes
/opt/apigee/var/log/edge-message-processor/logs/system.log