Вы просматриваете документацию по Apigee Edge.
Перейдите к документации по Apigee X. Информация
Symptom
Клиентское приложение получает код статуса 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"
}
}
}Возможные причины
Эта ошибка возникает только в следующих случаях:
- Кодировка, указанная в заголовке
Content-EncodingHTTP-запроса, действительна и поддерживается Apigee Edge. - Формат полезной нагрузки, отправленной клиентом в составе HTTP-запроса, не соответствует формату кодировки, указанному в заголовке
Content-Encoding.
BUT
Это происходит потому, что Apigee Edge не удается декодировать полезную нагрузку с помощью указанной кодировки, поскольку формат полезной нагрузки не совпадает с форматом кодировки, указанным в заголовке Content-Encoding.
Ниже приведены примеры поддерживаемых значений Content-Encoding и ожидаемый формат полезной нагрузки в Apigee Edge в этих случаях:
| Сценарий | Content-Encoding | Ожидаемый формат полезной нагрузки |
|---|---|---|
| Одна кодировка | gzip | Формат Unix Подробнее о формате GZIP согласно RFC1952… |
| Одна кодировка | deflate | В этом формате используется структура |
| Несколько кодировок | Несколько кодировок Например, если кодирование выполняется дважды, это может быть:
|
Несколько типов кодировки, примененных к полезной нагрузке в том порядке, в котором они указаны в заголовке. |
Возможные причины ошибки:
| Причина | Описание | Инструкции по устранению неполадок, применимые к |
|---|---|---|
| Формат полезной нагрузки запроса не соответствует кодировке, указанной в заголовке Content-Encoding | Формат полезной нагрузки запроса, отправленного клиентом, не закодирован или не соответствует кодировке, указанной в заголовке Content-Encoding. |
Пользователи общедоступного и частного облака Edge |
Распространенные этапы диагностики
Чтобы диагностировать эту ошибку, используйте один из следующих инструментов или методов:
Мониторинг API
Чтобы диагностировать ошибку с помощью мониторинга API:
- Войдите в интерфейс Apigee Edge как пользователь с подходящей ролью.
Перейдите к организации, в которой хотите изучить проблему.
- Перейдите на страницу Анализ > Мониторинг API > Исследование.
- Выберите период времени, в течение которого вы наблюдали ошибки.
- Убедитесь, что для фильтра Прокси задано значение Все.
- Постройте график Код ошибки по оси Y и Время по оси X.
Выберите ячейку с кодом ошибки
messaging.adaptors.http.flow.DecompressionFailureAtRequest, как показано ниже.( посмотреть изображение в полном размере)
Информация о коде ошибки
messaging.adaptors.http.flow.DecompressionFailureAtRequestбудет показана, как на изображении ниже.( посмотреть изображение в полном размере)
Нажмите Посмотреть журналы и разверните строку, в которой произошла ошибка
400.( посмотреть изображение в полном размере)
- В окне Журналы обратите внимание на следующие сведения:
- Код статуса:
400. - Источник ошибки:
proxy - Код ошибки:
messaging.adaptors.http.flow.DecompressionFailureAtRequest.
- Код статуса:
- Если в поле Fault Source указано значение
proxy, это означает, что формат полезной нагрузки запроса не соответствует поддерживаемой кодировке, указанной в заголовкеContent-Encoding.
Инструмент "Трассировка"
Чтобы диагностировать ошибку с помощью инструмента трассировки, выполните следующие действия:
- Включите сеанс трассировки и один из следующих вариантов:
- Дождитесь ошибки
400 Bad Requestили - Если вы можете воспроизвести проблему, сделайте вызов API и воспроизведите
400 Bad Request.
- Дождитесь ошибки
Убедитесь, что включен параметр Показывать все FlowInfo:
- Выберите один из неудачных запросов и изучите трассировку.
- Перемещайтесь по разным этапам трассировки и находите, где произошла ошибка.
Обычно ошибка возникает в потоке сразу после этапа Запрос получен от клиента, как показано ниже.
( посмотреть изображение в полном размере)
-
Запишите значения свойств из трассировки:
- Ошибка:
Decompression failure at request - error.class:
com.apigee.rest.framework.BadRequestException - error.cause:
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.- Запишите код статуса и сообщение об ошибке, возвращенные 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-fault-code messaging.adaptors.http.flow.DecompressionFailureAtRequestX-Apigee-fault-source policy
nginx
Чтобы диагностировать ошибку с помощью журналов доступа 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-fault-code messaging.adaptors.http.flow.DecompressionFailureAtRequestX-Apigee-fault-source 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, как описано в разделе Распространенные шаги диагностики.
Значения из примера трассировки:
- Content-Encoding:
gzip - error.cause:
Not in GZIP format
Значение в заголовке запроса Content-Encoding – gzip, однако полезная нагрузка запроса не в формате GZIP (как указано в error.cause). Поэтому Apigee Edge возвращает код ошибки
messaging.adaptors.http.flow.DecompressionFailureAtRequestи объект400 Bad Request.- Content-Encoding:
Фактический запрос
Чтобы проверить запрос:
Если у вас есть доступ к фактическому запросу, отправленному клиентским приложением, выполните следующие действия:
- Определите значение, переданное в заголовок запроса
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.
Журналы процессора сообщений
Чтобы проверить данные с помощью журналов Message Processor, выполните следующие действия:
Если вы используете Private Cloud, то можете определить ключевую информацию об ошибках HTTP
400с помощью журналов Message Processor.- Определите идентификатор сообщения для запроса, который не удалось выполнить, с помощью API Monitoring, инструмента трассировки или журналов доступа NGINX, как описано в разделе Общие шаги диагностики.
Найдите идентификатор сообщения в журнале Message Processor:
/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() : Exceptionjava.util.zip.ZipException: Not in GZIP formatoccurred 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в приведенном выше сообщении об ошибке указывают, что полезная нагрузка запроса не отправлена в формате deflate и не соответствует кодировке, указанной в заголовкеContent-Encodingdeflate. Поэтому 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.
Если вы пользователь общедоступного облака, предоставьте следующую информацию:
- Название организации
- Название среды
- Название прокси API
- Команда
curl, использованная для воспроизведения ошибки400 - Файл трассировки для запросов к 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