Вы просматриваете документацию Apigee Edge .
Перейдите в документацию Apigee X.info
Симптом
В ответ на вызовы API клиентское приложение получает HTTP-статус 500 Internal Server Error с кодом ошибки protocol.http.BadFormData .
Сообщение об ошибке
Клиентское приложение получает следующий код ответа:
HTTP/1.1 500 Internal Server Error
Кроме того, вы можете увидеть следующее сообщение об ошибке:
{
"fault":{
"faultstring":"Bad Form Data",
"detail":{
"errorcode":"protocol.http.BadFormData"
}
}
}Данные формы
Прежде чем перейти к подробному описанию устранения этой проблемы, давайте разберемся, что такое данные формы.
Данные формы — это информация, предоставляемая пользователем, как правило, через HTML-форму, содержащую такие элементы, как текстовое поле ввода, кнопка или флажок. Данные формы обычно передаются в виде последовательности пар «ключ-значение» в рамках HTTP-запросов или ответов.
Передача данных формы
- Content-Type: application/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-код конкретного символа. - Таким образом, хотя знак процента (
%) допускается в данных формы, он интерпретируется как начало специальной управляющей последовательности. Следовательно, если данные формы должны содержать знак процента (%) в ключе или значении, то его следует передавать как%25,что представляет собой ASCII-код символа процента (%).
- Если размер данных формы невелик, то данные отправляются в виде пар ключ-значение следующим образом:
- Content-Type: multipart/form-data
Если вам необходимо передать большие объемы двоичных данных или текста, содержащего символы, отличные от ASCII, вы можете отправить данные с
Content-Type:multipart/form-data, как описано в разделе 17.13.4.2 «Формы».
Возможные причины
Эта ошибка возникает только в том случае, если выполняются все следующие условия:
- HTTP-запрос, отправленный клиентом в Apigee Edge, содержит:
-
Content-Type: application/x-www-form-urlencoded, and - В полях данных должен быть указан знак процента (
%) или знак процента (%), за которым следуют недопустимые шестнадцатеричные символы, запрещенные в соответствии с разделом 17.13.4.1 «Формы» .
-
API-прокси в Apigee Edge считывает определенные параметры формы, содержащие любые символы, которые не разрешено использовать в потоке запроса, используя политику ExtractVariables или AssignMessage.
Например, если данные формы содержат знак процента (
%) в исходном виде (без кодирования) или знак процента (%) Если в ключе и/или значении присутствуют недопустимые шестнадцатеричные символы, вы получите эту ошибку.Вот возможные причины этой ошибки:
Причина Описание Инструкции по устранению неполадок, применимые для В параметрах формы запроса содержатся недопустимые символы. Параметры формы, передаваемые клиентом в составе HTTP-запроса, содержат любые символы, использование которых запрещено . Пользователи публичных и частных облачных сервисов на периферии сети
Общие этапы диагностики
Для диагностики этой ошибки воспользуйтесь одним из следующих инструментов/методов:
Мониторинг 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.Перейдите к потоку с именем Error после указания конкретной политики, которая не сработала:

- Обратите внимание на следующие значения из трассировки:
Ошибка:
Bad Form Dataсостояние:
PROXY_REQ_FLOWerror.class:
com.apigee.rest.framework.BadRequestException- Ошибка
Bad Form Dataуказывает на то, что параметры формы содержат символы, использование которых недопустимо . - Значение состояния
PROXY_REQ_FLOW ,указывает на то, что ошибка произошла в потоке запросов API-прокси.
- Ошибка
- Перейдите к этапу AX (Analytics Data Recorded) в трассировке и щелкните по нему.
Прокрутите вниз до раздела «Подробности этапа — Заголовки ошибок» и определите значения параметров 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-fault-code protocol.http.BadFormDataX-Apigee-fault-source policyX-Apigee-fault-policy extractvariables/EV-ExtractFormParams- В этом примере политика X-Apigee-fault-policy имеет значение
extractvariables/EV- ExtractFormParams,что означает, что политика ExtractVariables с именемEV-ExtractFormParamsзавершилась с ошибкой при чтении или извлечении параметров формы.
NGINX
Для диагностики ошибки с помощью журналов доступа NGINX:
- Если вы используете частное облако , то можете использовать журналы доступа NGINX для получения ключевой информации об ошибке HTTP
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-code, соответствующим значениюprotocol.http.BadFormData, определите значения X-Apigee-fault-source и X-Apigee-fault-policy.Пример ошибки 500 из журнала доступа NGINX:

Приведенная выше запись из журнала доступа NGINX содержит следующие значения для X-Apigee-fault-code и X-Apigee-fault-source:
Заголовки Ценить X-Apigee-fault-code protocol.http.BadFormDataX-Apigee-fault-source policyX-Apigee-fault-policy 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-policy имеет значение
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, или оба параметра, передаваемые клиентом в составе HTTP-запроса к Apigee Edge, — содержат символы, использование которых запрещено .
Проверьте, нет ли в параметрах формы, определенных на шаге 3, каких-либо символов, использование которых запрещено , используя один из следующих методов:
инструмент трассировки
Для проверки с помощью инструмента Trace:
- Если вы получили трассировку для неудачного запроса, как описано в разделе «Общие шаги диагностики» , выберите один из неудачных запросов.
- Если вы определили, что параметры формы, содержащие какие-либо недопустимые символы, являются частью 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содержит знак%( ), который не следует передавать в данных формы в неизмененном виде.
- Проверьте содержимое данных формы и убедитесь, что оно не содержит символов, которые не разрешено использовать, таких как знак процента (
- В двух приведенных выше примерах данные формы, отправляемые в рамках 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 :
Если вы являетесь пользователем публичного облака , предоставьте следующую информацию:
- Название организации
- Название среды
- Имя 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