[解決済み] application/x-www-form-urlencoded or multipart/form-data?
質問
HTTPでは、データをPOSTする方法は2つあります。
application/x-www-form-urlencoded
と
multipart/form-data
. ほとんどのブラウザは、ファイルをアップロードする際に
multipart/form-data
が使用されています。APIコンテキスト(ブラウザが関与しない)において、エンコードタイプの1つを使用する際の追加ガイダンスはあるのでしょうか?例えば、以下のようなものが考えられます。
- データサイズ
- 非ASCII文字の有無
- エンコードされていない)バイナリデータ上の存在
- 追加データ(ファイル名など)の転送の必要性
私は基本的に、異なるcontent-typesの使用に関する正式なガイダンスを、これまでのところウェブ上で見つけていません。
どのように解決するのですか?
TL;DR
要約;もしバイナリ(非英数字)データ(またはかなりの大きさのペイロード)を送信する場合は、次のように使用します。
multipart/form-data
. それ以外の場合は
application/x-www-form-urlencoded
.
ご指摘のMIMEタイプは、次の2つです。
Content-Type
ヘッダは、ユーザーエージェント (ブラウザ) がサポートしなければならない HTTP POST リクエストのためのものです。 これらのタイプのリクエストの目的は、どちらもサーバーに名前と値のペアのリストを送信することです。 送信されるデータの種類と量に応じて、どちらかの方法がより効率的になります。 その理由を理解するには、それぞれが隠れてやっていることを見る必要があります。
について
application/x-www-form-urlencoded
の場合、サーバーに送られる HTTP メッセージのボディは基本的に巨大なクエリ文字列です。
&
)、名前と値の間は等号で区切られます(
=
). その例としては、次のようなものがある。
MyVariableOne=ValueOne&MyVariableTwo=ValueTwo
によると 仕様 :
[予約済みおよび] 英数字以外の文字は、パーセント記号とその文字のASCIIコードを表す2桁の16進数である `%HH' で置き換えられます。
つまり、ある値の中に存在する英数字以外のバイト1つに対して、それを表現するために3バイトが必要になるということです。 大きなバイナリファイルでは、ペイロードを3倍にすることは非常に非効率的です。
そこで
multipart/form-data
が登場します。 名前と値のペアを送信するこの方法では、各ペアはMIMEメッセージの"part"として表現されます(他の回答で説明したとおりです)。 パートは特定の文字列の境界で区切られます(この境界文字列が"value"のペイロードのどれにも出現しないように特別に選択されます)。 各パートは、次のような独自のMIMEヘッダーのセットを持ちます。
Content-Type
であり、特に
Content-Disposition
それぞれの名前と値のペアの値の部分は、MIMEメッセージのそれぞれの部分のペイロードです。 MIME仕様では、値のペイロードを表現する際に、より多くのオプションを提供しています。帯域幅を節約するために、バイナリデータのより効率的なエンコーディングを選択することができます(たとえば、ベース64やraw binaryなど)。
なぜ
multipart/form-data
を常に使用するのでしょうか? 短い英数字の値(ほとんどのウェブフォームのような)については、すべてのMIMEヘッダを追加するオーバーヘッドは、より効率的なバイナリエンコーディングによる節約を大幅に上回ると思われます。
関連
-
[解決済み] リバースルーティングとは何ですか?
-
[解決済み] リソースを "アンキャッシュ" する
-
[解決済み] cURLでJSONデータをPOSTするにはどうすればよいですか?
-
[解決済み] フォーム送信のようなJavaScriptのポストリクエスト
-
[解決済み] HTTPファイルアップロードの仕組みを教えてください。
-
[解決済み] HTTPのContent-Dispositionヘッダーのファイル名パラメータをエンコードする方法は?
-
[解決済み】enctype='multipart/form-data'とはどういう意味ですか?
-
[解決済み】HTTPヘッダ(キャッシュコントロール用)を設定する方法は?)
-
[解決済み】URLのアンパサンドのエスケープについて
-
[解決済み] URLマトリックスパラメータとクエリパラメータの比較
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] 要求されたURLの長さが、このサーバーの容量制限を超えていませんか?
-
HTTPプロトコルの古典的な面接の質問と回答
-
[解決済み] HTTP POSTリクエストでは、どのようにパラメータが送信されるのですか?
-
[解決済み] Node.jsでPOSTデータを処理する方法は?
-
[解決済み] バイナリデータをJSON文字列で。Base64より優れたもの
-
[解決済み] ETagとヘッダーエクスパイアの比較
-
[解決済み】GUIDが一意でないことの簡単な証明【終了しました
-
[解決済み】Postman Chromeです。form-data、x-www-form-urlencoded、rawの違いは何ですか?
-
[解決済み】fetch apiでフォームデータを投稿するには?
-
[解決済み】投稿リクエストのサイズ制限は?