Error interno del servidor: 500 - EmptyPath

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.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, es posible que observes el siguiente mensaje de error:

{
   "fault":{
      "faultstring":"Request path cannot be empty",
      "detail":{
         "errorcode":"protocol.http.EmptyPath"
      }
   }
}

Causas posibles

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

Según las especificaciones RFC 3986, sección 3: Componentes de 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 SIEMPRE debe tener una barra diagonal (/), incluso si no hay otros caracteres como parte de la ruta.

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

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

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 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

Procedimiento 1: Usa la supervisión de API

Para diagnosticar el error con API Monitoring, haz lo siguiente:

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

  3. Navega a la página Analizar > Supervisión de API > Investigar.
  4. Selecciona el período específico en el que observaste los errores.
  5. Representa gráficamente el código de falla en función del 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 se indica a continuación:

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

  9. En la ventana Registros, ten en cuenta los siguientes detalles:
    • Código de estado: 500
    • Fuente del error: target
    • Código de falla: protocol.http.EmptyPath
  10. Si la Fuente de error es target y el Código de error es protocol.http.EmptyPath, esto indica que la URL del servidor de backend tiene una ruta de acceso vacía.

Seguimiento

Procedimiento 2: Cómo usar la herramienta de Trace

Para diagnosticar el error con la herramienta Trace, haz lo siguiente:

  1. 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
  2. Asegúrate de que la opción Mostrar todos los FlowInfos esté habilitada:

  3. Selecciona una de las solicitudes con errores y examina el registro.
  4. Navega por las diferentes fases del registro y ubica dónde se produjo la falla.
  5. Por lo general, encontrarás el error en un flujo después de la fase Target Request Flow Started, como se muestra a continuación:

  6. Observa el valor del error del registro.

    error: Request path cannot be empty

    Dado que Apigee Edge genera 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. Lo más probable es que esto suceda si la variable de flujo target.url (que representa la URL del servidor de backend) se actualizó con una ruta de acceso vacía a través de una de las políticas del flujo de solicitudes.

  7. Examina la sección Variables Read and Assigned en cada uno de los flujos hacia atrás desde el punto de error hasta la fase Target Request Flow Started.
  8. Determina la política en la que se actualiza la variable de flujo target.url .

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

    En el registro de muestra que se muestra arriba, observa que el valor de la variable de flujo target.url se actualiza en una política de JavaScript llamada SetTargetURL de la siguiente manera:

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

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

NGINX

Procedimiento 3: Uso de los registros de acceso de NGINX

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

  1. Si eres usuario de Private Cloud, puedes usar los registros de acceso de NGINX para determinar la información clave sobre 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 si hay errores de 500 con el código de error protocol.http.EmptyPath durante un período específico (si el problema ocurrió en el pasado) o si aún hay solicitudes que fallan con 500.
  4. Si encuentras errores de 500 con el valor de X-Apigee-fault-code que coincida con el valor de protocol.http.EmptyPath, determina el valor de X-Apigee-fault-source.

    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.EmptyPath
    X-Apigee-fault-source target

    Observa 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 debe a que la URL del servidor de backend tiene una ruta 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 error y la fuente del error para 500 Internal Server Error con 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.
  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 ruta de acceso vacía.
  3. La URL del servidor de backend se representa con la variable de flujo target.url en Apigee Edge. Por lo general, este error se produce si intentas actualizar la URL del servidor de backend, es decir, target.url de forma dinámica con cualquiera de las políticas (dentro del flujo compartido o del proxy) 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 realmente tiene una ruta vacía y la fuente de su valor con uno de los siguientes pasos:

    Seguimiento

    Cómo usar la herramienta de Trace

    Si capturaste un registro para este error, sigue los pasos que se explican en Cómo usar la herramienta Trace y haz lo siguiente:

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

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

    3. En el registro de muestra anterior, observa que la política de JavaScript modificó 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:
      • scheme: https://mocktarget.apigee.net
      • path: vacío

    Registros

    Usa registros en tu servidor de registros

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

    proxy de API

    Revisa el proxy de API que falló

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

    • La política dentro del proxy de API
    • Cualquier flujo compartido invocado desde el proxy
  5. Examina cuidadosamente la política específica (por ejemplo, AssignMessage o JavaScript) que modifica o actualiza la variable de flujo target.url y determina la causa de la actualización de target.url para que tenga una ruta vacía.

    A continuación, se incluyen algunos ejemplos de políticas que actualizan la variable de flujo target.url de forma incorrecta para que contenga una ruta vacía que genere este error.

    Ejemplo 1

    Muestra 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 la muestra anterior, observa que la variable de flujo target.url se actualiza con el valor https://mocktarget.apigee.net que contiene otra variable url.

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

    • scheme: https://mocktarget.apigee.net
    • path: vacío

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

    Muestra 2

    Muestra 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, cuyo valor se recupera de request.header.Path..

    Si tienes acceso a la solicitud o al registro reales, puedes verificar el valor real que se pasó a request.header.Path.

    Solicitud de muestra realizada por el usuario:

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

    En este ejemplo, la ruta de acceso del encabezado no se envía como parte de la solicitud. Por lo tanto, el valor de la ruta de acceso 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:

    • scheme: https://mocktarget.apigee.netnull
    • path: vacío

    Muestra 3

    Ejemplo 3: Política AssignMessage que 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:

    • scheme: https://mocktarget.apigee.net
    • path: vacío

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

Solución

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

  1. Asegúrate de que la URL del servidor de backend, representada por la variable de flujo target.url, siempre tenga una ruta de acceso no vacía.
    1. En algunos casos, es posible que no tengas un nombre de recurso en la ruta de acceso. En ese caso, asegúrate de que la ruta de acceso tenga, al menos, una barra diagonal (/).
    2. Si usas otras variables para determinar el valor de la variable de flujo target.url, asegúrate de que esas otras variables no tengan una ruta vacía.
    3. Si realizas alguna operación de cadena para determinar el valor de la variable de flujo target.url, asegúrate de que el resultado o el desenlace de las operaciones de cadena no tengan una ruta vacía.
  2. En las muestras que se analizan en Diagnóstico, puedes corregir este problema de la siguiente manera:

    Ejemplo 1

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

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

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

    Muestra 2

    Muestra 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 del encabezado de la 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"
    

    Muestra 3

    Ejemplo 3: Política AssignMessage que 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ítica AssignMessage. Por ejemplo, puedes tener /json como la ruta de acceso para la API de MockTarget. Es decir, modifica el elemento <Value> a 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 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 asistencia del equipo de 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 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 curl completo que se usa para reproducir el 500 Internal Server Error con el código de error protocol.http.EmptyPath
  • 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_log

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

  • Registros del sistema de Message Processor /opt/apigee/var/log/edge-message- processor/logs/system.log

Referencias

Variables de flujo: objetivo