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:
La sintaxis del URI tiene los siguientes componentes:
foo://example.com:8042/over/there?name=ferret#nose \_/ \______________/\_________/ \_________/ \__/ | | | | | scheme authority path query fragment
- 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:
- 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 falla
protocol.http.EmptyPath
, como se muestra a continuación:La información sobre el código de falla
protocol.http.EmptyPath
se muestra como como se muestra a continuación:Haz clic en Ver registros para expandir la fila de la solicitud con errores.
- En la ventana Registros, observa los siguientes detalles:
- Código de estado:
500
- Fuente del error:
target
- Código de error:
protocol.http.EmptyPath
- Código de estado:
- Si la Fault Source es
target
y el Fault Code esprotocol.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:
- 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
- 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 ocurrió la falla.
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:
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 flujotarget.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.- 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.
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
- Ten en cuenta que
target.url
tiene los siguientes componentes:- esquema:
https://mocktarget.apigee.net
- path: vacía
- esquema:
- Por lo tanto, recibes el error
Request path cannot be empty
. - Navega a la fase AX (datos registrados de Analytics) en el seguimiento y haz clic en ella.
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:
- Verás los valores X-Apigee-fault-code y X-Apigee-fault-source como
protocol.http.EmptyPath
ytarget
, 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:
- 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. 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.EmptyPath
durante un período específico (si el problema ocurrió en en el pasado) o si todavía hay solicitudes que fallan con500
. Si encuentras algún error
500
con la coincidencia X-Apigee-fault-code el valor deprotocol.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
ytarget
, 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
- 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. - Si el Código de error es
protocol.http.EmptyPath
y la Fuente del error tiene el valortarget
, esto indica que la URL del servidor de backend tiene una dirección vacía de la ruta de acceso. 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.- 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:
- Verifica si
target.url
tiene una ruta de acceso vacía. 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:
- 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. - Ten en cuenta que
target.url
tiene los siguientes componentes:- esquema:
https://mocktarget.apigee.net
- path: vacía
- esquema:
Registros
Usa registros en tu servidor de registros
- 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. - Si tienes los registros, revísalos y haz lo siguiente:
- Verifica si
target.url
tiene una ruta de acceso vacía. - Intenta determinar qué política modificó
target.url
para que contenga una ruta de acceso vacía
- Verifica si
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
- Verifica si
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 JavaScriptvar 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 valorhttps://mocktarget.apigee.net
contenido en otra variableurl
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 errorprotocol.http.EmptyPath
.Ejemplo 2
Ejemplo 2: Actualización de la variable
target.url
de la política de JavaScriptvar 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 valorhttps://mocktarget.apigee.net
contenido en una variableurl
y el valor de otra variablepath
, cuya el valor se recupera derequest.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 muestra500 Internal Server Error
con el código de errorprotocol.http.EmptyPath
.- esquema:
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:
- 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.- 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 (
/
). - 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. - 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.
- 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 (
- 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 JavaScriptAgrega una barra diagonal (
/
) a la variableurl
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 JavaScriptvar 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 solicitudPath
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 variableAgrega 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 reproducir500 Internal Server Error
con el código de errorprotocol.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