Вы просматриваете документацию 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_FLOW
error.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.BadFormData
X-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.BadFormData
X-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