Вы просматриваете документацию Apigee Edge .
Перейдите к документации Apigee X. информация
Симптом
Клиентское приложение получает код состояния HTTP 400 Bad Request
с кодом ошибки protocol.http.DuplicateHeader
в качестве ответа на вызовы API.
Сообщение об ошибке
Клиентское приложение получает следующий код ответа:
HTTP/1.1 400 Bad Request
Кроме того, вы можете увидеть сообщение об ошибке, подобное показанному ниже:
{ "fault":{ "faultstring":"Duplicate Header \"Expires\"", "detail":{ "errorcode":"protocol.http.DuplicateHeader" } } }
Возможные причины
Эта ошибка возникает, если определенный HTTP-заголовок, дубликаты которого не разрешены в Apigee Edge, появляется более одного раза с одинаковыми или разными значениями в составе HTTP-запроса, отправленного клиентом в Apigee Edge.
Согласно RFC 7230, раздел 3.2.2: Порядок полей , отправитель НЕ ДОЛЖЕН генерировать несколько полей заголовка с одинаковым именем поля в сообщении, если только все значение поля для этого поля заголовка не определено как список, разделенный запятыми, [т.е. , #(значения)] или поле заголовка являются хорошо известным исключением. Если Apigee Edge обнаруживает определенный заголовок, дубликаты которого недопустимы, более одного раза в HTTP-запросе , отправленном клиентом, он отвечает 400 Bad Request
и кодом ошибки protocol.http.DuplicateHeader
.
Вот возможные причины этой ошибки:
Причина | Описание | Инструкции по устранению неполадок применимы для |
---|---|---|
Дублирующийся заголовок в запросе | HTTP-запрос от клиентского приложения к Apigee содержит повторяющиеся заголовки. | Пользователи Edge Public и Private Cloud |
Общие этапы диагностики
Для диагностики этой ошибки используйте один из следующих инструментов/методов:
API-мониторинг
Чтобы диагностировать ошибку с помощью мониторинга API:
- Войдите в пользовательский интерфейс Apigee Edge как пользователь с соответствующей ролью .
Переключитесь на организацию, в которой вы хотите разобраться в проблеме.
- Перейдите на страницу Анализ > Мониторинг API > Расследование .
- Выберите конкретный период времени, в течение которого вы наблюдали ошибки.
- Убедитесь, что для фильтра прокси установлено значение «Все» .
- Постройте график зависимости кода неисправности от времени .
Выберите ячейку с кодом ошибки
protocol.http.DuplicateHeader
, как показано ниже:Информация о коде неисправности
protocol.http.DuplicateHeader
http.DuplateHeader отображается, как показано ниже:- Нажмите «Просмотреть журналы» и разверните строку с невыполненным запросом.
- В окне «Журналы» обратите внимание на следующие детали:
- Код состояния:
400
- Источник неисправности:
apigee
- Код ошибки:
protocol.http.DuplicateHeader
.
- Код состояния:
- Если источник неисправности имеет значение
apigee
илиMP
а код ошибки имеет значениеprotocol.http.DuplicateHeader
, что указывает на то, что HTTP-запрос от клиента содержит повторяющиеся заголовки.
Инструмент трассировки
НГИНКС
Чтобы диагностировать ошибку с помощью журналов доступа 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 , соответствующим значениюprotocol.http.DuplicateHeader
, определите значение X-Apigee-fault-source.Пример ошибки 400 из журнала доступа NGINX:
Приведенный выше пример записи из журнала доступа NGINX имеет следующие значения для X-Apigee-fault-code и X-Apigee-fault-source:
Заголовки ответов Ценить X-Apigee-код неисправности protocol.http.DuplicateHeader
X-Apigee-источник-ошибки MP
Причина: повторяющийся заголовок в запросе.
Диагностика
- Определите код ошибки и источник ошибки , наблюдаемой с помощью мониторинга API или журналов доступа NGINX, как описано в разделе «Общие шаги диагностики» .
- Если источник сбоя имеет значение
apigee
илиMP
, это указывает на то, что запрос, отправленный клиентским приложением в Apigee, содержит повторяющиеся заголовки. Вы можете определить фактический заголовок, который отправляется более одного раза как часть запроса, используя один из следующих методов:
Сообщение об ошибке
Использование сообщения об ошибке
Если у вас есть доступ к полному сообщению об ошибке, полученному от Apigee Edge, обратитесь к
faultstring
.faultstring
содержит имя заголовка, которое было отправлено более одного раза.Пример сообщения об ошибке:
"faultstring":"Duplicate Header \"Expires\""
- В приведенном выше сообщении об ошибке вы можете видеть, что заголовок
Expires
отправляется более одного раза, как видно изfaultstring
.
Фактический запрос
Использование фактического запроса
Если у вас есть доступ к фактическому запросу, сделанному клиентским приложением, выполните следующие действия:
- Проверьте список заголовков, переданных в запросе.
- Если вы обнаружите, что определенный заголовок появляется в запросе более одного раза с одним и тем же значением или разными значениями, то это и есть причина данной ошибки.
Образец запроса:
curl https://HOST_ALIAS/duplicateheadertest -v -H "Expires: Mon, 21 June 2021 07:28:00 GMT" -H "Expires: Mon, 21 June 2021 07:28:00 GMT"
В приведенном выше примере запроса заголовок
Expires
отправляется более одного раза. Таким образом, этот запрос завершается с ошибкой400 Bad Request
и кодом ошибки:protocol.http.DuplicateHeader
.- Альтернативно, если у вас есть доступ к журналам клиентов, вы можете увидеть, есть ли у вас информация о фактическом запросе, сделанном к Apigee Edge, и определить заголовок, который отправляется более одного раза.
Разрешение
Исправить дублирование
Вариант № 1 [рекомендуемый вариант] Исправьте клиентское приложение, чтобы оно не включало повторяющиеся заголовки.
- Проанализируйте причину, по которой конкретный клиент отправил дубликат заголовка. Например,
Expires
в приведенном выше случае. Убедитесь, что прокси-серверы API могут принимать повторяющийся заголовок. Как правило, это нежелательно согласно спецификации HTTP RFC7230 . - Если это нежелательно, измените клиентское приложение, чтобы оно не отправляло повторяющиеся заголовки.
В рассмотренном выше примере замечено, что заголовок
Expires
отправляется дважды с одним и тем же значением, что нежелательно. Вы можете решить проблему, передав заголовокExpires
только один раз, как показано ниже:curl https://HOST_ALIAS/duplicateheadertest -v -H "Expires: Mon, 21 June 2021 07:28:00 GMT"
- Если это желательно и вы хотите разрешить дублирование заголовков, перейдите к варианту № 2 с использованием свойства CwC .
КвК
Вариант №2: Использование свойства CwC
Apigee предоставляет свойство CwC HTTPHeader.<HeaderName>
, которое позволяет клиентским приложениям и целевым серверам отправлять дубликаты заголовков прокси-серверам API в Apigee Edge.
недвижимость CwC | Ценности |
---|---|
HTTPHeader.<HeaderName> | allowDuplicates,multivalued |
Например, в процессорах сообщений можно установить следующее свойство, чтобы разрешить дубликаты и несколько значений для заголовка Expires
.
HTTPHeader.Expires=allowDuplicates, multiValued
- Если вы являетесь пользователем частного облака , вы можете настроить это свойство, чтобы Apigee Edge не выдавал ошибку
400 Bad Request
, даже если запрос содержит повторяющиеся заголовки, используя практическое руководство по настройке процессоров сообщений для использования повторяющихся заголовков . - Если вы являетесь пользователем общедоступного облака , обратитесь в службу поддержки Apigee Edge , чтобы настроить это свойство для вашей организации.
Спецификация
Apigee ожидает, что клиентское приложение не будет отправлять повторяющиеся заголовки как часть запроса в соответствии со следующими спецификациями RFC:
Спецификация |
---|
RFC 7230, раздел 3.2.2: Порядок полей |
RFC 7230, раздел 3.2 Поля заголовка |
Если вам по-прежнему нужна помощь со стороны службы поддержки Apigee, перейдите к разделу «Необходимо собрать диагностическую информацию» .
Необходимо собрать диагностическую информацию
Соберите следующую диагностическую информацию, а затем обратитесь в службу поддержки Apigee Edge .
Если вы являетесь пользователем Public Cloud , предоставьте следующую информацию:
- Название организации
- Имя среды
- Имя API-прокси
- Полная команда
curl
, используемая для воспроизведения ошибки400
- Файл трассировки запросов API
Если вы являетесь пользователем частного облака , предоставьте следующую информацию:
- Полное сообщение об ошибке, наблюдаемое для неудачных запросов
- Имя среды
- Пакет прокси API
- Полная команда
curl
, которую вы использовали для воспроизведения ошибки400
- Файл трассировки запросов 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