Вы просматриваете документацию по Apigee Edge.
Перейдите к документации по Apigee X. Информация
Symptom
Клиентское приложение получает код статуса HTTP 500 Internal Server Error с кодом ошибки protocol.http.EmptyPath в качестве ответа на вызовы API.
Сообщение об ошибке
Клиентское приложение получает следующий код ответа:
HTTP/1.1 500 Internal Server Error
Кроме того, может появиться следующее сообщение об ошибке:
{
"fault":{
"faultstring":"Request path cannot be empty",
"detail":{
"errorcode":"protocol.http.EmptyPath"
}
}
}Возможные причины
Эта ошибка возникает, если URL запроса внутреннего сервера, представленный переменной потока
target.url, содержит пустой путь.
Согласно спецификациям RFC 3986, раздел 3: компоненты синтаксиса и RFC 3986, раздел 3.3: путь:
Синтаксис URI состоит из следующих компонентов:
foo://example.com:8042/over/there?name=ferret#nose \_/ \______________/\_________/ \_________/ \__/ | | | | | scheme authority path query fragment- Компонент
pathявляется обязательным и всегда должен содержать косую черту (/), даже если в пути нет других символов.
Поэтому, если в URL запроса внутреннего сервера нет компонента path, то есть даже косой черты (/), Apigee Edge возвращает 500 Internal Server Error и код ошибки protocol.http.EmptyPath.
Например, если в столбце target.url указано значение https://www.mocktarget.apigee.net, то возникает ошибка, поскольку компонент path пуст или отсутствует.
| Причина | Описание | Инструкции по устранению неполадок, применимые к |
|---|---|---|
| URL внутреннего сервера (target.url) содержит пустой путь | URL внутреннего сервера, представленный переменной потока target.url, имеет пустой путь. |
Пользователи общедоступного и частного облака Edge |
Распространенные этапы диагностики
Чтобы диагностировать эту ошибку, используйте один из следующих инструментов или методов:
Мониторинг API
Способ 1. Используйте API Monitoring
Чтобы диагностировать ошибку с помощью мониторинга API:
- Войдите в интерфейс Apigee Edge как пользователь с подходящей ролью.
Перейдите к организации, в которой хотите изучить проблему.

- Перейдите на страницу Анализ > Мониторинг API > Исследование.
- Выберите период времени, в течение которого вы наблюдали ошибки.
Постройте график Код ошибки по оси Y и Время по оси X.
Выберите ячейку с кодом ошибки
protocol.http.EmptyPath, как показано ниже.
Информация о коде ошибки
protocol.http.EmptyPathбудет показана так, как описано ниже.
Нажмите Посмотреть журналы , чтобы развернуть строку с неудачным запросом.
- В окне Журналы обратите внимание на следующие сведения:
- Код статуса:
500. - Источник ошибки:
target - Код ошибки:
protocol.http.EmptyPath
- Код статуса:
- Если в поле Источник ошибки указано значение
target, а в поле Код ошибки –protocol.http.EmptyPath, это означает, что URL внутреннего сервера содержит пустой путь.
Трассировка
Процедура 2. Использование инструмента трассировки
Чтобы диагностировать ошибку с помощью инструмента трассировки, выполните следующие действия:
- Включите трассировку сеанса и выберите один из следующих вариантов:
- Дождитесь ошибки
500 Internal Server Errorили - Если проблему можно воспроизвести, сделайте вызов API, чтобы воспроизвести ее.
500 Internal Server Error
- Дождитесь ошибки
Убедитесь, что включен параметр Показывать все FlowInfo:
- Выберите один из неудачных запросов и изучите трассировку.
- Перемещайтесь по разным этапам трассировки и находите, где произошла ошибка.
Обычно ошибка возникает на этапе после Target Request Flow Started, как показано ниже.
Запишите значение ошибки из трассировки.
error: Request path cannot be empty (ошибка: путь запроса не может быть пустым)
Поскольку ошибка возникает в Apigee Edge после этапа Target Request Flow Started, это означает, что
pathв URL внутреннего сервера пуст. Скорее всего, это происходит, если переменная потокаtarget.url(представляющая URL для внутреннего сервера) была обновлена пустым путем с помощью одного из правил в потоке запроса.- Изучите раздел Variables Read and Assigned (Переменные, которые были прочитаны и которым были присвоены значения) в каждом из потоков в обратном порядке, начиная с точки ошибки и двигаясь к этапу Target Request Flow Started (Запущен поток целевого запроса).
Определите правило, в котором обновляется переменная потока
target.url.Пример трассировки, показывающий, что политика JavaScript обновила переменную потока
target.url:
В приведенном выше примере трассировки обратите внимание на то, что значение переменной потока
target.urlобновляется в правиле JavaScript с названием SetTargetURL следующим образом:target.url : https://mocktarget.apigee.net
- Обратите внимание, что
target.urlсостоит из следующих компонентов:- scheme:
https://mocktarget.apigee.net - path: пустое значение
- scheme:
- Поэтому вы получаете ошибку
Request path cannot be empty. - Перейдите к фазе AX (запись данных аналитики) в трассировке и нажмите на нее.
Прокрутите страницу вниз до раздела Сведения об этапе – Заголовки ошибок и определите значения X-Apigee-fault-code и X-Apigee-fault-source, как показано ниже:

- Вы увидите значения X-Apigee-fault-code и X-Apigee-fault-source как
protocol.http.EmptyPathиtargetсоответственно. Это означает, что ошибка возникла из-за того, что URL внутреннего сервера имеет пустой путь.Заголовки ответов Значение X-Apigee-fault-code protocol.http.EmptyPathX-Apigee-fault-source target
nginx
Процедура 3. Использование журналов доступа NGINX
Чтобы диагностировать ошибку с помощью журналов доступа NGINX:
- Если вы используете частное облако, то можете использовать журналы доступа NGINX, чтобы определить ключевую информацию об HTTP
500 Internal Server Error. Проверьте журналы доступа NGINX:
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log- Выполните поиск, чтобы узнать, возникали ли ошибки
500с кодом ошибкиprotocol.http.EmptyPathв течение определенного периода времени (если проблема возникла в прошлом) или есть ли запросы, которые по-прежнему завершаются с ошибкой500. Если вы обнаружите ошибки
500, для которых X-Apigee-fault-code соответствует значениюprotocol.http.EmptyPath, определите значение X-Apigee-fault-source.Пример ошибки 500 из журнала доступа NGINX:
В приведенной выше записи из журнала доступа NGINX для атрибутов X-Apigee-fault-code и X-Apigee-fault-source заданы следующие значения:
заголовки; Значение X-Apigee-fault-code protocol.http.EmptyPathX-Apigee-fault-source targetОбратите внимание, что значения X-Apigee-fault-code и X-Apigee-fault-source –
protocol.http.EmptyPathиtargetсоответственно. Это означает, что ошибка возникла из-за того, что URL внутреннего сервера имеет путь.
Причина: у URL внутреннего сервера (target.url) пустой путь
диагностика;
- Определите код ошибки и источник ошибки для
500 Internal Server Error, используя API Monitoring, Trace Tool или журналы доступа NGINX, как описано в разделе Распространенные шаги диагностики. - Если код ошибки –
protocol.http.EmptyPath, а источник ошибки –target, это означает, что URL внутреннего сервера имеет путь. URL внутреннего сервера представлен переменной потока
target.urlв Apigee Edge. Эта ошибка обычно возникает, если вы пытаетесь обновить URL внутреннего сервера, то естьtarget.urlдинамически с помощью любого из правил (в рамках потока прокси-сервера или общего потока) в потоке запроса к целевому сервису, так что у него путь пуст.- Чтобы определить, действительно ли переменная потока
target.urlимеет пустой путь и источник своего значения, выполните одно из следующих действий:Трассировка
Как использовать инструмент трассировки
Если вы записали трассировку этой ошибки, выполните действия, описанные в разделе Как использовать инструмент трассировки , и:
- Проверьте, есть ли у
target.urlпустой путь. Если да, выясните, какое правило изменило или обновило значение
target.url, чтобы оно содержало пустой путь.Пример трассировки, показывающий, что правила JavaScript обновили переменную потока
target.url:
- В приведенном выше примере трассировки видно, что правило JavaScript изменило или обновило значение
target.url, добавив пустой путь. - Обратите внимание, что
target.urlсостоит из следующих компонентов:- scheme:
https://mocktarget.apigee.net - path: пустое значение
- scheme:
Журналы
Как использовать журналы на сервере журналов
- Если трассировка для этой ошибки отсутствует (проблема возникает время от времени), проверьте, регистрируется ли информация о значении переменной потока
target.urlс помощью правил, таких как MessageLogging или ServiceCallout, на вашем сервере журналов. - Если у вас есть журналы, проверьте их и:
- Проверьте, пуст ли путь к
target.url, и - Попробуйте определить, какие правила изменили
target.urlтак, что он стал содержать пустой путь.
- Проверьте, пуст ли путь к
прокси-сервер API
Проверка неработающего прокси-сервера API
Если у вас нет трассировки или журналов для этой ошибки, проверьте сбойный прокси API, чтобы определить, что изменило или обновило переменную потока
target.url, в результате чего она стала содержать недопустимый путь. Проверьте следующее.- Правила в прокси-сервере API
- Любые общие процессы, вызванные из прокси-сервера
- Проверьте, есть ли у
Внимательно изучите определенное правило (например, AssignMessage или JavaScript), которое изменяет или обновляет переменную потока
target.url, и определите причину, по которойtarget.urlобновляется до пустого пути.Ниже приведены примеры правил, которые неправильно обновляют переменную потока
target.url, чтобы она содержала пустой путь, что приводит к этой ошибке.Пример 1
Пример 1. Обновление переменной
target.urlв правилах JavaScriptvar url = "https://mocktarget.apigee.net" context.setVariable("target.url", url);
В приведенном выше примере обратите внимание, что переменная потока
target.urlобновляется со значениемhttps://mocktarget.apigee.net, содержащимся в другой переменнойurl.Обратите внимание, что
target.urlсостоит из следующих компонентов:- scheme:
https://mocktarget.apigee.net - path: пустое значение
Поскольку путь пуст, Apigee Edge возвращает
500 Internal Server Errorс кодом ошибкиprotocol.http.EmptyPath.Пример 2
Пример 2. Обновление правила JavaScript с помощью переменной
target.urlvar path = context.getVariable("request.header.Path"); var url = "https://mocktarget.apigee.net" + path context.setVariable("target.url", url);
В приведенном выше примере обратите внимание, что переменная потока
target.urlобновляется путем объединения значенияhttps://mocktarget.apigee.net, содержащегося в переменнойurl, и значения другой переменнойpath, которое извлекается изrequest.header.Path..Если у вас есть доступ к фактическому запросу или трассировке, вы можете проверить фактическое значение, переданное в
request.header.Path.Пример запроса, сделанного пользователем:
curl -v https://HOST_ALIAS/v1/myproxy -H "Authorization: Bearer <token>
В этом примере путь к заголовку не отправляется как часть запроса. Таким образом, значение пути к переменной в правиле JavaScript –
null.Допустим, к примеру, что вы отправили следующую строку:
url = https://mocktarget.apigee.net + pathurl = https://mocktarget.apigee.net + nulltarget.url = https://mocktarget.apigee.netnull
Обратите внимание, что
target.urlсостоит из следующих компонентов:- scheme:
https://mocktarget.apigee.netnull - path: пустое значение
Пример 3
Пример 3. Обновление переменной
target.urlс помощью другой переменной в правиле AssignMessage<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>
Обратите внимание, что
target.urlсостоит из следующих компонентов:- scheme:
https://mocktarget.apigee.net - path: пустое значение
Во всех приведенных выше примерах путь в URL внутреннего сервера, то есть
target.url, пуст, поэтому Apigee Edge возвращает500 Internal Server Errorс кодом ошибкиprotocol.http.EmptyPath.- scheme:
Разрешение
Согласно спецификации
RFC 3986, раздел 2: компоненты синтаксиса, компонент path является
обязательным и всегда должен содержать косую черту (/), даже если в нем
нет других символов path. Чтобы устранить проблему, выполните следующие действия:
- Убедитесь, что URL внутреннего сервера, представленный переменной потока
target.url, всегда имеет непустой путь.- Если в пути нет названия ресурса, убедитесь, что в нем есть хотя бы косая черта (
/). - Если вы используете другие переменные для определения значения переменной потока
target.url, убедитесь, что у них не пустой путь. - Если вы выполняете какие-либо строковые операции, чтобы определить значение переменной потока
target.url, убедитесь, что в результате этих операций не получается пустой путь.
- Если в пути нет названия ресурса, убедитесь, что в нем есть хотя бы косая черта (
- В примерах, приведенных в разделе Диагностика, эту проблему можно устранить следующим образом:
Пример 1
Пример 1. Обновление переменной
target.urlв правилах JavaScriptЧтобы устранить эту проблему, добавьте косую черту (
/) к переменнойurl, как показано ниже:var url = "https://mocktarget.apigee.net/" context.setVariable("target.url", url);
Пример 2
Пример 2. Обновление переменной
target.urlв правилах JavaScriptvar path = context.getVariable("request.header.Path"); var url = "https://mocktarget.apigee.net" + path context.setVariable("target.url", url);
Чтобы устранить эту проблему, убедитесь, что вы передаете действительный путь, например
/iloveapis, как часть заголовка запросаPath, как показано ниже:Пример запроса
curl -v https://HOST_ALIAS/v1/myproxy -H "Authorization: Bearer <token> -H "Path: /iloveapis"
Пример 3
Пример 3. Обновление переменной
target.urlс помощью другой переменной в правиле AssignMessageДобавьте действительный путь в элемент
<Value>правила AssignMessage. Например, вы можете использовать/jsonв качестве пути для MockTarget API. То есть измените элемент<Value>наhttps://mocktarget.apigee.net/json, как показано ниже:<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>
Спецификация
Apigee Edge ожидает, что URL внутреннего сервера не будет содержать пустой путь, как указано в следующих спецификациях:
| Спецификация |
|---|
| RFC 3986, раздел 3: компоненты синтаксиса |
| RFC 3986, раздел 3.3: путь |
Если вам по-прежнему нужна помощь службы поддержки Apigee, перейдите к разделу Сбор диагностической информации.
Как получить диагностическую информацию
Если проблема не исчезнет после выполнения описанных выше инструкций, соберите указанную ниже диагностическую информацию и обратитесь в службу поддержки Apigee Edge.
Если вы пользователь общедоступного облака, предоставьте следующую информацию:
- Название организации
- Название среды
- Название прокси API
- Полная команда
curl, использованная для воспроизведения500 Internal Server Errorс кодом ошибкиprotocol.http.EmptyPath - Файл трассировки для запросов к API
Если вы используете частное облако, предоставьте следующую информацию:
- Полное сообщение об ошибке, которое появляется при неудачных запросах.
- Название среды
- Пакет прокси-сервера API
- Файл трассировки для запросов к API
Журналы доступа NGINX:
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_logГде: ORG, ENV и PORT# заменяются фактическими значениями.
- Системные журналы Message Processor
/opt/apigee/var/log/edge-message- processor/logs/system.log