Вы просматриваете документацию 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-запросов или ответов.
Передача данных формы
- Тип контента: приложение/x-www-form-urlencoded
- Если размер данных формы небольшой, данные отправляются как пары ключ-значение с помощью:
- Символы в обеих клавишах закодированы в соответствии с правилами, описанными в разделе «Формы» — раздел 17.13.4.1.
-
Content-Type: application/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 для символа знака процента (%).
- Если размер данных формы небольшой, данные отправляются как пары ключ-значение с помощью:
- Тип контента: multipart/form-data
Если вы хотите передать большие объемы двоичных данных или текста, содержащего символы, отличные от ASCII, вы можете отправить данные с
Content-Type:multipart/form-data, как описано в разделе «Формы» — раздел 17.13.4.2.
Возможные причины
Эта ошибка возникает тогда и только тогда, когда выполняются все следующие условия:
- HTTP-запрос , отправленный клиентом в Apigee Edge, содержит:
-
Content-Type: application/x-www-form-urlencodedи - Данные формы со знаком процента (
%) или знаком процента (%), за которым следуют недопустимые шестнадцатеричные символы, которые не разрешены в соответствии с разделом 17.13.4.1 «Формы» .
-
Прокси-сервер API в Apigee Edge считывает определенные параметры формы, содержащие любые символы, которые не разрешено использовать в потоке запросов, с помощью политики ExtractVariables или AssignMessage.
Например, если данные формы содержат знак процента (
%) как есть (без кодирования) или знак процента (%) за которыми следуют недопустимые шестнадцатеричные символы в ключе и/или значении, вы получаете эту ошибку.Вот возможные причины этой ошибки:
Причина Описание Инструкции по устранению неполадок применимы для Параметры формы в запросе содержат недопустимые символы. Параметры формы, передаваемые клиентом как часть HTTP-запроса, содержат любые символы, использование которых запрещено . Пользователи Edge Public и Private Cloud
Общие этапы диагностики
Для диагностики этой ошибки используйте один из следующих инструментов/методов:
API-мониторинг
Чтобы диагностировать ошибку с помощью мониторинга API:
- Войдите в пользовательский интерфейс Apigee Edge как пользователь с соответствующей ролью .
Переключитесь на организацию, в которой вы хотите разобраться в проблеме.

- Перейдите на страницу Анализ > Мониторинг API > Расследование .
- Выберите конкретный период времени, в течение которого вы наблюдали ошибки.
Постройте график зависимости кода неисправности от времени .
Выберите ячейку с кодом ошибки
protocol.http.BadFormData, как показано ниже:( просмотреть увеличенное изображение )

Информация о коде неисправности
protocol.http.BadFormDataотображается, как показано ниже:( просмотреть увеличенное изображение )

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

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

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

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

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

Обратите внимание, что значения X-Apigee-fault-code и X-Apigee-fault-source — это
protocol.http.BadFormDataиpolicyсоответственно, а X-Apigee-fault-policy не пуст. Это указывает на то, что ошибка произошла в то время, когда конкретная политика, указанная в X-Apigee-fault-policy, считывала или извлекала данные формы (параметры формы), которые содержали символы, использование которых запрещено .Заголовки ответов Ценить X-Apigee-код неисправности protocol.http.BadFormDataX-Apigee-источник-ошибки policyПолитика X-Apigee-fault extractvariables/EV-ExtractFormParams- В этом примере X-Apigee-fault-policy имеет значение
extractvariables/EV- ExtractFormParams,что означает, что политика ExtractVariables с именемEV-ExtractFormParamsне удалась при чтении или извлечении параметров формы.
НГИНКС
Чтобы диагностировать ошибку с помощью журналов доступа NGINX:
- Если вы являетесь пользователем частного облака , вы можете использовать журналы доступа NGINX для определения ключевой информации о
500 Internal Server Error. Проверьте журналы доступа NGINX:
/opt/apigee/var/log/edge-router/nginx/ ORG ~ ENV . PORT# _access_log- Выполните поиск, чтобы узнать, есть ли какие-либо ошибки
500с кодом ошибкиprotocol.http.BadFormDataв течение определенного периода времени (если проблема возникла в прошлом) или есть ли какие-либо запросы, которые по-прежнему не выполняются с500. Если вы обнаружите какие-либо
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.BadFormDataX-Apigee-источник-ошибки policyПолитика X-Apigee-fault extractvariables/EV-ExtractFormParams- Обратите внимание, что значения X-Apigee-fault-code , X-Apigee-fault-source — это
protocol.http.BadFormData,policyсоответственно, и X-Apigee-fault-policy не пуст. Это указывает на то, что ошибка произошла в то время, когда конкретная политика, указанная в X-Apigee-fault-policy, читала или извлекала данные формы (параметры формы), которые содержали символы, использование которых запрещено . - В этом примере политика X-Apigee-fault — это
extractvariables/EV- ExtractFormParams,что означает, что политика ExtractVariables с именемEV-ExtractFormParamsне удалась при чтении параметров формы.
Причина: параметры формы в запросе содержат недопустимые символы.
Диагностика
- Определите код ошибки , источник ошибки и политику ошибок для
500 Internal Server Errorс помощью мониторинга API, инструмента трассировки или журналов доступа NGINX, как описано в разделе «Общие шаги диагностики» . - Если код ошибки —
protocol.http.BadFormData, источник сбоя имеет значениеproxyилиpolicy, а политика сбоя не пуста , это указывает на то, что политика, указанная в политике сбоя, не удалась при чтении или извлечении данных формы (параметров формы). - Изучите политику, указанную в Политике ошибок , и определите следующую информацию:
- Источник: Определите, читает ли политика или извлекает данные из запроса или ответа.
- Параметры формы. Определите конкретные параметры формы, которые считываются в политике.
Образец №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-запроса, содержат любые символы, использование которых запрещено .
Проверьте, есть ли в параметрах формы, определенных на шаге 3, символы, использование которых запрещено, одним из следующих способов:
Инструмент трассировки
Чтобы проверить с помощью инструмента «Трассировка»:
- Если вы записали трассировку неудачного запроса, как описано в разделе «Общие шаги диагностики» , выберите один из неудачных запросов.
- Если вы определили, что параметры формы, содержащие любые символы, которые нельзя использовать, являются частью HTTP-запроса на шаге 3 выше, то
- Перейдите к этапу «Запрос получен от клиента» .
Прокрутите вниз до раздела «Сведения о этапе» и просмотрите содержимое запроса .
( просмотреть увеличенное изображение )

- Обратите внимание, что в приведенном выше примере
passwordпараметра формы содержит знак процента (%). - Поскольку знак процента (
%) также используется для кодирования специальных символов в процентах , его нельзя использовать в данных формы как есть. - Поэтому Apigee Edge отвечает
500 Internal Server Errorс кодом ошибкиprotocol.http.BadFormData.
Фактический запрос
Чтобы подтвердить использование фактического запроса:
- Если у вас нет доступа к фактическому запросу, отправленному на целевой сервер, перейдите к разделу «Разрешение» .
- Если у вас есть доступ к фактическому запросу, сделанному к Apigee Edge, выполните следующие действия:
- Просмотрите содержимое данных формы и проверьте, содержит ли оно какие-либо символы, использование которых запрещено , например знак процента (
%) или знак процента (%). за которыми следуют недопустимые шестнадцатеричные символы.Образец №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содержит знак процента (%), который не следует передавать в данных формы как есть.
- Просмотрите содержимое данных формы и проверьте, содержит ли оно какие-либо символы, использование которых запрещено , например знак процента (
- В двух приведенных выше примерах данные формы, отправленные как часть HTTP-запроса к Apigee Edge, содержат символы, использование которых запрещено .
- Поэтому Apigee Edge отвечает
500 Internal Server Errorс кодом ошибкиprotocol.http.BadFormData.
Разрешение
- Убедитесь, что любые специальные символы как в ключах, так и в значениях данных или параметров формы, отправляемых клиентом как часть HTTP-запроса, всегда закодированы, как описано в разделе «Данные формы — application/x-www-form-urlencoded» .
- В примерах, рассмотренных выше, вы можете исправить проблемы следующим образом:
Образец №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