<ph type="x-smartling-placeholder"></ph>
Vous consultez la documentation Apigee Edge.
Accédez à la page
Documentation sur Apigee X. En savoir plus
Symptôme
L'application cliente reçoit un code d'état HTTP 500 Internal Server Error
avec
le code d'erreur protocol.http.EmptyPath
comme réponse aux appels d'API.
Message d'erreur
L'application cliente reçoit le code de réponse suivant:
HTTP/1.1 500 Internal Server Error
Le message d'erreur suivant peut également s'afficher:
{ "fault":{ "faultstring":"Request path cannot be empty", "detail":{ "errorcode":"protocol.http.EmptyPath" } } }
Causes possibles
Cette erreur se produit si l'URL de requête du serveur backend, représentée par la variable de flux
<ph type="x-smartling-placeholder"></ph>
target.url
, contient un chemin d'accès vide.
Conformément aux spécifications <ph type="x-smartling-placeholder"></ph> RFC 3986, section 3: Composants de la syntaxe <ph type="x-smartling-placeholder"></ph> RFC 3986, section 3.3: Chemin d'accès:
La syntaxe de l'URI se compose des éléments suivants:
foo://example.com:8042/over/there?name=ferret#nose \_/ \______________/\_________/ \_________/ \__/ | | | | | scheme authority path query fragment
- Le composant
path
est obligatoire et DOIT toujours comporter une barre oblique (/
), même si le chemin ne contient aucun autre caractère.
Par conséquent, si l'URL de requête du serveur backend ne comporte pas le path
c'est-à-dire qu'il n'a même pas de barre oblique (/
), alors qu'Apigee
Edge répond avec 500 Internal Server Error
et un code d'erreur
protocol.http.EmptyPath
Par exemple, si target.url
a la valeur
https://www.mocktarget.apigee.net
, cette erreur se produit lorsque
path
Le composant est vide ou manquant.
Cause | Description | Instructions de dépannage applicables |
---|---|---|
Le chemin de l'URL du serveur backend (target.url) est vide | Le chemin de l'URL du serveur backend représentée par la variable de flux target.url est vide. |
Utilisateurs Edge de cloud public et privé |
Étapes de diagnostic courantes
Utilisez l'une des techniques ou l'un des outils suivants pour diagnostiquer ce problème:
Surveillance des API
Procédure n° 1: Utiliser la surveillance des API
<ph type="x-smartling-placeholder">Pour diagnostiquer l'erreur à l'aide de l'API Monitoring, procédez comme suit:
- <ph type="x-smartling-placeholder"></ph> Connectez-vous à l'interface utilisateur d'Apigee Edge en tant qu'utilisateur disposant d'un le rôle approprié.
Accédez à l'organisation dans laquelle vous souhaitez examiner le problème.
- Accédez à Analyser > Surveillance des API > Examiner.
- Sélectionnez la période spécifique au cours de laquelle vous avez observé les erreurs.
Représentez le code d'erreur par rapport à l'heure.
<ph type="x-smartling-placeholder">Sélectionnez une cellule avec le code d'erreur
protocol.http.EmptyPath
comme indiqué ci-dessous:Les informations sur le code d'erreur
protocol.http.EmptyPath
s'affichent sous la forme comme indiqué ci-dessous:Cliquez sur Afficher les journaux pour développer la ligne de la requête ayant échoué.
- Dans la fenêtre Journaux, notez les détails suivants:
<ph type="x-smartling-placeholder">
- </ph>
- Code d'état:
500
- Source de l'erreur:
target
- Code d'erreur:
protocol.http.EmptyPath
- Code d'état:
- Si la source d'erreur est
target
et que le code d'erreur estprotocol.http.EmptyPath
, cela indique que l'URL du serveur backend dispose d'un chemin d'accès vide.
Trace
Procédure n° 2: Utiliser l'outil Trace
<ph type="x-smartling-placeholder">Pour diagnostiquer l'erreur à l'aide de l'outil Trace:
- Activez la session de trace, puis
<ph type="x-smartling-placeholder">
- </ph>
- Attendez que l'erreur
500 Internal Server Error
se produise. - Si vous pouvez reproduire le problème, effectuez l'appel d'API pour le reproduire.
500 Internal Server Error
- Attendez que l'erreur
Assurez-vous que l'option Show all FlowInfos (Afficher toutes les infos FlowInfos) est activée:
- Sélectionnez l'une des requêtes ayant échoué et examinez la trace.
- Parcourez les différentes phases de la trace et localisez l'origine de l'échec.
L'erreur s'affiche généralement dans un flux après le début du flux de requête cible. comme indiqué ci-dessous:
Notez la valeur de l'erreur à partir de la trace.
error: Le chemin de la requête ne peut pas être vide
Étant donné que l'erreur est générée par Apigee Edge après la phase Target Request Flow Started, cela indique que le champ
path
de l'URL du serveur backend est vide. Cela permettrait se produire très probablement si la variable de fluxtarget.url
(qui représente l'URL de serveur backend ) a peut-être été mis à jour avec un chemin d'accès vide via l'une des règles du paramètre le flux de requête.- Examinez la section Variables lues et attribuées dans chacun des flux en sens inverse à partir du point d'erreur vers la phase Target Request Flow Started (Flux de requête cible démarré).
Déterminez la règle dans laquelle la variable de flux
target.url
est mise à jour.Exemple de trace montrant que la stratégie JavaScript a mis à jour la variable de flux
target.url
:Dans l'exemple de trace ci-dessus, notez la valeur de la variable de flux
target.url
est mis à jour dans une règle JavaScript nommée SetTargetURL en tant que ce qui suit:target.url : https://mocktarget.apigee.net
- Notez que
target.url
comprend les composants suivants: <ph type="x-smartling-placeholder">- </ph>
- schéma:
https://mocktarget.apigee.net
- path:vide
- schéma:
- Vous obtenez donc l'erreur
Request path cannot be empty
. - Accédez à la phase AX (Données analytiques enregistrées) dans la trace, puis cliquez dessus.
Faites défiler la page jusqu'à la section Phase Details - Error Headers (Détails de la phase - En-têtes d'erreur) et déterminez de X-Apigee-fault-code et X-Apigee-fault-source, comme indiqué ci-dessous:
- Vous verrez les valeurs de X-Apigee-fault-code et X-Apigee-fault-source par
protocol.http.EmptyPath
ettarget
, respectivement, ce qui indique que cette erreur est due au fait que le chemin de l'URL du serveur backend est vide.En-têtes de réponse Valeur X-Apigee-fault-code protocol.http.EmptyPath
X-Apigee-fault-source target
NGINX
Procédure n° 3: Utiliser les journaux d'accès NGINX
<ph type="x-smartling-placeholder">Pour diagnostiquer l'erreur à l'aide des journaux d'accès NGINX:
- Si vous êtes un utilisateur Private Cloud, vous pouvez utiliser les journaux d'accès NGINX pour déterminer
les informations clés concernant HTTP
500 Internal Server Error
. Vérifiez les journaux d'accès NGINX:
<ph type="x-smartling-placeholder">/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log
- Effectuez une recherche pour voir s'il existe des erreurs
500
avec un code d'erreurprotocol.http.EmptyPath
pendant une durée spécifique (si le problème est survenu pendant ou si des requêtes échouent toujours avec500
. Si vous trouvez des erreurs
500
avec la correspondance X-Apigee-fault-code la valeur deprotocol.http.EmptyPath
, puis déterminez la valeur de la X-Apigee-fault-source.Exemple d'erreur 500 dans le journal d'accès NGINX:
L'exemple d'entrée ci-dessus du journal d'accès NGINX présente les valeurs suivantes pour X- Apigee-fault-code et X-Apigee-fault-source:
En-têtes Valeur X-Apigee-fault-code protocol.http.EmptyPath
X-Apigee-fault-source target
Notez que les valeurs de X-Apigee-fault-code et X-Apigee-fault-source sont
protocol.http.EmptyPath
ettarget
, respectivement, ce qui indique que cette erreur est due au fait que l'URL du serveur backend a un chemin d'accès vide.
Cause: le chemin de l'URL du serveur backend (target.url) est vide
Diagnostic
- Déterminez le code d'erreur et la source d'erreur pour
500 Internal Server Error
à l'aide de la surveillance des API, de l'outil Trace ou des journaux d'accès NGINX comme expliqué dans Étapes de diagnostic courantes. - Si le code d'erreur est
protocol.http.EmptyPath
et que la source d'erreur est la valeurtarget
, cela indique que l'URL du serveur backend présente un chemin. L'URL du serveur backend est représentée par la variable de flux
<ph type="x-smartling-placeholder">target.url
dans Apigee. Périphérie. Cette erreur se produit généralement lorsque vous essayez de mettre à jour l'URL du serveur backend,target.url
de manière dynamique en utilisant l'une des règles (dans proxy/flux partagé) dans le flux de requêtes Target, de sorte que son chemin d'accès est vide.- Déterminez si la variable de flux
target.url
a effectivement un chemin vide et si la source de sa valeur en procédant de l'une des façons suivantes:Trace
Utiliser l'outil Trace
Si vous avez capturé une trace pour cette erreur, suivez les étapes décrites dans la section Utiliser l'outil Trace :
- Vérifiez si le chemin d'accès de
target.url
est vide. Si c'est le cas, découvrez quelle stratégie a modifié ou mis à jour la valeur de
target.url
pour contenir un chemin d'accès vide.Exemple de trace montrant que la stratégie JavaScript a mis à jour la variable de flux
target.url:
- Dans l'exemple de trace ci-dessus, notez que la stratégie JavaScript a modifié ou
a modifié la valeur de
target.url
pour qu'elle contienne un chemin d'accès vide. - Notez que
target.url
comprend les composants suivants: <ph type="x-smartling-placeholder">- </ph>
- schéma:
https://mocktarget.apigee.net
- path:vide
- schéma:
Journaux
Utiliser des journaux sur votre serveur de journaux
- Si vous n'avez aucune trace de cette erreur (problème intermittent), consultez
voir si vous avez enregistré les informations
sur la valeur de la variable de flux
target.url
, à l'aide de règles telles que <ph type="x-smartling-placeholder"></ph> MessageLogging ou <ph type="x-smartling-placeholder"></ph> ServiceAccroche à votre serveur de journaux. - Si vous disposez des journaux, examinez-les et procédez comme suit:
<ph type="x-smartling-placeholder">
- </ph>
- Vérifiez si
target.url
a un chemin d'accès vide et - Vérifiez si vous pouvez déterminer quelle stratégie a modifié
target.url
contenir un chemin d'accès vide
- Vérifiez si
proxy d'API
Examiner le proxy d'API en échec
Si vous ne disposez d'aucune trace ni de journaux pour cette erreur, examinez l'API défaillante pour déterminer ce qui a modifié ou mis à jour la variable de flux
target.url
de contenir un chemin d'accès non valide. Vérifiez les éléments suivants :- La stratégie dans le proxy d'API
- Tous les flux partagés appelés à partir du proxy
- Vérifiez si le chemin d'accès de
Examinez la stratégie spécifique (par exemple, assignMessage ou JavaScript) qui modifie ou met à jour soigneusement la variable de flux
target.url
et détermine la cause de la mise à jourtarget.url
pour avoir un chemin d'accès vide.Voici quelques exemples de règles qui mettent à jour la variable de flux
target.url
de manière incorrecte pour contenir un chemin d'accès vide menant à cette erreur.Exemple 1
Exemple n° 1: Mise à jour de la variable
target.url
par une règle JavaScriptvar url = "https://mocktarget.apigee.net" context.setVariable("target.url", url);
Dans l'exemple ci-dessus, notez que la variable de flux
target.url
est mise à jour avec la valeurhttps://mocktarget.apigee.net
contenue dans une autre variableurl
Notez que
target.url
comprend les composants suivants:- schéma:
https://mocktarget.apigee.net
- path:vide
Puisque le chemin d'accès est vide, Apigee Edge renvoie
500 Internal Server Error
avec code d'erreurprotocol.http.EmptyPath
.Exemple 2
Exemple n° 2: Mise à jour de la variable
target.url
par une règle JavaScriptvar path = context.getVariable("request.header.Path"); var url = "https://mocktarget.apigee.net" + path context.setVariable("target.url", url);
Dans l'exemple ci-dessus, notez que la variable de flux
target.url
est mise à jour par concaténer la valeurhttps://mocktarget.apigee.net
contenue dans une variableurl
et la valeur d'une autre variablepath
, dont La valeur est extraite derequest.header.Path.
Si vous avez accès à la requête ou à la trace réelle, vous pouvez vérifier la valeur réelle transmis à
request.header.Path
.Exemple de requête effectuée par l'utilisateur:
curl -v https://HOST_ALIAS/v1/myproxy -H "Authorization: Bearer <token>
Dans cet exemple, le chemin d'en-tête n'est pas envoyé dans la requête. Par conséquent, la valeur du chemin d'accès de la variable dans la règle JavaScript est
null
.Exemple :
url = https://mocktarget.apigee.net + path
url = https://mocktarget.apigee.net + null
target.url = https://mocktarget.apigee.netnull
Notez que
target.url
comprend les composants suivants:- schéma:
https://mocktarget.apigee.netnull
- path:vide
Exemple 3
Exemple n° 3: La règle AffectMessage met à jour la variable
target.url
via une autre 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>
Notez que
target.url
comprend les composants suivants:- schéma:
https://mocktarget.apigee.net
- path:vide
Dans tous les exemples ci-dessus, le chemin d'accès dans l'URL du serveur backend, qui est
target.url
étant vide, Apigee Edge renvoie500 Internal Server Error
avec le code d'erreurprotocol.http.EmptyPath
.- schéma:
Solution
Conformément aux spécifications
<ph type="x-smartling-placeholder"></ph>
RFC 3986, section 2: Composants de syntaxe, le composant path
est
obligatoire et il DOIT toujours comporter une barre oblique (/), même s'il n'y a pas
d'autres caractères dans path
. Procédez comme suit pour
résoudre ce problème:
- Assurez-vous que l'URL du serveur backend, représentée par la variable de flux
target.url
a toujours un chemin d'accès non vide.- Dans certains cas, il se peut que le chemin d'accès ne contienne pas de nom de ressource, puis assurez-vous que celui-ci
comporte au moins une barre oblique (
/
). - Si vous utilisez d'autres variables pour déterminer la valeur de la variable de flux
target.url
, puis assurez-vous que le chemin des autres variables n'est pas vide. - Si vous effectuez des opérations de chaîne pour déterminer la valeur de la variable de flux
target.url
, puis vérifiez que le résultat de la chaîne n'a pas de chemin d'accès vide.
- Dans certains cas, il se peut que le chemin d'accès ne contienne pas de nom de ressource, puis assurez-vous que celui-ci
comporte au moins une barre oblique (
- Dans les exemples présentés dans la section Diagnostic, vous pouvez résoudre ce problème en tant que
expliqué ci-dessous:
Exemple 1
Exemple n° 1: Mise à jour de la variable
target.url
par une règle JavaScriptAjoutez une barre oblique (
/
) à la variableurl
pour résoudre ce problème comme indiqué ci-dessous:var url = "https://mocktarget.apigee.net/" context.setVariable("target.url", url);
Exemple 2
Exemple n° 2: Mise à jour de la variable
target.url
par une règle JavaScriptvar path = context.getVariable("request.header.Path"); var url = "https://mocktarget.apigee.net" + path context.setVariable("target.url", url);
Veillez à transmettre un chemin d'accès valide, par exemple
/iloveapis
, dans le cadre de en-tête de requêtePath
pour résoudre ce problème comme indiqué ci-dessous:Exemple de requête:
curl -v https://HOST_ALIAS/v1/myproxy -H "Authorization: Bearer <token> -H "Path: /iloveapis"
Exemple 3
Exemple n° 3: La règle AffectMessage met à jour la variable
target.url
via une autre variableAjoutez un chemin d'accès valide dans l'élément
<Value>
de la règle AffectMessage. Pour par exemple, vous pouvez avoir/json
comme chemin d'accès API MockTarget Autrement dit, modifiez l'élément<Value>
pour qu'ilhttps://mocktarget.apigee.net/json
comme indiqué ci-dessous:<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>
Spécification
Apigee Edge s'attend à ce que l'URL du serveur backend ne comporte pas de chemin d'accès vide, conformément à la les spécifications suivantes:
Spécification |
---|
<ph type="x-smartling-placeholder"></ph> RFC 3986, section 3: Composants de la syntaxe |
<ph type="x-smartling-placeholder"></ph> RFC 3986, section 3.3: Chemin d'accès |
Si vous avez encore besoin de l'aide de l'assistance Apigee, accédez à Obligation de recueillir des informations de diagnostic.
Obligation de recueillir des informations de diagnostic
Si le problème persiste alors que vous avez suivi les instructions ci-dessus, rassemblez les informations suivantes : de diagnostic, puis contactez l'assistance Apigee Edge.
Si vous êtes un utilisateur de cloud public, fournissez les informations suivantes:
- Nom de l'organisation
- Nom de l'environnement
- Nom du proxy d'API
- Exécutez la commande
curl
utilisée pour reproduire le500 Internal Server Error
avec le code d'erreurprotocol.http.EmptyPath
. - Fichier de suivi des requêtes API
Si vous êtes un utilisateur du Private Cloud, fournissez les informations suivantes:
- Message d'erreur complet observé pour les requêtes en échec
- Nom de l'environnement
- Groupe de proxys d'API
- Fichier de suivi des requêtes API
Journaux d'accès NGINX:
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log
Où:ORG, ENV et PORT# sont remplacés par les valeurs réelles.
- Journaux système du processeur de messages
/opt/apigee/var/log/edge-message- processor/logs/system.log