Вы просматриваете документацию Apigee Edge .
Перейдите к документации Apigee X. информация
Симптом
Клиентское приложение получает код состояния HTTP 502 Bad Gateway с кодом ошибки protocol.http.ResponseWithBody в качестве ответа на вызовы API.
Сообщение об ошибке
Клиентское приложение получает следующий код ответа:
HTTP/1.1 502 Bad Gateway
Кроме того, вы можете увидеть одно из следующих сообщений об ошибке:
{
"fault":{
"faultstring":"Received 204 Response with message body",
"detail":{
"errorcode":"protocol.http.ResponseWithBody"
}
}
}{
"fault":{
"faultstring":"Received 205 Response with message body",
"detail":{
"errorcode":"protocol.http.ResponseWithBody"
}
}
}Возможные причины
Эта ошибка возникает, если HTTP-ответ от внутреннего сервера к Apigee Edge имеет значение 204 No Content или 205 Reset Content , но содержит тело ответа и/или один или несколько следующих заголовков:
-
Content-Length -
Content-Encoding -
Transfer-Encoding
В соответствии со спецификациями RFC 7231, раздел 6.3.5: 204 «Нет содержимого» и RFC 7231, раздел 6.3.6: 205 «Сбросить содержимое» , ожидается, что никакой дополнительный контент не должен отправляться как часть тела полезной нагрузки ответа с кодом состояния 204 No Content или 205 Reset Content исходным сервером. Заголовки ответа, такие как Content-Length , Content-Encoding или Transfer-Encoding указывают размер, тип или формат полезных данных ответа.
Таким образом, Apigee Edge возвращает код состояния 502 Bad Gateway с кодом ошибки protocol.http.ResponseWithBody клиенту при следующих обстоятельствах:
| Код состояния с внутреннего сервера | ||
|---|---|---|
| Ответ от внутреннего сервера содержит | 204 Нет содержания | 205 Сбросить содержимое |
| Тело ответа | ОШИБКА | ОШИБКА |
Заголовок (установлено ненулевое значение) | ОШИБКА | ОШИБКА |
(установлено поддерживаемое кодирование в Apigee Edge ) | ОШИБКА | НЕТ ОШИБКИ |
Transfer-Encoding | ОШИБКА | ОШИБКА |
Вот возможные причины этой ошибки:
| Причина | Описание | Инструкции по устранению неполадок применимы для |
|---|---|---|
| Тело ответа или заголовки с ответом 204 от внутреннего сервера. | Внутренний сервер отправляет ответ 204 No Content или 205 Reset Content с телом ответа и/или одним или несколькими заголовками Content-Type , Content-Encoding или Transfer-Encoding . | Пользователи Edge Public и Private Cloud |
Общие этапы диагностики
Для диагностики этой ошибки используйте один из следующих инструментов/методов:
API-мониторинг
Чтобы диагностировать ошибку с помощью мониторинга API:
- Войдите в пользовательский интерфейс Apigee Edge как пользователь с соответствующей ролью .
Переключитесь на организацию, в которой вы хотите разобраться в проблеме.

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

Вы увидите информацию о коде ошибки
protocol.http.ResponseWithBody, как показано ниже:( просмотреть увеличенное изображение )

Нажмите «Просмотреть журналы» и разверните строку с невыполненным запросом.
( просмотреть увеличенное изображение )

- В окне «Журналы» обратите внимание на следующие детали:
- Код состояния:
502 - Источник неисправности:
target - Код ошибки:
protocol.http.ResponseWithBody.
- Код состояния:
- Если источник сбоя имеет
targetзначение, а код сбоя имеет значениеprotocol.http.ResponseWithBody, это указывает на то, что ошибка произошла из-за того, что внутренний сервер отправил код состояния204 No Contentили205 Reset Contentс телом ответа и/или один из заголовков, упомянутых в разделе «Возможные причины» .
Инструмент трассировки
Чтобы диагностировать ошибку с помощью инструмента трассировки:
- Включите сеанс трассировки и выполните одно из следующих действий:
- Подождите, пока произойдет ошибка
502 Bad Gateway. или - Если вы можете воспроизвести проблему, выполните вызов API и воспроизведите ошибку
502 Bad Gateway.
- Подождите, пока произойдет ошибка
Убедитесь, что параметр «Показать все FlowInfos» включен:

- Выберите один из неудачных запросов и проверьте трассировку.
- Перемещайтесь по различным этапам трассировки и найдите место, где произошел сбой.
Обычно вы обнаруживаете ошибку в сообщении об ошибке
flowinfoсразу после этапа отправки запроса на целевой сервер, как показано ниже:Сценарий №1
Сценарий № 1: Внутренний сервер отвечает кодом состояния
204 No Content, содержащего тело ответа и/или один из заголовков, перечисленных в разделе «Возможные причины» .
Обратите внимание на следующие значения из трассировки:
- ошибка:
Received 204 Response with message body - error.class:
com.apigee.rest.framework.BadGateway
Сценарий №2
Сценарий № 2: Внутренний сервер отвечает кодом состояния
204 No Content, содержащего тело ответа и/или один из заголовков, перечисленных в разделе «Возможные причины» .
Обратите внимание на следующие значения из трассировки:
- ошибка:
Received 205 Response with message body - error.class:
com.apigee.rest.framework.BadGateway
- ошибка:
- Перейдите к этапу AX (записанные аналитические данные) в трассировке и щелкните его.
Прокрутите вниз до раздела «Сведения о фазе , заголовки ошибок» и определите значения X-Apigee-fault-code и X-Apigee-fault-source, как показано ниже:
( просмотреть увеличенное изображение )

- Обратите внимание, что значениями X-Apigee-fault-code и X-Apigee-fault-source
are protocol.http.ResponseWithBodyиtargetсоответственно. Это указывает на то, что ошибка произошла из-за того, что внутренний сервер отправил код состояния204 No Contentили205 Reset Contentвместе с телом ответа и/или одним из заголовков, упомянутых в разделе Возможные причины .Ошибка Ценить X-Apigee-код неисправности protocol.http.ResponseWithBodyX-Apigee-источник-ошибки target
НГИНКС
Чтобы диагностировать ошибку с помощью журналов доступа NGINX:
- Если вы являетесь пользователем частного облака , вы можете использовать журналы доступа NGINX для определения ключевой информации о HTTP
502 Bad Gateway. Проверьте журналы доступа NGINX:
/opt/apigee/var/log/edge-router/nginx/ ORG ~ ENV . PORT# _access_logГде: ORG , ENV и PORT# заменяются фактическими значениями.
- Выполните поиск, чтобы узнать, есть ли какие-либо ошибки
502с кодом ошибкиprotocol.http.ResponseWithBodyв течение определенного периода времени (если проблема возникла в прошлом) или есть ли какие-либо запросы, которые по-прежнему завершаются с ошибкой502. Если вы обнаружите какие-либо ошибки
502с кодом X-Apigee-fault-code , соответствующим значениюprotocol.http.ResponseWithBody, определите значение X-Apigee-fault-source .Пример ошибки 502 из журнала доступа NGINX:

Приведенный выше пример записи из журнала доступа NGINX имеет следующие значения для X-Apigee-fault-code и X-Apigee-fault-source :
Заголовки ответов Ценить X-Apigee-код неисправности protocol.http.ResponseWithBodyX-Apigee-источник-ошибки target- Обратите внимание, что значениями X-Apigee-fault-code и X-Apigee-fault-source являются
protocol.http.ResponseWithBodyиtargetсоответственно. Это указывает на то, что ошибка произошла из-за того, что внутренний сервер отправил код состояния204 No Contentили205 Reset Contentвместе с телом ответа и/или одним из заголовков, упомянутых в разделе Возможные причины .
Причина: тело ответа или заголовки с ответом 204 от внутреннего сервера.
Диагностика
- Определите код ошибки и источник ошибки , наблюдаемой с помощью мониторинга API, инструмента трассировки или журналов доступа NGINX, как описано в разделе «Общие шаги диагностики» .
- Если код ошибки —
protocol.http.ResponseWithBody, а источник ошибки имеет значениеtarget, то это означает, что внутренний сервер ответил кодом состояния204 No Contentили205 Reset Contentс телом ответа и/или одним из упомянутых заголовков. в разделе Возможные причины . Чтобы проверить, действительно ли внутренний сервер отправил тело полезных данных ответа и/или один или несколько заголовков, упомянутых в разделе «Возможные причины» , вы можете выполнить следующие шаги:
Если вы являетесь пользователем общедоступного облака и можете ли вы сделать тот же запрос API к внутреннему серверу непосредственно из любой из ваших систем.
- Если вы являетесь пользователем частного облака , то вы можете сделать тот же API-запрос к внутреннему серверу непосредственно от одного из процессоров сообщений, связанных с конкретной организацией и средой, где наблюдается сбой.
Просмотрите ответ, полученный от внутреннего сервера, и убедитесь, что он содержит тело полезных данных ответа и/или один или несколько вышеупомянутых заголовков. Если да, то это причина этой ошибки.
Образец №1
Пример № 1: Ответ внутреннего сервера 204 с заголовком Content-Encoding
curl -v "https://BACKEND_SERVER_HOST_NAME/PATH" -H "HEADER: VALUE" -X HTTP_REQUEST_METHOD
… < HTTP/1.1 204 No Content
< Content-Encoding: gzip< Date: Tue, 31 Jul 2021 21:41:13 GMT < Connection: keep-aliveВ этом примере внутренний сервер ответил кодом состояния
204 No ContentиContent-Encoding: gzipОбразец №2
Пример № 2: Ответ внутреннего сервера 204 с заголовком Content-Length
curl -v "https://BACKEND_SERVER_HOST_NAME/PATH" -H "HEADER: VALUE" -X HTTP_REQUEST_METHOD
… < HTTP/1.1 204 No Content
< Content-Length: 48< Date: Tue, 31 Jul 2021 21:41:13 GMT < Connection: keep-aliveВ этом примере внутренний сервер ответил кодом состояния
204 No ContentиContent-Length: 48Образец №3
Пример № 3: Ответ внутреннего сервера 205 с телом ответа
curl -v "https://BACKEND_SERVER_HOST_NAME/PATH" -H "HEADER: VALUE" -X HTTP_REQUEST_METHOD
… < HTTP/1.1 205 Reset Content < Date: Sat, 31 Jul 2021 17:14:09 GMT < Content-Length: 12 < Content-Type: text/plain; charset=utf-8 < * Connection #0 to host X.X.X.X left intact
This is a sample ResponseВ этом примере внутренний сервер ответил кодом состояния
205 Reset Contentс телом ответаThis is a sample Response.- Во всех приведенных выше примерах внутренний сервер отправлял код состояния
204 No Contentили205 Reset Contentвместе с телом ответа и/или одним из заголовков, упомянутых в разделе Возможные причины . - Поэтому Apigee Edge отправил код состояния
502 Bad Gatewayс кодом ошибкиprotocol.http.ResponseWithBody.
Разрешение
Убедитесь, что внутренний сервер всегда соответствует спецификации RFC 7231, раздел 6.3.6: 205 Reset Content при отправке ответа 204 No Content или 205 Reset Content в Apigee Edge. То есть внутренний сервер НЕ ДОЛЖЕН отправлять следующее как часть ответа 204 No Content или 205 Reset Content :
- Тело полезной нагрузки ответа
- И любой из следующих заголовков:
-
Content-Length -
Content-Encoding -
Transfer-Encoding
-
Спецификация
Apigee Edge отвечает кодом состояния 502 Bad Gateway и кодом ошибки protocol.http.ResponseWithBody если внутренний сервер отправляет ответ 204 No Content или 205 Reset Content , но не соответствует следующим спецификациям RFC:
| Спецификация |
|---|
| RFC 7231, раздел 6.3.5: 204 Нет содержимого |
| RFC 7231, раздел 6.3.6: 205 Сбросить содержимое |
Ключевые моменты, на которые следует обратить внимание
Рекомендуемое решение — исправить внутренний сервер, чтобы он отправлял код состояния 204 No Content и 205 Reset Content без тела ответа и любых заголовков — Content-Length , Content-Encoding и Transfer-Encoding и придерживаться спецификаций RFC 7231. раздел 6.3.5: 204 No Content и RFC 7231, раздел 6.3.6: 205 Reset Content .
Если вам по-прежнему нужна помощь со стороны службы поддержки Apigee, перейдите к разделу «Необходимо собрать диагностическую информацию» .
Необходимо собрать диагностическую информацию
Соберите следующую диагностическую информацию, а затем обратитесь в службу поддержки Apigee Edge :
Если вы являетесь пользователем Public Cloud , предоставьте следующую информацию:
- Название организации
- Имя среды
- Имя API-прокси
- Полная команда
curl, используемая для воспроизведения ошибки502 - Файл трассировки запросов 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