500 Внутренняя ошибка сервера — BadFormData

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

Симптом

Клиентское приложение получает код состояния HTTP 500 Internal Server Error с кодом ошибки protocol.http.BadFormData в качестве ответа на вызовы API.

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

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

HTTP/1.1 500 Internal Server Error

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

{
   "fault":{
      "faultstring":"Bad Form Data",
      "detail":{
         "errorcode":"protocol.http.BadFormData"
      }
   }
}

Данные формы

Прежде чем мы углубимся в подробности устранения этой проблемы, давайте разберемся, что такое данные формы.

Данные формы — это информация, предоставляемая пользователем, обычно через форму HTML, имеющую такие элементы, как поле ввода текста, кнопка или флажок. Данные формы обычно отправляются в виде серии пар ключ-значение как часть HTTP-запросов или ответов.

Передача данных формы

  1. Тип контента: приложение/x-www-form-urlencoded
    • Если размер данных формы небольшой, данные отправляются как пары ключ-значение с помощью:

      Пример запроса с данными формы:

      curl https://HOSTALIAS/somepath -H "Content-Type: application/x-www-form-urlencoded" -d "username=abc@google.com&pasword=secret123"
      
    • Любые небуквенно-цифровые символы как в ключах, так и в значениях закодированы в процентах , то есть они представлены в виде тройки символов %HH , состоящей из знака процента, за которым следуют две шестнадцатеричные цифры, представляющие код ASCII конкретного символа.
    • Таким образом, хотя знак процента ( % ) разрешен в данных формы, он интерпретируется как начало специальной escape-последовательности. Таким образом, если данные формы должны содержать знак процента ( % ) в ключе или значении, их следует передавать как %25, что представляет собой код ASCII для символа знака процента ( % ).
  2. Тип контента: multipart/form-data

    Если вы хотите передать большие объемы двоичных данных или текста, содержащего символы, отличные от ASCII, вы можете отправить данные с Content-Type: multipart/form-data, как описано в разделе «Формы» — раздел 17.13.4.2.

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

Эта ошибка возникает тогда и только тогда, когда выполняются все следующие условия:

  1. HTTP-запрос , отправленный клиентом в Apigee Edge, содержит:
    1. Content-Type: application/x-www-form-urlencoded и
    2. Данные формы со знаком процента ( % ) или знаком процента ( % ), за которым следуют недопустимые шестнадцатеричные символы, которые не разрешены в соответствии с разделом 17.13.4.1 «Формы» .
  2. Прокси-сервер API в Apigee Edge считывает определенные параметры формы, содержащие любые символы, которые не разрешено использовать в потоке запросов, с помощью политики ExtractVariables или AssignMessage.

    Например, если данные формы содержат знак процента ( % ) как есть (без кодирования) или знак процента ( % ) за которыми следуют недопустимые шестнадцатеричные символы в ключе и/или значении, вы получаете эту ошибку.

    Вот возможные причины этой ошибки:

    Причина Описание Инструкции по устранению неполадок применимы для
    Параметры формы в запросе содержат недопустимые символы. Параметры формы, передаваемые клиентом как часть HTTP-запроса, содержат любые символы, использование которых запрещено . Пользователи Edge Public и Private Cloud

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

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

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

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

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

  3. Перейдите на страницу Анализ > Мониторинг API > Расследование .
  4. Выберите конкретный период времени, в течение которого вы наблюдали ошибки.
  5. Постройте график зависимости кода неисправности от времени .

  6. Выберите ячейку с кодом ошибки protocol.http.BadFormData , как показано ниже:

    ( просмотреть увеличенное изображение )

  7. Информация о коде неисправности protocol.http.BadFormData отображается, как показано ниже:

    ( просмотреть увеличенное изображение )

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

  9. В окне «Журналы» обратите внимание на следующие детали:
    • Код состояния: 500
    • Источник ошибки: proxy
    • Код ошибки: protocol.http.BadFormData
    • Политика ошибок: extractvariables/EV-ExtractFormParams
  10. Если источником сбоя является proxy , кодом сбоя является protocol.http.BadFormData и политика сбоя не пуста, то это указывает на то, что ошибка произошла в то время, когда конкретная политика, указанная в политике сбоя, считывала или извлекала данные формы (параметры формы), которые содержит символы, использование которых запрещено .
  11. В этом примере X-Apigee-fault-policy имеет значение extractvariables/EV- ExtractFormParams, что означает, что политика ExtractVariables с именем EV-ExtractFormParams не удалась при чтении или извлечении параметров формы.

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

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

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

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

    Обратите внимание, что в приведенном выше примере трассировки произошел сбой в политике ExtractVariables с именем EV-ExtractFormParams .

  6. Перейдите к потоку с именем Ошибка , названному в честь конкретной политики, которая потерпела неудачу:

  7. Обратите внимание на следующие значения из трассировки:

    ошибка: Bad Form Data

    состояние: PROXY_REQ_FLOW

    error.class: com.apigee.rest.framework.BadRequestException

    • Значение ошибки Bad Form Data указывает на то, что в параметрах формы были некоторые символы, использование которых запрещено .
    • Значение состояния PROXY_REQ_FLOW , что ошибка произошла в потоке запросов прокси-сервера API.
  8. Перейдите к этапу AX (записанные аналитические данные) в трассировке и щелкните его.
  9. Прокрутите вниз до раздела « Сведения о фазезаголовки ошибок» и определите значения X-Apigee-fault-code , X-Apigee-fault-source и X-Apigee-fault-policy, как показано ниже:

  10. Обратите внимание, что значения X-Apigee-fault-code и X-Apigee-fault-source — это protocol.http.BadFormData и policy соответственно, а X-Apigee-fault-policy не пуст. Это указывает на то, что ошибка произошла в то время, когда конкретная политика, указанная в X-Apigee-fault-policy, считывала или извлекала данные формы (параметры формы), которые содержали символы, использование которых запрещено .

    Заголовки ответов Ценить
    X-Apigee-код неисправности protocol.http.BadFormData
    X-Apigee-источник-ошибки policy
    Политика X-Apigee-fault extractvariables/EV-ExtractFormParams
  11. В этом примере X-Apigee-fault-policy имеет значение extractvariables/EV- ExtractFormParams, что означает, что политика ExtractVariables с именем EV-ExtractFormParams не удалась при чтении или извлечении параметров формы.

НГИНКС

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

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

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

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

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

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

    Заголовки Ценить
    X-Apigee-код неисправности protocol.http.BadFormData
    X-Apigee-источник-ошибки policy
    Политика X-Apigee-fault extractvariables/EV-ExtractFormParams
  5. Обратите внимание, что значения X-Apigee-fault-code , X-Apigee-fault-source — это protocol.http.BadFormData , policy соответственно, и X-Apigee-fault-policy не пуст. Это указывает на то, что ошибка произошла в то время, когда конкретная политика, указанная в X-Apigee-fault-policy, читала или извлекала данные формы (параметры формы), которые содержали символы, использование которых запрещено .
  6. В этом примере политика X-Apigee-fault — это extractvariables/EV- ExtractFormParams, что означает, что политика ExtractVariables с именем EV-ExtractFormParams не удалась при чтении параметров формы.

Причина: параметры формы в запросе содержат недопустимые символы.

Диагностика

  1. Определите код ошибки , источник ошибки и политику ошибок для 500 Internal Server Error с помощью мониторинга API, инструмента трассировки или журналов доступа NGINX, как описано в разделе «Общие шаги диагностики» .
  2. Если код ошибкиprotocol.http.BadFormData , источник сбоя имеет значение proxy или policy , а политика сбоя не пуста , это указывает на то, что политика, указанная в политике сбоя, не удалась при чтении или извлечении данных формы (параметров формы).
  3. Изучите политику, указанную в Политике ошибок , и определите следующую информацию:
    1. Источник: Определите, читает ли политика или извлекает данные из запроса или ответа.
    2. Параметры формы. Определите конкретные параметры формы, которые считываются в политике.

      Образец №1

      Пример № 1. Политика ExtractVariables, извлекающая параметры формы:

            <ExtractVariables name="EV-ExtractFormParms">
               <DisplayName>EV-ExtractFormParams</DisplayName>
               <Source>request</Source>
               <FormParam name="username">
                  <Pattern ignoreCase="false">{username}</Pattern>
               </FormParam>
               <FormParam name="password">
                 <Pattern ignoreCase="false">{password}</Pattern>
               </FormParam>
               <VariablePrefix>forminfo</VariablePrefix>
             <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables>
            </ExtractVariables>
            

      В приведенной выше политике ExtractVariables:

      • Источник: request

        На это указывает элемент <Source> .

      • Параметры формы: username и password

        На это указывает элемент <Pattern> внутри элемента <FormParam>

      Это означает, что username и/или password формы, переданные клиентом в HTTP-запросе к Apigee Edge, содержат символы, использование которых запрещено .

      Образец №2

      Пример №2: Параметры формы копирования политики AssignMessage:

            <AssignMessage continueOnError="false" enabled="true" name="AM-CopyFormParams">
              <Copy source="request">
                <FormParams>
                  <FormParam name="username"/>
                  <FormParam name="password"/>
                </FormParams>
              </Copy>
              <AssignTo createNew="true" transport="http" type="request"/>
            </AssignMessage>
            

      В приведенной выше политике ExtractVariables:

      • Источник: request

        На это указывает атрибут source в элементе <Copy>

      • Параметры формы: username и password

        На это указывает атрибут name в элементе <FormParam>

      Это означает, что username или password (или оба параметра формы), передаваемые клиентом в Apigee Edge как часть HTTP-запроса, содержат любые символы, использование которых запрещено .

  4. Проверьте, есть ли в параметрах формы, определенных на шаге 3, символы, использование которых запрещено, одним из следующих способов:

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

    Чтобы проверить с помощью инструмента «Трассировка»:

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

        ( просмотреть увеличенное изображение )

      3. Обратите внимание, что в приведенном выше примере password параметра формы содержит знак процента ( % ).
      4. Поскольку знак процента ( % ) также используется для кодирования специальных символов в процентах , его нельзя использовать в данных формы как есть.
      5. Поэтому Apigee Edge отвечает 500 Internal Server Error с кодом ошибки protocol.http.BadFormData .

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

    Чтобы подтвердить использование фактического запроса:

    1. Если у вас нет доступа к фактическому запросу, отправленному на целевой сервер, перейдите к разделу «Разрешение» .
    2. Если у вас есть доступ к фактическому запросу, сделанному к Apigee Edge, выполните следующие действия:
      1. Просмотрите содержимое данных формы и проверьте, содержит ли оно какие-либо символы, использование которых запрещено , например знак процента ( % ) или знак процента ( % ). за которыми следуют недопустимые шестнадцатеричные символы.

        Образец №1

        Пример запроса № 1: данные формы как часть запроса

        curl -X GET "https://HOSTALIAS/myproxy -H "Content-Type: application/x-www-form-urlencoded" -d "client_id=123456abc123&client_secret=c23578%ZY"
        

        Обратите внимание, что в этом примере элемент client_secret содержит знак процента ( % ), за которым следуют недопустимые шестнадцатеричные символы ZY .

        Образец №2

        Пример запроса № 2. Данные формы передаются в файле:

        curl -X GET "https://HOSTALIAS/myproxy -H "Content-Type: application/x-www-form-urlencoded" -d @form_data.xml
        

        Содержимое form_data.xml:

        xml=<user><username>abc1234@google.com</username><password>qwerty12345!@#$%</password></user>

        В этом примере обратите внимание, что password элемента password содержит знак процента ( % ), который не следует передавать в данных формы как есть.

    3. В двух приведенных выше примерах данные формы, отправленные как часть HTTP-запроса к Apigee Edge, содержат символы, использование которых запрещено .
    4. Поэтому Apigee Edge отвечает 500 Internal Server Error с кодом ошибки protocol.http.BadFormData .

Разрешение

  1. Убедитесь, что любые специальные символы как в ключах, так и в значениях данных или параметров формы, отправляемых клиентом как часть HTTP-запроса, всегда закодированы, как описано в разделе «Данные формы — application/x-www-form-urlencoded» .
  2. В примерах, рассмотренных выше, вы можете исправить проблемы следующим образом:

    Образец №1

    Пример № 1. Данные формы, передаваемые как часть запроса:

    Используйте допустимые шестнадцатеричные символы , соответствующие коду ASCII для определенного символа. Например, если вы хотите отправить знак доллара ( $ ), используйте %24 , как показано ниже:

    curl -X GET "https://HOSTALIAS/myproxy -H "Content-Type: application/x-www-form-urlencoded" -d "client_id=123456abc123&client_secret=c23578%24"
    

    Образец №2

    Пример запроса № 2. Данные формы передаются в файле:

    curl -X GET "https://HOSTALIAS/myproxy -H "Content-Type: application/x-www-form-urlencoded" -d @form_data.xml
    

    Содержимое form_data.xml:

    Используйте процентную кодировку для знака процента ( % ), то есть измените файл так, чтобы он имел %25 как показано ниже:

    xml=<user><username>abc1234@google.com</username><password>qwerty12345!!@#$%25</password></user>

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

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

Спецификация
Данные формы — application/x-www-form-urlencoded

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

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

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

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

  • Название организации
  • Имя среды
  • Имя прокси API
  • Полная команда curl , используемая для воспроизведения 500 Internal Server Error с кодом ошибки protocol.http.BadFormData
  • Файл трассировки запросов 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

Ссылки