Вы просматриваете документацию Apigee Edge .
Перейдите к документации Apigee X. информация
Симптом
Клиентское приложение получает код состояния 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 Public и Private Cloud |
Общие этапы диагностики
Для диагностики этой ошибки используйте один из следующих инструментов/методов:
API-мониторинг
Процедура № 1. Использование мониторинга API
Чтобы диагностировать ошибку с помощью мониторинга API:
- Войдите в пользовательский интерфейс Apigee Edge как пользователь с соответствующей ролью .
Переключитесь на организацию, в которой вы хотите разобраться в проблеме.
- Перейдите на страницу Анализ > Мониторинг API > Расследование .
- Выберите конкретный период времени, в течение которого вы наблюдали ошибки.
Постройте график зависимости кода неисправности от времени .
Выберите ячейку с кодом ошибки
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
- Дождитесь появления
Убедитесь, что параметр «Показать все FlowInfos» включен:
- Выберите один из неудачных запросов и проверьте трассировку.
- Перемещайтесь по различным этапам трассировки и найдите место, где произошел сбой.
Обычно ошибку можно найти в потоке после фазы запуска целевого потока запросов , как показано ниже:
Обратите внимание на значение ошибки из трассировки.
ошибка: путь запроса не может быть пустым
Поскольку ошибка возникает Apigee Edge после фазы запуска целевого потока запросов , это указывает на то, что
path
в URL-адресе внутреннего сервера пуст . Скорее всего, это произойдет, если переменная потокаtarget.url
(которая представляет URL-адрес внутреннего сервера) была обновлена пустым путем через одну из политик в потоке запросов.- Изучите раздел «Переменные, прочитанные и назначенные» в каждом из потоков в обратном направлении от точки ошибки до фазы запуска целевого потока запросов .
Определите политику, в которой переменная потока
target.url
обновляется.Пример трассировки, показывающий, что политика JavaScript обновила переменную потока
target.url
:В примере трассировки, показанном выше, обратите внимание на значение переменной потока
target.url
обновляется в политике JavaScript с именем SetTargetURL следующим образом:target.url : https://mocktarget.apigee.net
- Обратите внимание, что
target.url
имеет следующие компоненты:- схема:
https://mocktarget.apigee.net
- путь: пустой
- схема:
- Таким образом, вы получаете сообщение об ошибке
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-код неисправности protocol.http.EmptyPath
X-Apigee-источник-ошибки target
НГИНКС
Процедура №3: Использование журналов доступа NGINX
Чтобы диагностировать ошибку с помощью журналов доступа NGINX:
- Если вы являетесь пользователем частного облака , вы можете использовать журналы доступа NGINX для определения ключевой информации о
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-код неисправности protocol.http.EmptyPath
X-Apigee-источник-ошибки target
Обратите внимание, что значения X-Apigee-fault-code и X-Apigee-fault-source — это
protocol.http.EmptyPath
иtarget
соответственно, что указывает на то, что эта ошибка вызвана тем, что URL-адрес внутреннего сервера имеет пустой путь .
Причина: URL-адрес внутреннего сервера (target.url) имеет пустой путь.
Диагностика
- Определите код ошибки и источник ошибки для
500 Internal Server Error
с помощью мониторинга API, инструмента трассировки или журналов доступа 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
имеет следующие компоненты:- схема:
https://mocktarget.apigee.net
- путь: пустой
- схема:
Журналы
Использование журналов на вашем сервере журналов
- Если у вас нет трассировки этой ошибки (периодическая проблема), проверьте, записали ли вы информацию о значении переменной потока
target.url
с помощью таких политик, как MessageLogging или ServiceCallout, на свой сервер журналов. - Если у вас есть журналы, просмотрите их и:
- Проверьте, имеет ли
target.url
пустой путь, и - Посмотрите, сможете ли вы определить, какая политика изменила
target.url
, чтобы он содержал пустой путь.
- Проверьте, имеет ли
API-прокси
Проверка неисправного прокси-сервера API
Если у вас нет трассировки или журналов этой ошибки, просмотрите неисправный прокси-сервер API, чтобы определить, что изменило или обновило переменную потока
target.url
, чтобы она содержала недопустимый путь. Проверьте следующее:- Политика в API-прокси
- Любые общие потоки, вызываемые из прокси-сервера.
- Убедитесь, что в
Внимательно изучите конкретную политику (например, AssignMessage или JavaScript), которая изменяет или обновляет переменную потока
target.url
, и определите причину обновленияtarget.url
до пустого пути.Вот несколько примеров политик, которые неправильно обновляют переменную потока
target.url
, чтобы она содержала пустой путь, что приводит к этой ошибке.Образец №1
Пример № 1: Обновление политики JavaScript в переменной
target.url
var url = "https://mocktarget.apigee.net" context.setVariable("target.url", url);
Обратите внимание, что в приведенном выше примере переменная потока
target.url
обновляется значениемhttps://mocktarget.apigee.net
, содержащимся в другой переменнойurl
.Обратите внимание, что
target.url
имеет следующие компоненты:- схема:
https://mocktarget.apigee.net
- путь: пустой
Поскольку путь пуст, Apigee Edge возвращает
500 Internal Server Error
с кодом ошибкиprotocol.http.EmptyPath
.Образец №2
Пример № 2: Обновление политики JavaScript в переменной
target.url
var 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
переменной.url
и значение другой переменнойpath
, значение которой извлекается изrequest.header.Path .
Если у вас есть доступ к фактическому запросу или трассировке, вы можете проверить фактическое значение, переданное в
request.header.Path
.Пример запроса, сделанного пользователем:
curl -v https://HOST_ALIAS/v1/myproxy -H "Authorization: Bearer <token>
В этом примере путь заголовка не отправляется как часть запроса. Следовательно, значение переменной path в политике JavaScript равно
null
.Так:
-
url = https://mocktarget.apigee.net + path
-
url = https://mocktarget.apigee.net + null
-
target.url = https://mocktarget.apigee.netnull
Обратите внимание, что
target.url
имеет следующие компоненты:- схема:
https://mocktarget.apigee.netnull
- путь: пустой
Образец №3
Пример № 3. Политика AssignMessage обновляет переменную
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</Value> </AssignVariable> <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables> <AssignTo createNew="false" transport="http" type="request"/> </AssignMessage>
Обратите внимание, что
target.url
имеет следующие компоненты:- схема:
https://mocktarget.apigee.net
- путь: пустой
Во всех приведенных выше примерах путь в URL-адресе внутреннего сервера, то есть
target.url
, пуст, поэтому Apigee Edge возвращает500 Internal Server Error
с кодом ошибкиprotocol.http.EmptyPath
.- схема:
Разрешение
В соответствии со спецификацией RFC 3986, раздел 2: Компоненты синтаксиса , компонент path
является обязательным , и он ДОЛЖЕН всегда иметь косую черту (/), даже если в составе path
нет других символов. Чтобы устранить эту проблему, выполните следующие действия:
- Убедитесь, что URL-адрес внутреннего сервера, представленный переменной потока
target.url
всегда имеет непустой путь .- В некоторых случаях в пути может отсутствовать имя ресурса, поэтому убедитесь, что путь имеет хотя бы косую черту (
/
). - Если вы используете какие-либо другие переменные для определения значения переменной потока
target.url
, убедитесь, что другие переменные не имеют пустого пути. - Если вы выполняете какие-либо строковые операции для определения значения переменной потока
target.url
, убедитесь, что результат или результат строковых операций не имеет пустой путь.
- В некоторых случаях в пути может отсутствовать имя ресурса, поэтому убедитесь, что путь имеет хотя бы косую черту (
- В примерах, обсуждаемых в разделе «Диагностика» , вы можете устранить эту проблему, как описано ниже:
Образец №1
Пример № 1: Обновление политики JavaScript в переменной
target.url
Добавьте косую черту (
/
) кurl
переменной, чтобы устранить эту проблему, как показано ниже:var url = "https://mocktarget.apigee.net/" context.setVariable("target.url", url);
Образец №2
Пример № 2: Обновление политики JavaScript в переменной
target.url
var 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. Политика AssignMessage обновляет переменную
target.url
через другую переменную.Добавьте допустимый путь в элемент
<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 .
Если вы являетесь пользователем Public Cloud , предоставьте следующую информацию:
- Название организации
- Имя среды
- Имя 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# заменяются фактическими значениями.
- Системные журналы процессора сообщений
/opt/apigee/var/log/edge-message- processor/logs/system.log