<ph type="x-smartling-placeholder"></ph>
現在、Apigee Edge のドキュメントが表示されています。
Apigee X のドキュメント。 詳細
症状
クライアント アプリケーションは、次の HTTP ステータス コード 500 Internal Server Error
を取得します。
API 呼び出しのレスポンスとしてエラーコード protocol.http.BadFormData
。
エラー メッセージ
クライアント アプリケーションが次のレスポンス コードを受け取ります。
HTTP/1.1 500 Internal Server Error
また、次のエラー メッセージが表示される場合があります。
{ "fault":{ "faultstring":"Bad Form Data", "detail":{ "errorcode":"protocol.http.BadFormData" } } }
フォームデータ
この問題のトラブルシューティングの詳細に入る前に、フォームデータとは何かを理解しましょう。
フォームデータとは、通常は要素を含む HTML フォームを通じてユーザーが提供する情報です。 テキスト入力ボックス、ボタン、チェックボックスなどに入力できます。フォームデータは通常、 Key-Value ペアを HTTP リクエストまたはレスポンスの一部として使用できます。
フォームデータの転送
- Content-Type: application/x-www-form-urlencoded
<ph type="x-smartling-placeholder">
- </ph>
- フォームデータのサイズが小さい場合、データは次の Key-Value ペアとして送信されます。
<ph type="x-smartling-placeholder">
- </ph>
- 両方の鍵の文字が、 <ph type="x-smartling-placeholder"></ph> フォーム - セクション 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"
- キーと値の両方に含まれる英数字以外の文字は、
<ph type="x-smartling-placeholder"></ph>
パーセント エンコードとは、文字 3 文字表記です。
パーセント記号の後に 2 桁の 16 進数が続く
%HH
特定の文字の ASCII コードを表します。 - したがって、フォームデータではパーセント記号(
%
)を使用できますが、 特別なエスケープ シーケンスの開始として解釈されます。フォームデータから キーまたは値にパーセント記号(%
)が含まれていると、送信する必要がある%25,
として、パーセント記号の ASCII コードを表します。 (%
)文字。
- フォームデータのサイズが小さい場合、データは次の Key-Value ペアとして送信されます。
<ph type="x-smartling-placeholder">
- コンテンツ タイプ: multipart/form-data
大量のバイナリデータや非 ASCII を含むテキストを送信する場合 使用してデータを
Content-Type:
multipart/form-data: <ph type="x-smartling-placeholder"></ph> フォーム - セクション 17.13.4.2
考えられる原因
このエラーは、次のすべての条件が満たされた場合にのみ発生します。
- クライアントから Apigee Edge に送信される HTTP リクエストには、次のものが含まれます。
<ph type="x-smartling-placeholder">
- </ph>
Content-Type: application/x-www-form-urlencoded
、および- パーセント記号(
%
)またはパーセント記号を含むフォームデータ (%
)の後に、許可されていない無効な 16 進数文字が続きます <ph type="x-smartling-placeholder"></ph> フォーム - セクション 17.13.4.1。
Apigee Edge の API プロキシは、任意の文字を含む特定のフォーム パラメータを読み取ります。 許可されていないリクエスト フローで ExtractVariables または AssignMessage ポリシー。
たとえば、フォームデータにパーセント記号(
%
)がそのまま含まれている場合( またはパーセント記号(%
)の後に無効な 16 進数が続きます 文字が含まれていると、このエラーが発生します。このエラーには、次の原因が考えられます。
原因 説明 トラブルシューティングの実施対象 リクエストのフォーム パラメータに使用できない文字が含まれています クライアントによって HTTP リクエストの一部として渡されるフォーム パラメータには、 使用できない文字が含まれています。 Edge Public Cloud ユーザーと Edge Private Cloud ユーザー
共通の診断手順
このエラーを診断するには、次のいずれかのツールまたは手法を使用します。
API Monitoring
<ph type="x-smartling-placeholder">API Monitoring を使用してエラーを診断するには:
- <ph type="x-smartling-placeholder"></ph> Apigee Edge UI にログインします。 適切なロールが割り当てられます。
問題を調査する組織に切り替えます。
- [Analyze] >API モニタリング >Investigate ページをご覧ください。
- エラーが発生した期間を選択します。
障害コードを Time に対してプロットします。
<ph type="x-smartling-placeholder">障害コード
protocol.http.BadFormData
を持つセルを選択します。 下に示します。(大きい画像を表示)
障害コード
protocol.http.BadFormData
に関する情報は次のとおりです。 次のように表示されます。(大きい画像を表示)
[ログを表示] をクリックし、失敗したリクエストの行を開きます。
- [ログ] ウィンドウで、次の詳細をメモします。
<ph type="x-smartling-placeholder">
- </ph>
- ステータス コード:
500
- 障害の発生元:
proxy
- 障害コード:
protocol.http.BadFormData
- 障害ポリシー:
extractvariables/EV-ExtractFormParams
- ステータス コード:
- [Fault Source] が
proxy
の場合、[Fault Code] はprotocol.http.BadFormData
と障害ポリシーが空でない場合、 エラーが発生している間、エラーが発生したことを示します。 Policy が、なんらかの情報を含むフォームデータ(フォーム パラメータ)を読み取りまたは抽出していました 使用できない文字が含まれています。 - この例では、X-Apigee-fault-policy は
extractvariables/EV- ExtractFormParams,
です。これは、次の名前の ExtractVariables ポリシーを意味します。 フォームの読み取りまたは抽出中に EV-ExtractFormParams が失敗する あります。
Trace ツール
<ph type="x-smartling-placeholder">Trace ツールを使用してエラーを診断するには:
- トレース セッションを有効にする
および次のいずれかです。
<ph type="x-smartling-placeholder">
- </ph>
500 Internal Server Error
エラーが発生するのを待つ。または- 問題を再現できる場合は、API 呼び出しを行って問題を再現してください。
500 Internal Server Error
[Show all FlowInfos] が有効になっていることを確認します。
- 失敗したリクエストのいずれかを選択し、トレースを調べます。
- トレースのさまざまなフェーズを順に確認し、障害が発生している場所を特定する 発生しました。
このエラーは通常、以下に示すいずれかのポリシーで発生します。
上記のサンプル トレースでは、ゾーン時間内で障害が発生したことに注意してください。
EV-ExtractFormParams
という名前の ExtractVariables ポリシー。失敗した特定のポリシーの後にある Error という名前のフローに移動します。
- トレースから次の値をメモします。
エラー:
Bad Form Data
状態:
PROXY_REQ_FLOW
error.class:
com.apigee.rest.framework.BadRequestException
- エラー
Bad Form Data
の値は、フォームが パラメータに使用できない文字が含まれています。 - 状態
PROXY_REQ_FLOW,
の値は、 API プロキシのリクエスト フローで発生したエラー。
- エラー
- トレースの [AX(Analytics Data Recorded)] フェーズに移動して、 できます。
[Phase Details] - [Error Headers] セクションまで下にスクロールし、 X-Apigee-fault-codeX-Apigee-fault-code、X-Apigee-fault-sourceX-Apigee-fault-code、 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.BadFormData
X-Apigee-fault-source policy
X-Apigee-fault-policy extractvariables/EV-ExtractFormParams
- この例では、X-Apigee-fault-policy は
extractvariables/EV- ExtractFormParams,
です。これは、名前を付けた ExtractVariables ポリシーを意味します。 フォームの読み取りまたは抽出中にEV-ExtractFormParams
が失敗しました あります。
NGINX
<ph type="x-smartling-placeholder">NGINX アクセスログを使用してエラーを診断するには:
- Private Cloud ユーザーは、NGINX アクセスログを使用して次のことを行えます。
HTTP
500 Internal Server Error
に関する重要な情報を確認します。 NGINX アクセスログを確認します。
<ph type="x-smartling-placeholder">/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log
- エラーコードを含む
500
エラーがないか検索します 特定の期間にprotocol.http.BadFormData
(問題が発生したり 発生した場合)や、引き続き特定のイベントで失敗するリクエストが500
。 X-Apigee-fault-code で
500
エラーが見つかった場合protocol.http.BadFormData
の値と一致する場合、 X-Apigee-fault-source の値を判別し、 X-Apigee-fault-policy.NGINX アクセスログの 500 エラーの例:
NGINX アクセスログの上記のサンプル エントリには、次の値が含まれます。 X-Apigee-fault-code と X-Apigee-fault-source:
ヘッダー 値 X-Apigee-fault-code protocol.http.BadFormData
X-Apigee-fault-source policy
X-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
に失敗しました あります。
原因: リクエストのフォーム パラメータに使用できない文字が含まれている
診断
- 説明に沿って、API Monitoring、Trace ツール、または NGINX アクセスログを使用して、
500 Internal Server Error
の障害コード、障害ソース、障害ポリシーを特定します。 一般的な診断手順をご覧ください。 - [Fault Code] が
protocol.http.BadFormData
の場合、[Fault Source] には、 値がproxy
またはpolicy
で、Fault Policy が 空, 障害ポリシー,に指定されたポリシーが失敗したことを示します。 フォームデータ(フォーム パラメータ)の読み取りや抽出を行います。 - 障害ポリシーに示されたポリシーを調べて、次のことを確認します。
含まれます
<ph type="x-smartling-placeholder">
- </ph>
- ソース: ポリシーがデータの読み取りまたは抽出を行っているかどうかを判別します。 指定することもできます。
- フォーム パラメータ: 読み取られる特定のフォーム パラメータを特定する
に関するポリシーに準拠する必要があります。
サンプル 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 で特定したフォーム パラメータで使用されている文字の数 次のいずれかの方法を使用します。
Trace ツール
Trace ツールを使用して検証するには:
- 失敗したリクエストのトレースをキャプチャした場合 一般的な診断手順] をクリックし、次のいずれかを選択します。 表示されます。
- なんらかの文字を含むフォーム パラメータが
指定された HTTP リクエストの一部として、
手順 3 を確認してから、
<ph type="x-smartling-placeholder">
- </ph>
- 「Request Received from Client」フェーズに進みます。
[Phase Details] セクションまで下にスクロールして、 コンテンツのリクエスト。
( 拡大画像を表示)
- 上記の例では、フォーム パラメータ
password
が パーセント記号(%
)が含まれます。 - パーセント記号(
%
)は <ph type="x-smartling-placeholder"></ph> パーセント エンコーディングでは、特殊文字をそのまま使用することはできません。 必要があります。 - したがって、Apigee Edge は
500 Internal Server Error
は、エラーコードに置き換えます。protocol.http.BadFormData
。
実際のリクエスト
実際のリクエストを使用して検証するには:
- ターゲット サーバーに対する実際のリクエストにアクセスできない場合は、 [解決策] に進みます。
- Apigee Edge に対して行われた実際のリクエストにアクセスできる場合は、次のコマンドを実行します。
次のとおりです。
<ph type="x-smartling-placeholder">
- </ph>
- フォームのデータの内容を確認し、
パーセント記号(
%
)などは使用できない またはパーセント記号(%
)に続く無効な文字 使用できます。サンプル 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
が、 パーセント記号(%
)とそれに続く文字列が含まれます 無効な 16 進数値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
にパーセント記号(%
)が含まれていますが、これは指定できません。 フォームデータでそのまま渡されます。
- フォームのデータの内容を確認し、
パーセント記号(
- 上記の 2 つの例では、HTTP リクエストの一部として送信されたフォームデータが、 Apigee Edge に使用できない文字が含まれています。
- したがって、Apigee Edge は
500 Internal Server Error
で応答します。 (エラーコードprotocol.http.BadFormData
)。
解決策
- フォームデータまたはパラメータのキーと値の両方に特殊文字が含まれていることを確認する によって送信される HTTP リクエストの一部として送信されると、そのメッセージは常に、で説明されているように、 Form Data - application/x-www-form-urlencoded。
- 上記の例では、次のように問題を解決できます。
サンプル 1
サンプル 1: リクエストの一部として渡されるフォームデータ:
有効な を使用してください 特定の文字の ASCII コードと一致する文字(16 進数)。 たとえば、ドル記号(
$
)を送信する場合は%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 の内容:
こちらの <ph type="x-smartling-placeholder"></ph> percent-encoding はパーセント(
%
)記号、つまりファイルを次のように変更します 次のように%25
を設定します。xml=<user><username>abc1234@google.com</username><password>qwerty12345!!@#$%25</password></user>
仕様
Apigee Edge では、フォームデータが次の仕様に従って送信されることを想定しています。
仕様 |
---|
<ph type="x-smartling-placeholder"></ph> フォームデータ - application/x-www-form-urlencoded |
Apigee サポートのサポートが必要な場合は、 診断情報をご覧ください。
診断情報の収集が必要な場合
上記の手順でも問題が解決しない場合は、以下の情報を収集します。 Apigee Edge サポートにお問い合わせください。
Public Cloud ユーザーの場合は、次の情報を提供します。
- 組織名
- 環境名
- API プロキシの名前
- 問題の再現に使用する完全な
curl
コマンド エラーコードを付加した500 Internal Server Error
protocol.http.BadFormData
- API リクエストのトレース ファイル
Private Cloud ユーザーの場合は、次の情報を提供します。
- 失敗したリクエストについて観測された完全なエラー メッセージ
- 環境名
- API プロキシ バンドル
- API リクエストのトレース ファイル
NGINX アクセスログ
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log
ここで、ORG、ENV、PORT# は、 使用します。
Message Processor システムログ
/opt/apigee/var/log/edge-message-processor/logs/system.log
参照
- <ph type="x-smartling-placeholder"></ph> フォーム コンテンツ タイプ
- <ph type="x-smartling-placeholder"></ph> RFC3986、セクション 2.1: パーセント エンコード
- <ph type="x-smartling-placeholder"></ph> パーセント エンコード
- <ph type="x-smartling-placeholder"></ph> 16 進数