Вы просматриваете документацию Apigee Edge .
Перейдите к документации Apigee X. информация
Симптом
Клиентское приложение получает код состояния HTTP 400 Bad Request
с кодом ошибки messaging.adaptors.http.flow.DecompressionFailureAtRequest
в качестве ответа на вызовы API.
Сообщение об ошибке
Клиентское приложение получает следующий код ответа:
HTTP/1.1 400 Bad Request
Кроме того, вы можете увидеть сообщение об ошибке, подобное показанному ниже:
{ "fault":{ "faultstring":"Decompression failure at request", "detail":{ "errorcode":"messaging.adaptors.http.flow.DecompressionFailureAtRequest" } } }
Возможные причины
Эта ошибка возникает только в том случае, если:
- Кодировка, указанная в заголовке HTTP-запроса
Content-Encoding
действительна и поддерживается Apigee Edge . - Формат полезных данных, отправленный клиентом как часть HTTP-запроса , не соответствует формату кодировки, указанному в заголовке
Content-Encoding
.
НО
Это связано с тем, что Apigee Edge не может декодировать полезные данные с использованием указанной кодировки, поскольку формат полезных данных не совпадает с форматом кодировки, указанной в заголовке Content-Encoding
.
Вот несколько примеров поддерживаемых значений Content-Encoding
и того, каким Apigee Edge ожидает формат полезной нагрузки в этих случаях:
Сценарий | Кодирование контента | Ожидаемый формат полезной нагрузки |
---|---|---|
Единая кодировка | gzip | Формат Unix См. Формат GZIP RFC1952 . |
Единая кодировка | сдувать | В этом формате используется структура |
Множественное кодирование | Множественное кодирование Например, в случаях, когда кодирование выполняется дважды, это может быть:
| К полезным данным применяется множественное кодирование в заданном порядке, как оно указано в заголовке. |
Возможные причины этой ошибки следующие:
Причина | Описание | Инструкции по устранению неполадок применимы для |
---|---|---|
Формат полезных данных запроса не соответствует кодировке, указанной в заголовке Content-Encoding. | Формат полезных данных запроса, отправленных клиентом, либо не закодирован, либо не соответствует кодировке, указанной в заголовке Content-Encoding . | Пользователи Edge Public и Private Cloud |
Общие этапы диагностики
Для диагностики этой ошибки используйте один из следующих инструментов/методов:
API-мониторинг
Чтобы диагностировать ошибку с помощью мониторинга API:
- Войдите в пользовательский интерфейс Apigee Edge как пользователь с соответствующей ролью .
Переключитесь на организацию, в которой вы хотите разобраться в проблеме.
- Перейдите на страницу Анализ > Мониторинг API > Расследование .
- Выберите конкретный период времени, в течение которого вы наблюдали ошибки.
- Убедитесь, что для фильтра прокси установлено значение «Все» .
- Постройте график зависимости кода неисправности от времени .
Выберите ячейку с кодом ошибки
messaging.adaptors.http.flow.DecompressionFailureAtRequest
, как показано ниже:Информация о коде ошибки
messaging.adaptors.http.flow.DecompressionFailureAtRequest
отображается, как показано ниже:Нажмите «Просмотреть журналы» и разверните строку с ошибкой
400
.- В окне «Журналы» обратите внимание на следующие детали:
- Код состояния:
400
- Источник ошибки:
proxy
- Код ошибки:
messaging.adaptors.http.flow.DecompressionFailureAtRequest
.
- Код состояния:
- Если источник сбоя имеет значение
proxy
, это указывает на то, что формат полезных данных запроса не соответствует поддерживаемой кодировке , указанной в заголовкеContent-Encoding
.
Инструмент трассировки
Чтобы диагностировать ошибку с помощью инструмента трассировки:
- Включите сеанс трассировки и выполните одно из следующих действий:
- Дождитесь появления ошибки
400 Bad Request
или - Если вы можете воспроизвести проблему, выполните вызов API и воспроизведите
400 Bad Request
.
- Дождитесь появления ошибки
Убедитесь, что параметр «Показать все FlowInfos» включен:
- Выберите один из неудачных запросов и проверьте трассировку.
- Перемещайтесь по различным этапам трассировки и найдите место, где произошел сбой.
Обычно вы обнаруживаете ошибку в потоке сразу после фазы запроса, полученного от клиента, как показано ниже:
Обратите внимание на значения свойств из трассировки:
- ошибка:
Decompression failure at request
- error.class :
com.apigee.rest.framework.BadRequestException
- ошибка.причина:
Not in GZIP format
В error.cause указано, что полезная нагрузка запроса НЕ находится в формате GZIP. Это означает, что Apigee Edge ожидал, что полезные данные запроса будут в формате GZIP, как это было бы указано в заголовке
Content-Encoding
.- ошибка:
Определите значение заголовка запроса
Content-Encoding
. Для этого перейдите к этапу «Запрос получен от клиента», как показано ниже:( просмотреть увеличенное изображение )
Обратите внимание, что значение заголовка запроса
Content-Encoding
действительно равноgzip
.Приведенный выше пример трассировки показывает, что в заголовке запроса
Content-Encoding
указана кодировкаgzip
; однако полезные данные запроса не имеют формата GZIP. Поэтому Apigee не может распаковать полезную нагрузку с помощью gzip иDecompression failure at request
error.- Обратите внимание на код состояния и сообщение об ошибке, возвращаемое Apigee Edge, перейдя по
к этапу «Ответ, отправленный клиенту» в трассировке, как показано ниже:
( просмотреть увеличенное изображение )
Обратите внимание на следующие детали трассировки:
- Код состояния:
400 Bad Request
. - Содержимое ошибки:
{"fault":{"faultstring":"Decompression failure at request","detail":{"errorcode":"messaging.adaptors.http.flow.DecompressionFailureAtRequest"}}}
- Код состояния:
Перейдите к этапу AX (записанные аналитические данные) в трассировке и щелкните его.
- Прокрутите вниз до раздела «Сведения о фазе , заголовки ошибок» и определите значения X-Apigee-fault-code и X-Apigee-fault-source, как показано ниже:
- Вы увидите значения X-Apigee-fault-code и X-Apigee-fault-source как
messaging.adaptors.http.flow.DecompressionFailureAtRequest
иpolicy
, указывающие, что формат полезных данных запроса не соответствует кодировке, указанной вContent-Encoding
заголовка.Заголовки ответов Ценить X-Apigee-код неисправности messaging.adaptors.http.flow.DecompressionFailureAtRequest
X-Apigee-источник-ошибки policy
НГИНКС
Чтобы диагностировать ошибку с помощью журналов доступа NGINX:
- Если вы являетесь пользователем частного облака , вы можете использовать журналы доступа NGINX для определения ключевой информации об ошибках HTTP
400
. Проверьте журналы доступа NGINX:
/opt/apigee/var/log/edge-router/nginx/ ORG ~ ENV . PORT# _access_log
Где: ORG , ENV и PORT# заменяются фактическими значениями.
- Выполните поиск, чтобы узнать, возникли ли какие-либо ошибки
400
в течение определенного периода времени (если проблема возникла в прошлом) или есть ли какие-либо запросы, которые по-прежнему завершаются с ошибкой400
. Если вы обнаружите какие-либо
400
ошибок с кодом X-Apigee-fault-code , соответствующим значениюmessaging.adaptors.http.flow.DecompressionFailureAtRequest
, определите значение X-Apigee-fault-source.Пример ошибки 400 из журнала доступа NGINX:
Приведенный выше пример записи из журнала доступа NGINX имеет следующие значения для X-Apigee-fault-code и X-Apigee-fault-source:
Заголовки ответов Ценить X-Apigee-код неисправности messaging.adaptors.http.flow.DecompressionFailureAtRequest
X-Apigee-источник-ошибки policy
Причина. Формат полезных данных запроса не соответствует кодировке, указанной в заголовке Content-Encoding.
По умолчанию Apigee Edge всегда распаковывает полезную нагрузку, если заголовок запроса Content-Encoding
содержит допустимую и поддерживаемую кодировку . Поэтому ожидается, что формат полезных данных запроса должен соответствовать кодировке, указанной в заголовке запроса Content-Encoding
. Если есть несоответствие, вы получите эту ошибку.
Диагностика
- Определите код ошибки и источник ошибки , наблюдаемой с помощью мониторинга API, инструмента трассировки или журналов доступа NGINX, как описано в разделе «Общие шаги диагностики» .
- Если код ошибки —
messaging.adaptors.http.flow.DecompressionFailureAtRequest
, а источник ошибки имеетpolicy
значений илиproxy
, это означает, что запрос, отправленный клиентским приложением, имеет полезную нагрузку, которая не соответствует поддерживаемой кодировке , указанной в заголовке запроса.Content-Encoding
. Определить несоответствие в рамках HTTP-запроса можно одним из следующих методов:
Сообщение об ошибке
Чтобы подтвердить использование сообщения об ошибке:
Если у вас есть доступ к полному сообщению об ошибке, полученному от Apigee Edge, обратитесь к
faultstring
.Пример сообщения об ошибке:
"faultstring":"Decompression failure at request"
- В приведенном выше сообщении об ошибке отображается
"Decompression failure at request"
что означает, что запрос не удалось распаковать с использованием кодировки, указанной в заголовкеContent-Encoding
.
След
Чтобы проверить с помощью трассировки:
- Определите значение заголовка запроса Content-Encoding и свойства error.cause с помощью Trace , как описано в разделе Общие этапы диагностики .
Значения выборки трассировки следующие:
- Кодировка контента:
gzip
- ошибка.причина:
Not in GZIP format
Значение в заголовке запроса Content-Encoding — gzip ; однако полезные данные запроса не имеют формата GZIP (на что указывает error.cause ). Поэтому Apigee Edge отвечает
400 Bad Request
и кодом ошибкиmessaging.adaptors.http.flow.DecompressionFailureAtRequest
.- Кодировка контента:
Фактический запрос
Чтобы подтвердить использование фактического запроса:
Если у вас есть доступ к фактическому запросу, сделанному клиентским приложением, выполните следующие действия:
- Определите значение, передаваемое в заголовок запроса
Content-Encoding
. - Определите формат полезных данных, отправляемых как часть запроса.
Если значение заголовка
Content-Encoding
находится в списке поддерживаемых кодировок , но формат полезных данных запроса не соответствует кодировке, указанной в заголовкеContent-Encoding
, то это и есть причина проблемы.Пример запроса:
curl -v "http://HOSTALIAS/v1/testgzip"
-H "Content-Encoding: gzip"
-X POST -d @request_payload.zipПриведенный выше пример запроса отправляет значение
gzip
в заголовокContent-Encoding
, который является поддерживаемой кодировкой в Apigee Edge. Однако полезные данные запросаrequest_payload.zip
имеют формат ZIP. Таким образом, этот запрос завершается с ошибкой с кодом состояния400 Bad Request
и кодом ошибки:messaging.adaptors.http.flow.DecompressionFailureAtRequest
.
Журналы процессора сообщений
Для проверки с использованием журналов процессора сообщений:
Если вы являетесь пользователем частного облака , вы можете использовать журналы процессора сообщений для определения ключевой информации об ошибках HTTP
400
.- Определите идентификатор сообщения неудачного запроса с помощью мониторинга API, инструмента трассировки или журналов доступа NGINX, как описано в разделе «Общие шаги диагностики» .
Найдите идентификатор сообщения в журнале процессора сообщений:
/opt/apigee/var/log/edge-message-processor/logs/system.log
Вы увидите одно из следующих исключений:
Сценарий №1
Сценарий № 1: Когда запрос API имеет заголовок Content-Encoding: gzip
2021-07-28 10:21:16,861 NIOThread@0 ERROR HTTP.SERVER - HTTPServer$Context.onInputException() : Message id:rt-57-1 SSLClientChannel[Accepted: Remote:192.168.199.8:8443 Local:192.168.80.234:44284]@28469 useCount=1 bytesRead=0 bytesWritten=28764 age=2739893ms lastIO=0ms isOpen=true.onExceptionRead exception: {} java.util.zip.ZipException: Not in GZIP format 2021-07-28 10:21:16,862 NIOThread@0 ERROR ADAPTORS.HTTP.FLOW - AbstractRequestListener.onException() : Request:POST, uri:/test, message Id:rt-57-1, exception:java.util.zip.ZipException: Not in GZIP format, context:Context@71ea5ac input=ClientInputChannel(SSLClientChannel[Accepted: Remote:192.168.199.8:8443 Local:192.168.80.234:44284]@28469 useCount=1 bytesRead=0 bytesWritten=28764 age=2739894ms lastIO=0ms isOpen=true) 2021-07-28 10:21:16,862 NIOThread@0 INFO HTTP.SERVICE - ExceptionHandler.handleException() : Exception
java.util.zip.ZipException: Not in GZIP format
occurred while writing to channel null 2021-07-28 10:21:16,863 NIOThread@0 INFO HTTP.SERVICE - ExceptionHandler.handleException() : Exception trace: java.util.zip.ZipException: Not in GZIP formatСтрока
java.util.zip.ZipException: Not in GZIP format
в приведенном выше сообщении об ошибке указывает, что полезные данные запроса не отправляются в формате GZIP, хотяContent-Encoding
указан как gzip. Поэтому Apigee Edge выдает исключение и возвращает код состояния400
с кодом ошибкиmessaging.adaptors.http.flow.DecompressionFailureAtRequest
клиентским приложениям.Сценарий №2
Сценарий № 2: Когда запрос API имеет заголовок Content-Encoding: deflate
2021-07-28 15:26:31,893 NIOThread@1 ERROR HTTP.SERVER - HTTPServer$Context.onInputException() : Message id:rt-47875-1 SSLClientChannel[Accepted: Remote:192.168.199.8:8443 Local:192.168.81.72:45954]@29276 useCount=1 bytesRead=0 bytesWritten=37230 age=3498856ms lastIO=1ms isOpen=true.onExceptionRead exception: {}
java.util.zip.ZipException: incorrect header check
….Caused by: java.util.zip.DataFormatException: incorrect header check
.. 2021-07-28 15:26:31,894 NIOThread@1 ERROR ADAPTORS.HTTP.FLOW - AbstractRequestListener.onException() : Request:POST, uri:/test, message Id:rrt-47875-1, exception:java.util.zip.ZipException: incorrect header check, context:Context@69b3ac45 input=ClientInputChannel(SSLClientChannel[Accepted: Remote:192.168.199.8:8443 Local:192.168.81.72:45954]@29276 useCount=1 byt esRead=0 bytesWritten=37230 age=3498856ms lastIO=1ms isOpen=true)Строки
java.util.zip.ZipException: incorrect header check
иCaused by: java.util.zip.DataFormatException: incorrect header check
в приведенном выше сообщении об ошибке указывают на то, что полезные данные запроса не отправляются в дефляционном формате и не соответствуют кодировке. указанный в заголовкеContent-Encoding
файла deflate. Поэтому Apigee Edge выдает исключение и возвращает код состояния400
с кодом ошибкиmessaging.adaptors.http.flow.DecompressionFailureAtRequest
клиентским приложениям.
Разрешение
- Если нет необходимости в сжатой полезной нагрузке запроса в потоке прокси-сервера API в Apigee Edge и на внутреннем сервере, не передавайте заголовок
Content-Encoding
. Если необходимо сжать полезные данные запроса, перейдите к шагу 2. - Убедитесь, что клиентское приложение всегда отправляет следующее:
- Любая поддерживаемая кодировка в качестве значения заголовка
Content-Encoding
в запросе. - Полезная нагрузка запроса Apigee Edge в поддерживаемом формате соответствует формату кодировки, указанному в заголовке
Content-Encoding
.
- Любая поддерживаемая кодировка в качестве значения заголовка
- В примере, рассмотренном выше, полезные данные запроса имеют формат ZIP, но в заголовке запроса указано
Content-Encoding: gzip
. Вы можете решить эту проблему, отправив заголовок запроса какContent-Encoding: gzip
и полезные данные запроса также в форматеgzip
:curl -v "https://HOSTALIAS/v1/testgzip" -H "Content-Encoding: gzip" -X POST -d @request_payload.gz
Спецификация
Apigee Edge отвечает кодом состояния 400 Bad Request
с кодом ошибки messaging.adaptors.http.flow.DecompressionFailureAtRequest
в соответствии со следующими спецификациями RFC:
Спецификация |
---|
RFC 7231, раздел 6.5.1 |
RFC 7231, раздел 3.1.2.2 |
Если вам по-прежнему нужна помощь со стороны службы поддержки Apigee, перейдите к разделу «Необходимо собрать диагностическую информацию» .
Необходимо собрать диагностическую информацию
Соберите следующую диагностическую информацию, а затем обратитесь в службу поддержки Apigee Edge :
Если вы являетесь пользователем Public Cloud , предоставьте следующую информацию:
- Название организации
- Имя среды
- Имя API-прокси
- Полная команда
curl
, используемая для воспроизведения ошибки400
- Файл трассировки запросов 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