Error interno del servidor: Error de datos del formulario

Estás consultando la documentación de Apigee Edge.
Consulta 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, es posible que veas 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 formularios.

Los datos del formulario son la información que proporciona el usuario en general a través de un formulario HTML que tiene elementos como una casilla 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 formularios

  1. Content-Type: application/x-www-form-urlEncoding
    • Si el tamaño de los datos del formulario es pequeño, los datos se envían como pares clave-valor con los siguientes elementos:
      • Los caracteres de ambas claves codificados según las reglas que se explican en Formularios: sección 17.13.4.1
      • El encabezado Content-Type: application/x-www-form-urlencoded

      Ejemplo de solicitud con datos del formulario:

      curl https://HOSTALIAS/somepath -H "Content-Type: application/x-www-form-urlencoded" -d "username=abc@google.com&pasword=secret123"
      
    • Los caracteres que no sean alfanuméricos en las claves y los valores están codificados con porcentajes, 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 (%) está permitido 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, deben transmitirse como %25, , que representa el código ASCII para el carácter del signo de porcentaje (%).
  2. Tipo de contenido: multipart/form-data

    Si deseas transmitir grandes cantidades de datos binarios o de texto que contiene caracteres que no son 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:

  1. La solicitud HTTP que envía el cliente a Apigee Edge contiene lo siguiente:
    1. Content-Type: application/x-www-form-urlencoded y
    2. Datos de formulario con el signo de porcentaje (%) o el signo de porcentaje (%) seguido de caracteres hexadecimales no válidos que no se permiten según Formularios: sección 17.13.4.1
  2. El proxy de la API en Apigee Edge lee los parámetros de formulario específicos que contienen caracteres que no están permitidos en el flujo de solicitud mediante la política ExtractVariables oAssignMessage.

    Por ejemplo, si los datos del formulario contienen el signo de porcentaje (%) tal como están (sin codificación) o el signo de porcentaje (%) seguido de cualquier carácter hexadecimal no válido en la clave o el valor, se mostrará este error.

    A continuación, se muestran las posibles causas de este error:

    Causa Descripción Instrucciones de solución de problemas aplicables para
    Los parámetros de formulario de la solicitud tienen caracteres no permitidos Los parámetros de formulario que pasa el cliente como parte de la solicitud HTTP contienen caracteres que no están permitidos en su uso. 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 la supervisión de la API, sigue estos pasos:

  1. Accede a la IU de Apigee Edge como un usuario con un rol adecuado.
  2. Cambia a la organización en la que quieres investigar el problema.

  3. Navega a la página Analyze > API Monitoring > Investigate.
  4. Selecciona el período específico en el que observaste los errores.
  5. Traza el código de falla en función del valor Time.

  6. 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)

  7. A continuación, se muestra información sobre el código de falla protocol.http.BadFormData:

    (aumentar el tamaño de la imagen)

  8. Haz clic en Ver registros y expande la fila de la solicitud con errores.

  9. En la ventana Registros, ten en cuenta los siguientes detalles:
    • Código de estado: 500
    • Fuente de la falla: proxy
    • Código de falla: protocol.http.BadFormData
    • Política de fallas: extractvariables/EV-ExtractFormParams
  10. Si Fault Source es proxy, Fault Code es protocol.http.BadFormData y la Fault Policy no está vacía, significa que el error se produjo mientras la política específica indicada en Fault Policy estaba leyendo o extrayendo los datos del formulario (parámetros del formulario), que tienen caracteres que no están permitidos.
  11. En este ejemplo, X-Apigee-fault-policy es extractvariables/EV- ExtractFormParams, , lo que significa que la política ExtractVariables llamada EV-ExtractFormParams falló mientras se leían o extraían los parámetros del formulario.

Herramienta de seguimiento

Para diagnosticar el error con la herramienta Trace, sigue estos pasos:

  1. Habilita la sesión de seguimiento y realiza una de estas acciones:
    • Espera a que ocurra el error 500 Internal Server Error.
    • Si puedes reproducir el problema, realiza la llamada a la API para reproducirlo 500 Internal Server Error
  2. Asegúrate de que la opción Show all FlowInfos esté habilitada:

  3. Selecciona una de las solicitudes con errores y examina el seguimiento.
  4. Navega por las diferentes fases del seguimiento y localiza dónde ocurrió la falla.
  5. Generalmente, el error se encuentra en una de las políticas, como se muestra a continuación:

    En el seguimiento de muestra anterior, ten en cuenta que el error se produjo en la política ExtractVariables llamada EV-ExtractFormParams.

  6. Navega al flujo denominado Error después de la política específica que falló:

  7. Observa los valores de lo siguiente en el 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 los parámetros de formulario tenían algunos caracteres que no están permitidos.
    • El valor del estado PROXY_REQ_FLOW, indica que el error se produjo en el flujo de solicitud del proxy de la API.
  8. Navega a la fase AX (datos registrados de Analytics) en el seguimiento y haz clic en ella.
  9. Desplázate hacia abajo hasta la sección Detalles de la fase: Encabezados de error y determina los valores de X-Apigee-fault-code, X-Apigee-fault-source y X-Apigee-fault-policy como se muestra a continuación:

  10. Ten en cuenta que los valores de X-Apigee-fault-code y X-Apigee-fault-source son protocol.http.BadFormData y policy respectivamente, y de 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 estaba leyendo o extrayendo los datos del formulario (parámetros del formulario), los cuales 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
  11. En este ejemplo, X-Apigee-fault-policy es extractvariables/EV- ExtractFormParams, , lo que significa que la política ExtractVariables llamada EV-ExtractFormParams falló mientras se leían o extraían los parámetros del formulario.

NGINX

Para diagnosticar el error con los registros de acceso de NGINX, sigue estos pasos:

  1. Si eres un usuario de la nube privada, puedes usar los registros de acceso de NGINX para determinar la información clave de 500 Internal Server Error de HTTP.
  2. Verifica los registros de acceso de NGINX:

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

  3. Busca para ver si hay errores 500 con el código de error protocol.http.BadFormData durante un período específico (si el problema ocurrió en el pasado) o si hay alguna solicitud que aún falla con 500.
  4. Si encuentras algún error 500 con X-Apigee-fault-code que coincide con el valor de protocol.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.BadFormData
    X-Apigee-fault-source policy
    X-Apigee-fault-policy extractvariables/EV-ExtractFormParams
  5. Ten en cuenta que los valores de X-Apigee-fault-code y 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, estaba leyendo o extrayendo los datos del formulario (parámetros del formulario), que tenían caracteres que X-Apigee-fault-policy,.
  6. En este ejemplo, X-Apigee-fault-policy es extractvariables/EV- ExtractFormParams, , lo que significa que la política ExtractVariables llamada EV-ExtractFormParams falló mientras se leían los parámetros del formulario.

Causa: Los parámetros del formulario de la solicitud tienen caracteres no permitidos

Diagnóstico

  1. Determina el código de error, la fuente de errores y la política de fallas de 500 Internal Server Error mediante la supervisión de la API, la herramienta de Trace o los registros de acceso de NGINX, como se explica en Pasos comunes de diagnóstico.
  2. Si Fault Code es protocol.http.BadFormData, Fault Source tiene el valor proxy o policy y la Fault Policy no está vacía, esto indica que la política especificada en Fault Policy falló al leer o extraer los datos del formulario (parámetros del formulario).
  3. Examina la política indicada en la Política de fallas y determina la siguiente información:
    1. Fuente: Determina si la política lee o extrae los datos de una solicitud o respuesta.
    2. Parámetros de formulario: Determina los parámetros de formulario específicos que se leen en la política.

      Ejemplo 1

      Ejemplo 1: Política ExtractVariables que extrae parámetros de 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, ocurre lo siguiente:

      • Fuente: request

        Esto se indica mediante el elemento <Source>

      • Parámetros de formulario: username y password

        Esto se indica mediante el elemento <Pattern> dentro del elemento <FormParam>.

      Esto indica que los parámetros de formulario username o password que pasó como parte de la solicitud HTTP por parte del cliente a Apigee Edge contienen caracteres que no se permiten.

      Muestra n.o 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, ocurre lo siguiente:

      • Origen: request

        Esto se indica mediante el atributo source en el elemento <Copy>.

      • Parámetros de formulario: username y password

        Esto se indica mediante el atributo name en el elemento <FormParam>.

      Esto indica que los parámetros de formulario username o password, o ambos pasados como parte de la solicitud HTTP por parte del cliente a Apigee Edge, contienen caracteres que no están permitidos.

  4. Comprueba si hay caracteres no permitidos en los parámetros de formulario identificados en el paso 3 con uno de los siguientes métodos:

    Herramienta de seguimiento

    Para validar mediante la herramienta Trace, sigue estos pasos:

    1. Si capturaste el seguimiento de la solicitud con errores como se explica en Pasos de diagnóstico comunes, selecciona una de las solicitudes con errores.
    2. Si determinaste que los parámetros del formulario que contienen caracteres no permitidos forman parte de la solicitud HTTP del paso 3 anterior, entonces
      1. Navega a la fase Solicitud recibida del cliente.
      2. Desplázate hacia abajo hasta la sección Detalles de la fase y revisa el Contenido de la solicitud.

        ( ver imagen más grande)

      3. En el ejemplo anterior, ten en cuenta que el parámetro de formulario password contiene el signo de porcentaje (%).
      4. Debido a 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.
      5. Por lo tanto, Apigee Edge responde con 500 Internal Server Error con el código de error protocol.http.BadFormData.

    Solicitud real

    Para validar el uso de la solicitud real, sigue estos pasos:

    1. Si no tienes acceso a la solicitud real que se hizo al servidor de destino, ve a Resolución.
    2. Si tienes acceso a la solicitud real que se realizó a Apigee Edge, sigue estos pasos:
      1. Revisa el contenido de los datos del formulario y comprueba si contiene caracteres que no se permitan, como el signo de porcentaje (%) o el signo de porcentaje (%) seguido de caracteres hexadecimales no válidos.

        Ejemplo 1

        Ejemplo de solicitud n° 1: Formulario con datos 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 de los caracteres hexadecimales no válidos ZY.

        Muestra n.o 2

        Solicitud de muestra n° 2: Datos de formulario pasados 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 password contiene el signo de porcentaje (%), que no se debe pasar tal como está en los datos del formulario.

    3. En los dos ejemplos anteriores, los datos del formulario enviados como parte de la solicitud HTTP a Apigee Edge contienen caracteres que no se permite usar.
    4. Por lo tanto, Apigee Edge responde con 500 Internal Server Error con el código de error protocol.http.BadFormData.

Resolución

  1. Asegúrate de que todos los caracteres especiales de las claves y los valores de los datos de formulario o de parámetros enviados como parte de la solicitud HTTP del cliente siempre estén codificados como se explica en Datos de formulario: application/x-www-form-urlcoded.
  2. En los ejemplos mencionados anteriormente, puedes corregir los problemas de la siguiente manera:

    Ejemplo 1

    Ejemplo 1: Datos de formulario pasados 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 n.o 2

    Solicitud de muestra n° 2: Datos de formulario pasados 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 porcentual para el signo de porcentaje (%), que modifica el archivo a fin de 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 de acuerdo con las siguientes especificaciones:

Especificación
Datos del formulario: application/x-www-form-urlcoded

Si aún necesitas asistencia de la asistencia de Apigee, consulta Debes recopilar 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 el equipo de asistencia de Apigee Edge:

Si eres un 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 500 Internal Server Error con el código de error protocol.http.BadFormData.
  • Archivo de seguimiento para 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 con errores
  • Nombre del entorno
  • Paquete de proxy de API
  • Archivo de seguimiento para las solicitudes a la API
  • Registros de acceso de NGINX

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

    Dónde: Se reemplazan ORG, ENV y PORT# por valores reales.

  • Registros del sistema del procesador de mensajes

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

Referencias