TL; DR
概要; 送信するバイナリ(非英数字)データ(またはかなり大きなサイズのペイロード)がある場合は、を使用しますmultipart/form-data
。それ以外の場合は、を使用しますapplication/x-www-form-urlencoded
。
言及するMIMEタイプは、Content-Type
ユーザーエージェント(ブラウザ)がサポートする必要があるHTTP POSTリクエストの2つのヘッダーです。これら両方のタイプのリクエストの目的は、名前と値のペアのリストをサーバーに送信することです。送信されるデータの種類と量に応じて、いずれかの方法が他の方法よりも効率的になります。理由を理解するには、それぞれが何をしているのかを内部で確認する必要があります。
の場合application/x-www-form-urlencoded
、サーバーに送信されるHTTPメッセージの本文は基本的に1つの巨大なクエリ文字列です。名前と値のペアはアンパサンド(&
)で区切られ、名前は等号(=
)で値から区切られます。この例は次のとおりです。
MyVariableOne=ValueOne&MyVariableTwo=ValueTwo
仕様によると:
[予約済みおよび]英数字以外の文字は、「%HH」、パーセント記号、および文字のASCIIコードを表す2つの16進数で置き換えられます
つまり、値の1つに存在する英数字以外のバイトごとに、それを表すために3バイトが必要になります。大きなバイナリファイルの場合、ペイロードを3倍にすることは非常に非効率的です。
そこで登場multipart/form-data
するのが、名前と値のペアを送信するこの方法では、各ペアはMIMEメッセージで「パート」として表されます(他の回答で説明されています)。パーツは特定の文字列境界で区切られています(この境界文字列が「値」のペイロードのいずれにも出現しないように特別に選択されています)。各部分には、Content-Type
特にのような独自のMIMEヘッダーのセットContent-Disposition
があり、各部分に「名前」を付けることができます。各名前と値のペアの値の部分は、MIMEメッセージの各部分のペイロードです。値のペイロードを表す場合、MIME仕様により多くのオプションが提供されます。帯域幅を節約するために、バイナリデータのより効率的なエンコーディングを選択できます(たとえば、base 64またはrawバイナリ)。
multipart/form-data
いつも使ってみませんか?(ほとんどのWebフォームのように)短い英数字の値の場合、すべてのMIMEヘッダーを追加するオーバーヘッドは、より効率的なバイナリエンコーディングによる節約を大幅に上回ります。