Error interno del servidor: 500 - EmptyPath

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.EmptyPath 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":"Request path cannot be empty",
      "detail":{
         "errorcode":"protocol.http.EmptyPath"
      }
   }
}

Causas posibles

Este error ocurre si la URL de solicitud del servidor de backend, representada por la variable de flujo target.url, contiene una ruta de acceso vacía.

Según las especificaciones Sección 3 del RFC 3986: Componentes de la sintaxis y RFC 3986, sección 3.3: Ruta de acceso:

  1. La sintaxis del URI tiene los siguientes componentes:

            foo://example.com:8042/over/there?name=ferret#nose
            \_/   \______________/\_________/ \_________/ \__/
             |            |            |            |       |
          scheme      authority       path        query   fragment
    
  2. El componente path es obligatorio y DEBE tener siempre una barra diagonal. (/), incluso si no hay otros caracteres como parte de la ruta de acceso.

Por lo tanto, si la URL de la solicitud del servidor de backend no tiene el path en absoluto, es decir, ni siquiera tiene barra diagonal (/), por lo que Edge responde con 500 Internal Server Error y un código de error. protocol.http.EmptyPath

Por ejemplo, si target.url tiene el valor https://www.mocktarget.apigee.net, este error se produce como path componente está vacío o no se encuentra.

Causa Descripción Instrucciones de solución de problemas aplicables para
La URL del servidor de backend (target.url) tiene una ruta de acceso vacía La URL del servidor de backend representada por la variable de flujo target.url tiene una ruta de acceso vacía. 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

Procedimiento 1: Usa la supervisión de API

Para diagnosticar el error con la supervisión de API, haz lo siguiente:

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

  3. Navega a Analyze > Supervisión de API > Investigar.
  4. Selecciona el período específico en el que observaste los errores.
  5. Traza Código de error en Tiempo.

  6. Selecciona una celda que tenga el código de falla protocol.http.EmptyPath, como se muestra a continuación:

  7. La información sobre el código de falla protocol.http.EmptyPath se muestra como como se muestra a continuación:

  8. Haz clic en Ver registros para expandir la fila de la solicitud con errores.

  9. En la ventana Registros, observa los siguientes detalles:
    • Código de estado: 500
    • Fuente del error: target
    • Código de error: protocol.http.EmptyPath
  10. Si la Fault Source es target y el Fault Code es protocol.http.EmptyPath, eso indica que la URL del servidor backend tiene un una ruta de acceso vacía.

Trace

Procedimiento 2: Usa la herramienta Trace

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

  1. Habilita la sesión de seguimiento y haz lo siguiente:
    • 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
  2. Asegúrate de que Show all FlowInfos esté habilitado:

  3. Selecciona una de las solicitudes fallidas y examina el seguimiento.
  4. Navega por las diferentes fases del seguimiento y localiza dónde ocurrió la falla.
  5. Por lo general, encontrarás el error en un flujo después de Target Request Flow Started (Flujo de solicitud objetivo iniciado). fase, como se muestra a continuación:

  6. Anota el valor del error del seguimiento.

    error: La ruta de acceso de la solicitud no puede estar vacía

    Dado que Apigee Edge presenta el error después de la fase Target Request Flow Started, indica que el path en la URL del servidor de backend está vacío. De esta forma, lo más probable es que suceda si la variable de flujo target.url (que representa la URL del backend ) posiblemente se haya actualizado con una ruta vacía a través de una de las políticas de la del flujo de solicitud.

  7. Examina la sección Variables leídas y asignadas en cada uno de los flujos hacia atrás desde la punto de error hacia la fase de Flujo de solicitud objetivo iniciado.
  8. Determina la política en la que se actualiza la variable de flujo target.url .

    Seguimiento de muestra que muestra que la política de JavaScript actualizó la variable de flujo target.url:

    En el seguimiento de ejemplo que se muestra arriba, anota el valor de la variable de flujo target.url se actualiza en una política de JavaScript llamada SetTargetURL como sigue:

    target.url : https://mocktarget.apigee.net
    
  9. Ten en cuenta que target.url tiene los siguientes componentes:
    • esquema: https://mocktarget.apigee.net
    • path: vacía
  10. Por lo tanto, recibes el error Request path cannot be empty.
  11. Navega a la fase AX (datos registrados de Analytics) en el seguimiento y haz clic en ella.
  12. Desplázate hacia abajo hasta la sección Detalles de la fase - Encabezados de error y determina el valores de X-Apigee-fault-code y X-Apigee-fault-source como se muestra a continuación:

  13. Verás los valores X-Apigee-fault-code y X-Apigee-fault-source como protocol.http.EmptyPath y target , respectivamente, lo que indica que este error se produce porque la URL del servidor backend tiene una ruta vacía.
    Encabezados de respuesta Valor
    X-Apigee-fault-code protocol.http.EmptyPath
    X-Apigee-fault-source target

NGINX

Procedimiento n.o 3: Usa registros de acceso de NGINX

Para diagnosticar el error con los registros de acceso de NGINX, haz lo siguiente:

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

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

  3. Realiza una búsqueda para ver si hay algún error 500 con el código de error protocol.http.EmptyPath durante un período específico (si el problema ocurrió en en el pasado) o si todavía hay solicitudes que fallan con 500.
  4. Si encuentras algún error 500 con la coincidencia X-Apigee-fault-code el valor de protocol.http.EmptyPath y, luego, determina el valor del X-Apigee-fault-source.

    Ejemplo de error 500 del registro de acceso de NGINX:

    La entrada de muestra 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.EmptyPath
    X-Apigee-fault-source target

    Ten en cuenta que los valores de X-Apigee-fault-code y X-Apigee-fault-source son protocol.http.EmptyPath y target , respectivamente, lo que indica que Este error se produce porque la URL del servidor de backend tiene una ruta de acceso vacía.

Causa: La URL del servidor de backend (target.url) tiene una ruta de acceso vacía

Diagnóstico

  1. Determina el código de errores y la fuente 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.
  2. Si el Código de error es protocol.http.EmptyPath y la Fuente del error tiene el valor target, esto indica que la URL del servidor de backend tiene una dirección vacía de la ruta de acceso.
  3. La variable de flujo target.url representa la URL del servidor de backend en Apigee. Edge. Este error suele ocurrir cuando intentas actualizar la URL del servidor backend, es decir, target.url de forma dinámica con cualquiera de las políticas (dentro de proxy/flujo compartido) en el flujo de solicitud de destino, de modo que tenga una ruta de acceso vacía.

  4. Determina si la variable de flujo target.url tiene una ruta vacía y la fuente para su valor mediante uno de los siguientes pasos:

    Trace

    Usa la herramienta Trace

    Si has capturado un registro para este error, sigue los pasos que se explican en Usa la Herramienta de seguimiento y haz lo siguiente:

    1. Verifica si target.url tiene una ruta de acceso vacía.
    2. Si es así, descubre qué política modificó o actualizó el valor de target.url para que contenga una ruta de acceso vacía.

      Seguimiento de muestra que muestra que la política de JavaScript actualizó la variable de flujo target.url:

    3. En el seguimiento de ejemplo anterior, observa que la política de JavaScript ha modificado o actualizó el valor de target.url para que contenga una ruta de acceso vacía.
    4. Ten en cuenta que target.url tiene los siguientes componentes:
      • esquema: https://mocktarget.apigee.net
      • path: vacía

    Registros

    Usa registros en tu servidor de registros

    1. Si no puedes rastrear este error (un problema intermitente), revisa para observa si registraste la información sobre el valor de la variable de flujo target.url, con políticas como MessageLogging o ServicePrompt a tu servidor de registros.
    2. Si tienes los registros, revísalos y haz lo siguiente:
      1. Verifica si target.url tiene una ruta de acceso vacía.
      2. Intenta determinar qué política modificó target.url para que contenga una ruta de acceso vacía

    proxy de API

    Revisa el proxy de API con errores

    Si no tienes registros de este error, revisa la API con errores proxy para determinar qué modificó o actualizó la variable de flujo target.url para que contenga una ruta de acceso no válida. Verifica lo siguiente:

    • La política en el proxy de API
    • Cualquier flujo compartido que se invoca desde el proxy
  5. Examina la política específica (por ejemplo, AssignMessage o JavaScript) que modifica o actualiza la variable de flujo target.url con cuidado y determina la causa de la actualización. target.url para tener una ruta de acceso vacía.

    Estas son algunas políticas de ejemplo que actualizan la variable de flujo target.url para contener incorrectamente una ruta de acceso vacía que lleve a este error.

    Ejemplo 1

    Ejemplo 1: Actualización de la variable target.url de la política de JavaScript

    var url = "https://mocktarget.apigee.net"
    context.setVariable("target.url", url);
    

    En el ejemplo anterior, observa que la variable de flujo target.url se actualiza. con el valor https://mocktarget.apigee.net contenido en otra variable url

    Ten en cuenta que target.url tiene los siguientes componentes:

    • esquema: https://mocktarget.apigee.net
    • path: vacía

    Dado que la ruta está vacía, Apigee Edge muestra 500 Internal Server Error con código de error protocol.http.EmptyPath.

    Ejemplo 2

    Ejemplo 2: Actualización de la variable target.url de la política de JavaScript

    var path = context.getVariable("request.header.Path");
    var url = "https://mocktarget.apigee.net" + path
    context.setVariable("target.url", url);

    En el ejemplo anterior, observa que la variable de flujo target.url se actualiza concatenando el valor https://mocktarget.apigee.net contenido en una variable url y el valor de otra variable path, cuya el valor se recupera de request.header.Path.

    Si tienes acceso a la solicitud o el seguimiento reales, puedes verificar el valor real. pasado a request.header.Path.

    Solicitud de ejemplo que realiza el usuario:

    curl -v https://HOST_ALIAS/v1/myproxy -H "Authorization: Bearer <token>
    

    En este ejemplo, la ruta del encabezado no se envía como parte de la solicitud. Por lo tanto, el valor de la ruta de la variable en la política de JavaScript es null.

    Entonces:

    • url = https://mocktarget.apigee.net + path
    • url = https://mocktarget.apigee.net + null
    • target.url = https://mocktarget.apigee.netnull

    Ten en cuenta que target.url tiene los siguientes componentes:

    • esquema: https://mocktarget.apigee.netnull
    • path: vacía

    Ejemplo 3

    Ejemplo 3: La política deAssignMessage actualiza la variable target.url a través de otra variable

    <AssignMessage async="false" continueOnError="false" enabled="true" name=">AM-SetTargetURL">
        <DisplayName>AM-SetTargetURL</DisplayName>
        <AssignVariable>
             <Name>target.url</Name>
             <Value>https://mocktarget.apigee.net</Value>
        </AssignVariable>
        <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
        <AssignTo createNew="false" transport="http" type="request"/>
    </AssignMessage>
    

    Ten en cuenta que target.url tiene los siguientes componentes:

    • esquema: https://mocktarget.apigee.net
    • path: vacía

    En todos los ejemplos anteriores, la ruta en la URL del servidor backend, es decir, target.url está vacío, por lo que Apigee Edge muestra 500 Internal Server Error con el código de error protocol.http.EmptyPath.

Solución

Según las especificaciones RFC 3986, sección 2: Componentes de sintaxis, el componente path es obligatorio y DEBE tener siempre una barra diagonal (/), incluso si no hay otros caracteres como parte de path. Sigue estos pasos para solucionar este problema:

  1. Asegúrate de que la URL del servidor de backend, representada por la variable de flujo target.url siempre tiene una ruta de acceso no vacía.
    1. En algunos casos, es posible que no tengas un nombre de recurso en la ruta, entonces asegúrate de que esta al menos tiene una barra diagonal (/).
    2. Si usas otras variables para determinar el valor de la variable de flujo target.url y, luego, asegúrate de que las otras variables no tengan una ruta de acceso vacía.
    3. Si realizas alguna operación de cadena para determinar el valor de la variable de flujo. target.url y, luego, asegúrate de que el resultado de la cadena no tiene una ruta vacía.
  2. En las muestras analizadas en Diagnóstico, puedes solucionar este problema como se explica a continuación:

    Ejemplo 1

    Ejemplo 1: Actualización de la variable target.url de la política de JavaScript

    Agrega una barra diagonal (/) a la variable url para corregir esto problema, como se muestra a continuación:

    var url = "https://mocktarget.apigee.net/"
    context.setVariable("target.url", url);
    

    Ejemplo 2

    Ejemplo 2: Actualización de la variable target.url de la política de JavaScript

    var path = context.getVariable("request.header.Path");
    var url = "https://mocktarget.apigee.net" + path
    context.setVariable("target.url", url);
    

    Asegúrate de pasar una ruta de acceso válida, por ejemplo, /iloveapis, como parte de encabezado de solicitud Path para solucionar este problema como se muestra a continuación:

    Solicitud de muestra:

    curl -v https://HOST_ALIAS/v1/myproxy -H "Authorization: Bearer <token> -H "Path: /iloveapis"
    

    Ejemplo 3

    Ejemplo 3: La política deAssignMessage actualiza la variable target.url a través de otra variable

    Agrega una ruta de acceso válida en el elemento <Value> de la políticaAssignMessage. Para Por ejemplo, puedes tener /json como la ruta de acceso API de MockTarget. Es decir, modifica el elemento <Value> de la siguiente manera: https://mocktarget.apigee.net/json, como se muestra a continuación:

    <AssignMessage async="false" continueOnError="false" enabled="true" name="AM-SetTargetURL">
        <DisplayName>AM-SetTargetURL</DisplayName>
        <AssignVariable>
             <Name>target.url</Name>
             <Value>https://mocktarget.apigee.net/json</Value>
        </AssignVariable>
        <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
        <AssignTo createNew="false" transport="http" type="request"/>
    </AssignMessage>
    

Especificación

Apigee Edge espera que la URL del servidor de backend no tenga una ruta de acceso vacía según las siguientes especificaciones:

Especificación
RFC 3986, sección 3: Componentes de sintaxis
RFC 3986, sección 3.3: Ruta de acceso

Si aún necesitas ayuda del equipo de asistencia de Apigee, ve a Se debe 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, 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 500 Internal Server Error con el código de error protocol.http.EmptyPath
  • 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

Referencias

Variables de flujo: objetivo