Вы просматриваете документацию Apigee Edge .
Перейдите в документацию Apigee X.info
Симптом
В ответ на вызовы API клиентское приложение получает HTTP-статус 500 Internal Server Error с кодом ошибки protocol.http.BadPath .
Сообщение об ошибке
Клиентское приложение получает следующий код ответа:
HTTP/1.1 500 Internal Server Error
Кроме того, вы можете увидеть следующее сообщение об ошибке:
{
"fault":{
"faultstring":"Invalid request path",
"detail":{
"errorcode":"protocol.http.BadPath"
}
}
}Возможные причины
Эта ошибка возникает, если URL-адрес запроса к бэкэнд-серверу, представленный переменной потока target.url , содержит path Если символ начинается с вопросительного знака ( ? ) вместо косой черты ( / ), это недопустимо .
В соответствии со спецификациями 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.BadPath .
Например: если target.url имеет значение https://www.mocktarget.apigee.net?json , то возникает эта ошибка, поскольку path оказывается недействительным, так как начинается с вопросительного знака ( ? ) вместо косой черты ( / ).
| Причина | Описание | Инструкции по устранению неполадок, применимые для |
|---|---|---|
| URL-адрес бэкэнд-сервера (target.url) содержит недопустимый путь. | В URL-адресе бэкэнд-сервера, представленном переменной потока target.url , компонент пути начинается с вопросительного знака ( ? ) вместо косой черты ( / ). | Пользователи публичных и частных облачных сервисов на периферии сети |
Общие этапы диагностики
Для диагностики этой ошибки воспользуйтесь одним из следующих инструментов/методов:
Мониторинг API
Процедура №1: Использование мониторинга API
Для диагностики ошибки с помощью мониторинга API:
- Войдите в пользовательский интерфейс Apigee Edge под учетной записью пользователя с соответствующей ролью .
Переключитесь на организацию, в которой вы хотите расследовать проблему.

- Перейдите на страницу Анализ > Мониторинг API > Исследование .
- Выберите конкретный временной промежуток, в течение которого вы наблюдали ошибки.
Постройте график зависимости кода ошибки от времени .
Выберите ячейку, содержащую код ошибки
protocol.http.BadPath, как показано ниже:
Информация о коде ошибки
protocol.http.BadPathотображается следующим образом:
Нажмите «Просмотреть журналы» и разверните строку с неудачным запросом.

- В окне «Журналы» обратите внимание на следующие сведения:
- Код состояния:
500 - Источник неисправности:
target - Код ошибки:
protocol.http.BadPath
- Код состояния:
- Если источником ошибки является
target, а код ошибки равенprotocol.http.BadPath, это означает, что URL-адрес бэкэнд-сервера содержит недопустимый путь.
След
Процедура №2: Использование инструмента трассировки
Для диагностики ошибки с помощью инструмента трассировки:
- Включите сеанс трассировки и либо
- Дождитесь появления ошибки
500 Internal Server Error, или - Если вы можете воспроизвести проблему, выполните вызов API для воспроизведения ошибки
500 Internal Server Error
- Дождитесь появления ошибки
Убедитесь, что параметр «Показывать все FlowInfos» включен:

- Выберите один из запросов, завершившихся неудачей, и изучите трассировку.
- Проследите за различными этапами трассировки и определите место возникновения сбоя.
Как правило, ошибка возникает после этапа «Начало выполнения целевого запроса» , как показано ниже:

Обратите внимание на значение ошибки, полученное из трассировки:
Ошибка: Неверный путь запроса
Поскольку ошибка возникает в Apigee Edge после этапа запуска потока целевого запроса , это указывает на недопустимый путь к URL-адресу бэкэнд-сервера. Это, скорее всего, произойдет, если переменная потока
target.url(представляющая URL-адрес бэкэнд-сервера) в Apigee Edge была обновлена с указанием недопустимого пути в результате применения одной из политик в потоке целевого запроса.- Изучите разделы «Прочитанные и присвоенные переменные» в каждом из потоков, начиная с потока ошибок и заканчивая фазой «Начало потока целевого запроса» .
- Определите политику, в которой переменная потока
target.urlБыло обновлено:Пример трассировки, демонстрирующий обновление переменной потока
target.url:
В приведенном выше примере трассировки обратите внимание, что значение переменной потока
target.urlобновляется в политике JavaScript с именемJS- SetTargetURLследующим образом:target.url : https://mocktarget.apigee.net?json - Обратите внимание, что значение в
target.urlсостоит из следующих компонентов:- схема:
https - авторитетный источник:
mocktarget.apigee.net - путь:
?json
- схема:
- Поскольку компонент пути начинается с вопросительного знака (
?) вместо косой черты (/), возникает ошибкаInvalid request path. - Перейдите к этапу AX (Analytics Data Recorded) в трассировке и щелкните по нему.
Прокрутите вниз до раздела «Подробности этапа — Заголовки ошибок» и определите значения X-Apigee-fault-code и X-Apigee-fault-source, как показано ниже:

Вы увидите значения X-Apigee-fault-code и X-Apigee-fault-source как
protocol.http.BadPathиtargetсоответственно, указывая на то, что эта ошибка вызвана недопустимым путем к URL-адресу бэкэнд-сервера.Заголовки ответа Ценить X-Apigee-fault-code protocol.http.BadPathX-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.BadPathза определенный период времени (если проблема возникала ранее) или есть ли запросы, которые по-прежнему завершаются с ошибкой500. Если вы обнаружите ошибки
500с кодом X-Apigee-fault-code, соответствующим значениюprotocol.http.BadPath, определите значение X-Apigee-fault-source.Пример ошибки 500 из журнала доступа NGINX:

Приведенная выше запись из журнала доступа NGINX содержит следующие значения для X-Apigee-fault-code и X-Apigee-fault-source:
Заголовки Ценить X-Apigee-fault-code protocol.http.BadPathX-Apigee-fault-source targetОбратите внимание, что значения X-Apigee-fault-code и X-Apigee-fault-source равны
protocol.http.BadPathиtargetсоответственно, указывая на то, что эта ошибка вызвана недопустимым путем к URL-адресу бэкэнд-сервера.
Причина: URL-адрес бэкэнд-сервера (target.url) содержит недопустимый путь.
Диагноз
- Определите код ошибки и источник ошибки
500 Internal Server Errorиспользуя мониторинг API, инструмент трассировки или журналы доступа NGINX, как описано в разделе «Общие шаги диагностики» . - Если код ошибки равен
protocol.http.BadPath, а источник ошибки имеет значениеtarget, это указывает на то, что URL-адрес бэкэнд-сервера содержит недопустимый путь . URL-адрес бэкэнд-сервера представлен переменной потока
target.urlв Apigee Edge. Эта ошибка обычно возникает, если вы пытаетесь динамически обновить URL-адрес бэкэнд-сервера (target.url) с помощью любой из политик (в рамках прокси/общего потока) в потоке запроса Target, в результате чего путь оказывается недопустимым .Определите, действительно ли переменная потока
target.urlсодержит недопустимый путь и источник своего значения, используя один из следующих методов:След
Использование инструмента трассировки
Если вы получили трассировку этой ошибки, выполните действия, описанные в разделе «Использование инструмента трассировки ».
- Проверьте, не содержит ли
target.urlнедопустимый путь, то есть начинается ли он с вопросительного знака (?) вместо косой черты (/). Если да, то выясните, какая политика изменила или обновила значение
target.url, добавив в него недопустимый путь.Пример трассировки, демонстрирующий обновление переменной потока
target.urlполитикой JavaScript.
- В приведенном выше примере трассировки обратите внимание, что политика JavaScript изменила или обновила значение
target.url, добавив в него недопустимый путь. - Обратите внимание, что
target.urlсостоит из следующих компонентов:- схема:
https - авторитетный источник:
mocktarget.apigee.net - путь:
?json
Путь начинается с вопросительного знака (
?) вместо косой черты (/) , поэтому он недействителен. - схема:
Журналы
Использование журналов на вашем сервере журналов
- Если у вас нет трассировки для этой ошибки (проблема возникает периодически), проверьте, зарегистрирована ли информация о значении переменной потока
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?json" context.setVariable("target.url", url);
В приведенном выше примере обратите внимание, что переменная потока
target.urlобновляется значениемhttps://mocktarget.apigee.net?jsonсодержащимся в другой переменнойurl .Обратите внимание, что значение
urlсостоит из следующих компонентов:- схема:
https - авторитетный источник:
mocktarget.apigee.net - путь:
?json
Путь начинается с вопросительного знака (
?) вместо косой черты (/) , что недопустимо . Поэтому Apigee Edge возвращает500 Internal Server Errorс кодом ошибкиprotocol.http.BadPath.Образец №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и значение другой переменнойpath, значение которой извлекается изrequest.header.Path .Если у вас есть доступ к самому запросу или трассировке, вы можете проверить фактическое значение, переданное в
request.header.Path.Пример запроса, сделанного пользователем.
curl -v https://HOST_ALIAS/v1/myproxy -H "Authorization: Bearer <token> -H "Path: ?user"
В этом примере заголовок path не отправляется в составе запроса. Поэтому значение переменной
pathв политике JavaScript равноnull.Так:
-
url = https://mocktarget.apigee.net + path -
url = https://mocktarget.apigee.net + "?user" -
target.url = https://mocktarget.apigee.net?user
Обратите внимание, что значение
target.urlсостоит из следующих компонентов:- схема:
https - авторитетный источник:
mocktarget.apigee.net - путь:
?user
Путь начинается с вопросительного знака (
?) вместо косой черты (/) , что недопустимо . Поэтому Apigee Edge возвращает500 Internal Server Errorс кодом ошибкиprotocol.http.BadPath.Образец №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?echo</Value> </AssignVariable> <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables> <AssignTo createNew="false" transport="http" type="request"/> </AssignMessage>
Обратите внимание, что значение параметра
urlсостоит из следующих компонентов:- схема:
https - авторитетный источник:
mocktarget.apigee.net - путь:
?echo
В этом примере путь начинается с вопросительного знака (
?) вместо косой черты (/) , что недопустимо . Поэтому Apigee Edge возвращает500 Internal Server Errorс кодом ошибкиprotocol.http.BadPath.- схема:
Разрешение
Согласно спецификации URL RFC 3986, раздел 3: Компоненты синтаксиса , компонент path является обязательным и ДОЛЖЕН всегда начинаться с "/" . Поэтому выполните следующие шаги, чтобы исправить эту проблему:
- Убедитесь, что URL-адрес бэкэнд-сервера, представленный переменной потока
target.url, всегда имеет допустимый путь и всегда начинается с косой черты (/) .- В некоторых случаях в пути может отсутствовать имя ресурса, в этом случае убедитесь, что путь содержит хотя бы косую черту (
/). - Если вы используете какие-либо другие переменные для определения значения переменной потока
target.url, убедитесь, что другие переменные не содержат недопустимого пути . - Если вы выполняете какие-либо строковые операции для определения значения переменной потока
target.url, убедитесь, что результат этих строковых операций не содержит недопустимого пути .
- В некоторых случаях в пути может отсутствовать имя ресурса, в этом случае убедитесь, что путь содержит хотя бы косую черту (
В приведенных выше примерах эту проблему можно исправить следующим образом:
Образец №1
Пример №1: Обновление переменной
target.urlв соответствии с политикой JavaScriptДля исправления этой проблемы используйте косую черту (
/) вместо вопросительного знака (?) в переменнойurl, как показано ниже:var url = "https://mocktarget.apigee.net/json" 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);
Убедитесь, что вы передаете допустимый путь, например:
/userв заголовке запросаPath, чтобы исправить эту проблему, как показано ниже:Пример запроса:
curl -v https://HOST_ALIAS/v1/myproxy -H "Authorization: Bearer <token> -H "Path: /user"
Образец №3
Пример №3: Политика AssignMessage обновляет переменную
target.urlДобавьте допустимый путь в элемент
<Value>политики AssignMessage. То есть замените вопросительный знак (?). с косая черта (/) Чтобы исправить эту проблему, установите значение в элементе<Value>наhttps://mocktarget.apigee.net/echo, как показано ниже:<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>
Спецификация
Компания Apigee Edge ожидает, что
pathкомпонент В URL-адресе бэкэнд-сервера ВСЕГДА должен начинаться с символа . косая черта (/) в соответствии со следующими техническими условиями:Спецификация RFC 3986, раздел 3: Компоненты синтаксиса RFC 3986, раздел 3.3: Путь Если вам по-прежнему нужна помощь службы поддержки Apigee, перейдите по ссылке «Необходимо собрать диагностическую информацию» .
Необходимо собрать диагностическую информацию.
Если проблема сохраняется даже после выполнения вышеуказанных инструкций, соберите следующую диагностическую информацию, а затем обратитесь в службу поддержки Apigee Edge :
Если вы являетесь пользователем публичного облака , предоставьте следующую информацию:
- Название организации
- Название среды
- Имя API-прокси
- Полная команда
curl, использованная для воспроизведения500 Internal Server Errorс кодом ошибкиprotocol.http.BadPath - Файл трассировки для запросов 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
Ссылки