415 Неподдерживаемый тип носителя — неподдерживаемая кодировка

Вы просматриваете документацию Apigee Edge .
Перейдите к документации Apigee X.
информация

Симптом

Клиентское приложение получает код состояния HTTP 415 Unsupported Media Type с кодом ошибки protocol.http.UnsupportedEncoding в ответ на вызовы API.

Сообщение об ошибке

Клиентское приложение получает следующий код ответа:

HTTP/1.1 415 Unsupported Media Type

Кроме того, вы можете увидеть сообщение об ошибке, подобное показанному ниже:

{
   "fault":{
      "faultstring":"Unsupported Encoding \"UTF-8\"",
      "detail":{
         "errorcode":"protocol.http.UnsupportedEncoding"
      }
   }
}

Возможные причины

Эта ошибка возникает, если значение заголовка Content-Encoding , указанное либо в HTTP-запросе, отправленном клиентом в Apigee, либо в HTTP-ответе, отправленном внутренним сервером в Apigee, не содержит кодировку, поддерживаемую Apigee, согласно спецификации RFC 7231. , раздел 6.5.13: 415 Неподдерживаемый тип носителя .

Возможные причины этой ошибки следующие:

Причина Описание Инструкции по устранению неполадок применимы для
В запросе используется неподдерживаемая кодировка Заголовок запроса Content-Encoding содержит кодировку, которая не поддерживается Apigee Edge. Пользователи Edge Public и Private Cloud
В ответе использована неподдерживаемая кодировка Заголовок ответа внутреннего сервера Content-Encoding содержит кодировку, которая не поддерживается Apigee Edge. Пользователи Edge Public и Private Cloud

Общие этапы диагностики

Для диагностики ошибки можно использовать любой из следующих методов:

API-мониторинг

Чтобы диагностировать ошибку с помощью мониторинга API:

  1. Войдите в свою учетную запись Apigee Edge .
  2. Переключитесь на организацию, в которой хотите разобраться в вопросе:

    раскрывающийся список пользовательского интерфейса организации
  3. Перейдите на страницу Анализ > Мониторинг API > Расследование .
  4. Выберите конкретный период времени, в течение которого вы наблюдали ошибки.
  5. Убедитесь, что для фильтра прокси установлено значение «Все» .
  6. Постройте график зависимости кода неисправности от времени .
  7. Выберите ячейку с кодом ошибки protocol.http.UnsupportedEncoding , как показано ниже:

    выбрана ячейка кода неисправности
  8. Информация о коде неисправности protocol.http.UnsupportedEncoding отображается, как показано ниже:

  9. Нажмите « Просмотреть журналы» и разверните один из запросов, вызвавших ошибку 415 , чтобы просмотреть дополнительную информацию:

  10. В окне «Журналы» обратите внимание на следующие детали:
    • Источник ошибки: показывает, что ошибка возвращается apigee или target .
    • Код ошибки: он должен соответствовать protocol.http.UnsupportedEncoding .
  11. Если источником ошибки является apigee , это означает, что запрос содержал неподдерживаемую кодировку в заголовке Content-Encoding .
  12. Если источником ошибки является target , это означает, что ответ внутреннего сервера содержал неподдерживаемую кодировку в заголовке Content-Encoding .

Инструмент трассировки

Чтобы диагностировать ошибку с помощью инструмента трассировки:

  1. Включите сеанс трассировки и выполните одно из следующих действий:
    • Дождитесь появления ошибки 415 Unsupported Media Type или
    • Если вы можете воспроизвести проблему, выполните вызов API, чтобы воспроизвести ошибку 415 Unsupported Media Type .
  2. Убедитесь, что параметр « Показать все FlowInfos» включен:

    панель параметров просмотра, показать всю информацию о потоке
  3. Выберите один из неудачных запросов и проверьте трассировку.
  4. Перемещайтесь по различным этапам трассировки и найдите место, где произошел сбой.
  5. Обычно вы обнаружите ошибку в потоке после этапа отправки запроса на целевой сервер, как показано ниже:

  6. Обратите внимание на значение ошибки из трассировки.

    В приведенном выше примере трассировки ошибка отображается как Unsupported Encoding "utf-8" . Поскольку ошибка возникает в Apigee после отправки запроса на внутренний сервер, это указывает на то, что внутренний сервер отправил заголовок ответа Content-Encoding со значением "utf-8" , которое не поддерживается в Apigee.

  7. Перейдите к этапу AX (записанные аналитические данные) в трассировке и щелкните его.
  8. Прокрутите вниз до раздела «Заголовки ошибок/ответов» на панели «Сведения о фазе» и определите значения X-Apigee-fault-code и X-Apigee-fault-source, как показано ниже:

  9. Вы увидите значения X-Apigee-fault-code и X-Apigee-fault-source как protocol.http.UnsupportedEncoding и target , что указывает на то, что эта ошибка вызвана тем, что неподдерживаемое значение кодировки "utf-8" было передано внутренний сервер в заголовке ответа Content-Encoding .

    Заголовки ответов Ценить
    X-Apigee-код неисправности protocol.http.UnsupportedEncoding
    X-Apigee-источник-ошибки target

  10. Проверьте, используете ли вы цепочку прокси ; то есть, если целевой сервер/целевая конечная точка вызывает другой прокси-сервер в Apigee.
    1. Чтобы определить это, вернитесь к этапу «Запрос отправлен на целевой сервер» . Нажмите «Показать завиток» .

    2. Откроется окно Curl for Request Sent to Target Server, в котором вы можете определить псевдоним хоста целевого сервера.
    3. Если псевдоним хоста целевого сервера указывает на псевдоним виртуального хоста, то это цепочка прокси. В этом случае вам необходимо повторить все вышеперечисленные шаги для связанного прокси-сервера, пока вы не определите, что на самом деле вызывает ошибку 415 Unsupported Media Type .
    4. Если псевдоним хоста целевого сервера указывает на ваш внутренний сервер, это означает, что ваш внутренний сервер передает неподдерживаемую кодировку в Apigee.

Журналы доступа Nginix

Чтобы диагностировать ошибку с помощью журналов доступа NGINX:

  1. Если вы являетесь пользователем частного облака , вы можете использовать журналы доступа NGINX для определения ключевой информации об ошибках HTTP 415 .
  2. Проверьте журналы доступа NGINX:

    /opt/apigee/var/log/edge-router/nginx/ ORG ~ ENV . PORT# _access_log

  3. Найдите любые ошибки 415 в течение определенного периода времени (если проблема возникла в прошлом) или есть ли какие-либо запросы, которые все еще не выполняются с 415 .
  4. Если вы обнаружите какие-либо ошибки 415 с кодом X-Apigee-fault-code , соответствующим значению protocol.http.UnsupportedEncoding , определите значение X-Apigee-fault-source.

    Пример ошибки 415 из журнала доступа NGINX:

    Приведенный выше пример записи из журнала доступа NGINX имеет следующие значения для X-Apigee-fault-code и X-Apigee-fault-source:

    Заголовки ответов Ценить
    X-Apigee-код неисправности protocol.http.Response405WithoutAllowHeader
    X-Apigee-источник-ошибки MP

    Источник разлома X-Apigee также может иметь ценность target .

Причина: неподдерживаемая кодировка в запросе.

Диагностика

  1. Определите код ошибки и источник ошибки , наблюдаемой с помощью мониторинга API или журналов доступа NGINX, как описано в разделе «Общие шаги диагностики» .
  2. Если код ошибкиprotocol.http.UnsupportedEncoding , а источник ошибки имеет значение apigee или MP , это означает, что запрос, отправленный клиентским приложением, содержит неподдерживаемую кодировку в заголовке запроса Content-Encoding .
  3. Определить значение неподдерживаемой кодировки, переданной в составе HTTP-запроса, можно одним из следующих методов:

    Сообщение об ошибке

    Используя сообщение об ошибке:
    1. Если у вас есть доступ к полному сообщению об ошибке, полученному от Apigee Edge, обратитесь к faultstring . faultstring содержит значение неподдерживаемой конечной кодировки.

      Пример сообщения об ошибке:

      "faultstring":"Unsupported Encoding \"UTF-8\""
    2. Обратите внимание, что в приведенном выше сообщении об ошибке значение неподдерживаемой кодировки — “UTF-8” как видно из faultstring .

      Поскольку “UTF-8” не является поддерживаемой кодировкой в ​​Apigee Edge, этот запрос завершается с ошибкой 415 Unsupported Media Type с кодом ошибки: protocol.http.UnsupportedEncoding .

    Фактический запрос

    Используя фактический запрос:
    1. Если у вас нет доступа к фактическому запросу, сделанному клиентским приложением, перейдите к разделу «Разрешение» .
    2. Если у вас есть доступ к фактическому запросу, сделанному клиентским приложением, выполните следующие действия:
      1. Определите значение, передаваемое в заголовок запроса Content-Encoding.
      2. Если значение, переданное в заголовок запроса Content-Encoding не является одним из значений, перечисленных в разделе «Поддерживаемая кодировка» , то это и есть причина данной ошибки.

        Пример запроса:

        curl -v "https://HOSTALIAS/v1/testgzip" -H "Content-Encoding: UTF-8" -X POST -d @request_payload.gz

        Приведенный выше пример запроса отправляет значение "UTF-8" в заголовок Content- Encoding , который не является поддерживаемой кодировкой в ​​Apigee Edge. Таким образом, этот запрос завершается с ошибкой 415 Unsupported Media Type с кодом ошибки: protocol.http.UnsupportedEncoding .

Разрешение

  1. См. список кодировок, поддерживаемых Apigee, в разделе «Поддерживаемые кодировки» .
  2. Убедитесь, что клиентское приложение всегда отправляет следующее:
    • Только поддерживаемая кодировка в качестве значения заголовка Content-Encoding в запросе.
    • Полезная нагрузка запроса в поддерживаемом формате для Apigee Edge и соответствует формату, указанному в заголовке Content-Encoding .
  3. В приведенном выше примере полезные данные запроса имеют расширение gz , которое указывает, что содержимое должно быть gzip . Вы можете решить эту проблему, отправив заголовок запроса как Content-Encoding: gzip и полезные данные запроса в формате gzip :

    curl -v "https://HOSTALIAS/v1/testgzip" -H "Content-Encoding: gzip" -X POST -d @request_payload.gz
    

Причина: неподдерживаемая кодировка в ответе.

Диагностика

  1. Определите код ошибки и источник ошибки , наблюдаемой с помощью мониторинга API, инструмента трассировки или журналов доступа NGINX, как описано в разделе «Общие шаги диагностики» .
  2. Если источник сбоя имеет значение target , это означает, что ответ, отправленный внутренним сервером, содержит неподдерживаемую кодировку в заголовке Content-Encoding .
  3. Вы можете определить значение неподдерживаемой кодировки, переданной как часть ответа HTTP от внутреннего сервера, используя один из следующих методов:

    Сообщение об ошибке

    Используя сообщение об ошибке:
    1. Если у вас есть доступ к полному сообщению об ошибке, полученному от Apigee Edge, обратитесь к faultstring . faultstring содержит значение неподдерживаемой кодировки.

      Пример сообщения об ошибке:

      "faultstring":"Unsupported Encoding \"UTF-8\""
    2. Обратите внимание, что в приведенном выше сообщении об ошибке значение неподдерживаемой кодировки — “UTF-8” как видно из faultstring .

      Поскольку “UTF-8” не является поддерживаемой кодировкой в ​​Apigee Edge, этот запрос завершается с ошибкой 415 Unsupported Media Type с кодом ошибки: protocol.http.UnsupportedEncoding .

    Инструмент трассировки

    Использование трассировки:
    1. Если у вас нет трассировки неудачного запроса, перейдите к разделу «Разрешение» .
    2. Если вы зафиксировали трассировку сбоя, вы можете определить неподдерживаемую кодировку, переданную внутренним сервером как часть заголовка ответа Content-Encoding , как описано в инструменте трассировки .

Разрешение

  1. См. список кодировок, поддерживаемых Apigee, в разделе «Поддерживаемая кодировка».
  2. Убедитесь, что внутренний сервер всегда отправляет следующее:
    • Только поддерживаемая кодировка в качестве значения заголовка Content-Encoding в запросе.
    • Полезные данные ответа в поддерживаемом формате для Apigee Edge и соответствуют формату, указанному в заголовке Content-Encoding .

Поддерживаемая кодировка

В следующей таблице перечислены форматы кодирования, поддерживаемые Apigee Edge:

Заголовок Кодирование Описание
Content-Encoding gzip Формат gzip Unix
deflate В этом формате используется структура zlib с алгоритмом сжатия deflate.

Спецификация

Apigee отвечает сообщением об ошибке 415 Unsupported Media Type в соответствии со следующей спецификацией RFC:

Спецификация
RFC 7231, раздел 6.5.13: 415 Неподдерживаемый тип носителя

Ключевые моменты, на которые следует обратить внимание

Обратите внимание на следующее:

  • Если Apigee возвращает ошибку 415 из-за неподдерживаемой кодировки, переданной в заголовке Content-Encoding как часть запроса API, то:
    • Вы не сможете отслеживать такие запросы.
    • Вы не сможете изменить формат или содержимое ответа об ошибке, отправленного Apigee Edge, с помощью таких политик, как RaiseFault, AssignMessage.

    Это связано с тем, что эта ошибка возникает на ранней стадии обработки сообщений, прежде чем какая-либо политика может быть выполнена.

  • Если Apigee возвращает ошибку 415 из-за неподдерживаемой кодировки, переданной в заголовке ответа от вашего внутреннего сервера, то ее необходимо исправить на внутреннем сервере, чтобы избежать этой ошибки. Пожалуйста, поработайте с вашей серверной командой, чтобы решить эту проблему.

Если вам по-прежнему нужна помощь со стороны службы поддержки Apigee Edge , перейдите к разделу «Необходимо собрать диагностическую информацию» .

Необходимо собрать диагностическую информацию

Если вам по-прежнему нужна помощь со стороны службы поддержки Apigee, соберите следующую диагностическую информацию, а затем обратитесь в службу поддержки Apigee Edge :

Если вы являетесь пользователем Public Cloud , предоставьте следующую информацию:

  • Название организации
  • Имя среды
  • Имя API-прокси
  • Полная команда curl используемая для воспроизведения ошибки 415
  • Файл трассировки запросов 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