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.BadPath
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":"Invalid request path", "detail":{ "errorcode":"protocol.http.BadPath" } } }
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 un path
que comienza con un signo de interrogación (?
) en lugar de una barra diagonal (/
), que no es válido.
Según las especificaciones de RFC 3986, sección 3: 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 comenzar con una barra diagonal (/
) y siempre debe tener una.
Por lo tanto, si la URL de la solicitud del servidor de backend tiene un componente path
que comienza con un signo de interrogación (?
) en lugar de una barra diagonal (/
), Apigee Edge responde con 500 Internal Server Error
y el código de error protocol.http.BadPath
.
Por ejemplo, si target.url
tiene el valor https://www.mocktarget.apigee.net?json
, se produce este error cuando se determina que path
no es no válido, ya que comienza con un signo de interrogación (?
) en lugar de una barra diagonal (/
).
Causa | Descripción | Instrucciones de solución de problemas aplicables para |
---|---|---|
La URL del servidor de backend (target.url) tiene una ruta no válida | El componente de ruta de acceso en la URL del servidor de backend representado por la variable de flujo target.url comienza con un signo de interrogación (? ) en lugar de una barra diagonal (/ ). |
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 n.o 1: Usar la supervisión de APIs
Para diagnosticar el error con la supervisión de la API, sigue estos pasos:
- Accede a la IU de Apigee Edge como un usuario con el rol adecuado.
Cambia a la organización en la que quieres investigar el problema.
- Navega a la página Analyze > API Monitoring > Investigate.
- Selecciona el período específico en el que observaste los errores.
Traza el código de falla en función del valor Time.
Selecciona una celda que tenga el código de falla
protocol.http.BadPath
, como se muestra a continuación:Se muestra información sobre el código de falla
protocol.http.BadPath
como se muestra a continuación:Haz clic en Ver registros y expande la fila de la solicitud fallida.
- En la ventana Registros, ten en cuenta los siguientes detalles:
- Código de estado:
500
- Fuente de la falla:
target
- Código de falla:
protocol.http.BadPath
- Código de estado:
- Si la fuente de errores es
target
y el código de falla esprotocol.http.BadPath
, eso indica que la URL del servidor de backend tiene una ruta no válida.
Trace
Procedimiento n.o 2: Usa la herramienta de seguimiento
Para diagnosticar el error con la herramienta Trace, sigue estos pasos:
- 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
- Espera a que ocurra el error
Asegúrate de que la opción Show all FlowInfos esté habilitada:
- Selecciona una de las solicitudes con errores 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 la fase Se inició el flujo de solicitud de destino , como se muestra a continuación:
Observa el valor del error del seguimiento:
error: Ruta de solicitud no válida
Debido a que Apigee Edge genera el error después de la fase Target Request Flow Started, indica que la URL del servidor de backend tiene una ruta de acceso no válida. Lo más probable es que esto suceda si la variable de flujo
target.url
(que representa la URL del servidor de backend) en Apigee Edge posiblemente se actualizó con una ruta no válida a través de una de las políticas en el flujo de solicitud de destino.- Examina la sección Variables leídas y asignadas en cada uno de los flujos hacia atrás desde el flujo de errores hacia la fase Flujo de solicitud de destino iniciado.
- Determina la política en la que se actualizó la variable de flujo
target.url
:Seguimiento de ejemplo que muestra que la política de JavaScript actualizó la variable de flujo
target.url:
En el seguimiento de muestra anterior, ten en cuenta que el valor de la variable de variable de flujo
target.url
se actualiza en una política de JavaScript llamadaJS- SetTargetURL
de la siguiente manera:target.url : https://mocktarget.apigee.net?json
- Ten en cuenta que el valor en
target.url
tiene los siguientes componentes:- esquema:
https
- autoridad:
mocktarget.apigee.net
- ruta de acceso:
?json
- esquema:
- Dado que el componente path comienza con un signo de interrogación (
?
) en lugar de una barra diagonal (/
), verás el errorInvalid request path
. - Navega a la fase AX (datos de Analytics registrados) 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 los valores de X-Apigee-fault-code y X-Apigee-fault-source como se muestra a continuación:
Verás los valores de X-Apigee-fault-code y X-Apigee-fault-source como
protocol.http.BadPath
ytarget
respectivamente, lo que indica que este error se debe a que la URL del servidor de backend tiene una ruta no válida.Encabezados de respuesta Valor X-Apigee-fault-code protocol.http.BadPath
X-Apigee-fault-source target
NGINX
Procedimiento n.o 3: Usa los registros de acceso de NGINX
Para diagnosticar el error con los registros de acceso de NGINX, sigue estos pasos:
- 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. Verifica los registros de acceso de NGINX:
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log
- Busca para ver si hay errores
500
con el código de errorprotocol.http.BadPath
durante un período específico (si el problema ocurrió en el pasado) o si hay alguna solicitud que aún falla con500
. Si encuentras algún error
500
en el que X-Apigee-fault-code coincida con el valor deX-Apigee-fault-code , determina el valor de X-Apigee-fault-codeEjemplo 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-fall-code y X-Apigee-fault-source:
Encabezados Valor X-Apigee-fault-code protocol.http.BadPath
X-Apigee-fault-source target
Ten en cuenta que los valores de X-Apigee-fault-code y X-Apigee-fault-source son
protocol.http.BadPath
ytarget
respectivamente, lo que indica que este error se produce porque la URL del servidor de backend tiene una ruta de acceso no válida.
Causa: La URL del servidor de backend (target.url) tiene una ruta no válida.
Diagnóstico
- Determina el código de error y la fuente de errores para
500 Internal Server Error
mediante la supervisión de la API, la herramienta de seguimiento o los registros de acceso de NGINX, como se explica en Pasos comunes de diagnóstico. - Si el código de falla es
protocol.http.BadPath
y la fuente de errores tiene el valortarget
, esto indica que la URL del servidor de backend tiene una ruta de acceso no válida. La URL del servidor de backend se representa con la variable de flujo
target.url
en Apigee Edge. Por lo general, este error ocurre si intentas actualizar la URL del servidor de backend (target.url
) de forma dinámica con cualquiera de las políticas (dentro del proxy/flujo compartido) en el flujo de solicitudes de destino, de modo que tenga una ruta de acceso no válida.Determina si la variable de flujo
target.url
tiene una ruta de acceso no válida y el origen de su valor mediante uno de los siguientes métodos:Trace
Cómo usar la herramienta Trace
Si capturaste un seguimiento para este error, sigue los pasos que se explican en Usa la herramienta de seguimiento .
- Verifica si
target.url
tiene una ruta no válida, es decir, si comienza con un signo de interrogación (?
) en lugar de una barra diagonal (/
). Si es así, averigua qué política modificó o actualizó el valor de
target.url
para que contenga una ruta no válida.Seguimiento de ejemplo que muestra que la política de JavaScript actualizó la variable de flujo
target.url
- En el seguimiento de muestra anterior, observa que la política de JavaScript modificó o actualizó el valor de
target.url
para que contenga una ruta no válida. - Ten en cuenta que
target.url
tiene los siguientes componentes:- esquema:
https
- autoridad:
mocktarget.apigee.net
- ruta de acceso:
?json
La ruta comienza con un signo de interrogación (
?
) en lugar de una barra diagonal (/
); por lo tanto, no es válida. - esquema:
Registros
Usa registros en tu servidor de registros
- Si no tienes un seguimiento para este error (un problema intermitente), verifica si
registraste la información sobre el valor de la variable de flujo
target.url
mediante políticas como MessageLogging o la política ServiceReferencia en tu servidor de registros. - Si tienes los registros, revísalos y haz lo siguiente:
- Verifica si
target.url
tiene una ruta no válida. - Intenta determinar la información sobre qué política modificó
target.url
para que contenga una ruta no válida.
- Verifica si
proxy de API
Revisa el proxy de API con errores
Si no tienes un seguimiento o registros para este error, revisa el proxy de API con errores a fin de 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 dentro del proxy de API
- Cualquier flujo compartido invocado desde el proxy
- Verifica si
Examina atentamente 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 detarget.url
para que tenga una ruta de acceso no válida.Estas son algunas políticas de ejemplo que actualizan la variable de flujo
target.url
de forma incorrecta para contener una ruta no válida que genera este error.Ejemplo 1
Ejemplo 1: Actualización de la variable
target.url
de la política de JavaScriptvar url = "https://mocktarget.apigee.net?json" context.setVariable("target.url", url);
En el ejemplo anterior, ten en cuenta que la variable de flujo
target.url
se actualiza con el valorhttps://mocktarget.apigee.net?json
contenido en otra variableurl.
.Ten en cuenta que el valor de
url
tiene los siguientes componentes:- esquema:
https
- autoridad:
mocktarget.apigee.net
- ruta de acceso:
?json
La ruta comienza con un signo de interrogación (
?
) en lugar de una barra diagonal (/
), que no es válida. Por lo tanto, Apigee Edge muestra500 Internal Server Error
con el código de errorprotocol.http.BadPath
.Muestra n.o 2
Ejemplo 2: Política de JavaScript actualizando la variable
target.url
según el valor en el encabezado de la solicitudvar 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 mediante la concatenación del valorhttps://mocktarget.apigee.net
contenido en una variableurl
y el valor de otra variablepath
, cuyo valor se recupera derequest.header.Path.
.Si tienes acceso a la solicitud o al seguimiento real, puedes verificar el valor real que se pasa a
request.header.Path
.Ejemplo de solicitud que realizó el usuario
curl -v https://HOST_ALIAS/v1/myproxy -H "Authorization: Bearer <token> -H "Path: ?user"
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 variable
path
en la política de JavaScript esnull
.Entonces:
url = https://mocktarget.apigee.net + path
url = https://mocktarget.apigee.net + "?user"
target.url = https://mocktarget.apigee.net?user
Ten en cuenta que el valor de
target.url
tiene los siguientes componentes:- esquema:
https
- autoridad:
mocktarget.apigee.net
- ruta de acceso:
?user
La ruta comienza con un signo de interrogación (
?
) en lugar de una barra diagonal (/
), que no es válida. Por lo tanto, Apigee Edge muestra500 Internal Server Error
con el código de errorprotocol.http.BadPath
.Ejemplo 3
Muestra n.o 3: Política de AttributionMessage actualizando la variable
target.url
<AssignMessage async="false" continueOnError="false" enabled="true" name="AM-SetTargetURL"> <DisplayName>AM-SetTargetURL</DisplayName> <AssignVariable> <Name>target.url</Name> <Value>https://mocktarget.apigee.net?echo</Value> </AssignVariable> <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables> <AssignTo createNew="false" transport="http" type="request"/> </AssignMessage>
Ten en cuenta que el valor de
url
tiene los siguientes componentes:- esquema:
https
- autoridad:
mocktarget.apigee.net
- ruta de acceso:
?echo
Nuevamente en este ejemplo, la ruta comienza con un signo de interrogación (
?
) en lugar de una barra diagonal (/
), que no es no válida. Por lo tanto, Apigee Edge muestra500 Internal Server Error
con el código de errorprotocol.http.BadPath
.- esquema:
Resolución
Según la especificación de URL
RFC 3986, sección 3: Componentes de la sintaxis, el componente path
es obligatorio y siempre DEBE comenzar con "/". Por lo tanto, sigue estos pasos para solucionar el problema:
- Asegúrate de que la URL del servidor de backend, representada por la variable de flujo
target.url
, siempre tenga una ruta de acceso válida y siempre comience con una barra diagonal (/
).- En algunos casos, es posible que no tengas un nombre de recurso en la ruta de acceso. Luego, asegúrate de que la ruta tenga al menos una barra diagonal (
/
). - Si usas otras variables para determinar el valor de la variable de flujo
target.url
, asegúrate de que otras variables no tengan una ruta de acceso no válida. - Si realizas alguna operación de string para determinar el valor de la variable de flujo
target.url
, asegúrate de que el resultado de las operaciones de string no tenga una ruta de acceso no válida.
- En algunos casos, es posible que no tengas un nombre de recurso en la ruta de acceso. Luego, asegúrate de que la ruta tenga al menos una barra diagonal (
En los ejemplos analizados anteriormente, puedes solucionar este problema de la manera que se explica a continuación:
Ejemplo 1
Ejemplo 1: Actualización de la variable
target.url
de la política de JavaScriptUsa una barra diagonal (
/
) en lugar de un signo de interrogación (?
) en la variableurl
para solucionar este problema, como se muestra a continuación:var url = "https://mocktarget.apigee.net/json" context.setVariable("target.url", url);
Muestra n.o 2
Ejemplo 2: Política de JavaScript actualizando la variable
target.url
según el valor en el encabezado de la solicitudvar 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,
/user
como parte del 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: /user"
Ejemplo 3
Muestra n.o 3: Política deAssignMessage actualizando la variable
target.url
Agrega una ruta de acceso válida en el elemento
<Value>
de la políticaAssignMessage. Es decir, reemplaza el signo de interrogación (?
) por una barra diagonal (/
) en el elemento<Value>
y configúralo enhttps://mocktarget.apigee.net/echo
para solucionar este problema 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/echo</Value> </AssignVariable> <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables> <AssignTo createNew="false" transport="http" type="request"/> </AssignMessage>
Especificación
Apigee Edge espera que el
path
componente de la URL del servidor de backend DEBE comenzar siempre con una barra diagonal (/
) según las siguientes especificaciones:Especificación RFC 3986, sección 3: Componentes de la sintaxis RFC 3986, sección 3.3: Ruta de acceso 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 reproducir500 Internal Server Error
con el código de errorprotocol.http.BadPath
. - 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