Webフォームからサーバーにデータを送信する場合、form-dataを利用することが多くなります。form-dataでデータを送信する場合、時にはContent-typeを指定する必要があります。本文では、form-dataのContent-typeは何かを詳しく解説した上、form-dataのContent-typeを指定したままでリクエストを送信する方法も一緒に紹介していきたいと思います。
form-dataとContent-typeについて
form-dataのContent-typeは何か?form-dataのContent-typeを指定するにはどうしたらいいですか?または、どのような時に指定する必要があるのかといった質問を解明するため、まずは、form-dataとContent-typeを理解する必要があると思います。
form-dataとは
form-dataとは、Webフォームから送信されるデータの形式の1つです。具体的には、フォームに入力された値をnameと値のペアでエンコードし、Content-Typeヘッダをmultipart/form-dataに設定して送信する形式です。form-dataの主な特徴は次のようなものがあります:
- テキストだけでなくファイルも送信できる
- 送信データをパートに分割して送信できる
- 各パートにコンテンツタイプを指定できる
フォームにファイルアップロードの項目がある場合や、添付ファイルを送信したい場合に利用されます。HTMLのformタグのenctype属性にmultipart/form-dataを指定することで、この形式で送信できます。最近のWebアプリケーションフレームワークでは、フォームからのファイルアップロードを扱う場合、自動的にform-data形式での送信をサポートしていることが多いです。
Content-typeとは
Content-TypeはHTTPヘッダの1つで、クライアントとサーバーの間で送受信されるデータの内容型、フォーマット、文字エンコーディングなどを指定するために使用されます。
Content-Typeを指定することで、クライアント・サーバ間で適切にデータを扱うことができます。例えばテキストデータを画像として解釈しようとするとエラーになりますが、Content-Typeで種類を正しく伝えることでそれを防げます。

そこで、もしform-dataにあるパラメータのデータフォーマットを指定する必要がある場合は、常にform-dataのパラメータのContent-typeを個別に設定する必要があります。
Web APIとform-dataのContent-typeについて
form-dataを利用する場面として、Web APIでのデータ送信が最も一般的だと言えます。その理由は次のようになります:
- Web APIではJSONやXMLなどのフォーマットでデータを扱うことが多いですが、ファイルの送信が必要な場合にform-dataが利用される
- JavaScriptのFetch APIやAxiosなどのライブラリを使用する場合、multipart/form-data形式でファイルを含むデータを送信するのが簡単
- バックエンド言語の多くが、HTTPリクエストのform-dataのパースをライブラリなどでサポートしている
- 画像アップロードやファイル添付の機能をWeb APIで実装する際に、form-dataを使うのが自然
そこで、Web APIにおいてファイル送信が必要な場合、form-dataを利用するのが一般的なパターンと言えます。ただし、Webサイトのフォーム送信などでも、ファイルアップロードを伴う場合にはform-dataが利用されます。
form-dataパラメータのContent-typeを個別に設定する必要がある?
結論から意というと、フォームデータをform-data形式で送信する際に、各パラメータのContent-Typeを必ず指定する必要があるケースはほとんどありません。各パラメータのContent-Typeは一般的には、自動的に扱われています:
- テキスト入力: 空
- ファイル入力: アップロードされたファイルのMIMEタイプ (image/jpeg 等)
- その他のデータ: サーバ側で推測
したがって、特別な場合を除き、個々のパラメータのContent-Typeを設定する必要はありません。基本的にはテキストで何でもかんでも書くことができますね、その内容のデータフォーマットをサーバー側から判断しています。ただし、サーバーがそのデータフォーマットを判断することができない場合、ご入力のデータのフォーマットをさらに定義することにより、サーバー側がリクエストをより効率的に扱うことができるようになります。
そこで、一部の場合、Content-Typeの設定が必要になるケースもあります:
- データフォーマットが不明確な場合(JSON、XML等)
- バイナリデータをBase64エンコードして送信する場合
- サーバ側でのパース処理を最適化したい場合
- サーバー側が要求のform-dataのContent-Typeを明確に定義する場合
などが考えられます。
form-dataパラメータのContent-typeを定義したままでリクエストを送信
上記の内容で述べていたように、ほとんどの場合ではそれでは、個々のパラメータのContent-Typeを設定する必要はありませんが、一部特別な場合はそれを定義したままでデータをサーバー側に送信する必要もあります。それでは、form-dataパラメータのContent-typeを定義したままでAPIリクエストを送信するには、どうしたらいいですか?
Apidogは、それを簡単に実現できます。Apidogは一番使いやすいAPIクライアントツールとして、APIテスト時に、簡単にHTTPボディを利用して、データを送信する必要があります。multipart/form-dataを利用する場合、各パラメータのContent-typeを指定したままでリクエストを送信することもできるので、非常に便利です。

上記画像のように、APIリクエストを送信する際、Bodyタブに切り替え、「form-data」でデータを記述する場合、各パラメータのContent-typeを指定することができます。
まとめ
form-dataは、Webフォームからファイル添付を含むデータを送信するためのフォーマットです。form-dataを利用する場合、そのContent-Typeはデフォルトでmultipart/form-dataになります。 通常、form-dataで送信する個々のパラメータのContent-Typeを明示的に指定する必要はありません。フォームの入力値は自動的に判断されるため、個別に設定する必要はほとんどありません。
ただし、データのフォーマットが不明確な場合や、サーバー側でのパース処理を最適化したい場合など、特別な目的でパラメータのContent-Typeを設定することが考えられます。
ApidogのようなAPIテストツールを利用すれば、簡単にパラメータのContent-Typeを指定した状態でリクエストを送信することができます。ほとんどの場合は設定の必要はないものの、特殊なデータ送信の際にはパラメータのContent-Typeを定義することで、サーバー側の処理を最適化できる場合があります。