4.4 メディアタイプの指定
4.4 メディアタイプの指定
HTTP のリクエスト、レスポンスにおいて送信するデータ本体の形式を指定するのにメディアタイプが利用される。
メディアタイプの記述方法は以下の通り。
トップレベルタイプ名 / サブタイプ名 [ ; パラメータ]
トップレベルタイプ名はデータ形式が大別してテキストなのか画像なのか等のカテゴリを示し、サブタイプ名が具体的なデータ形式を示す。
メディアタイプ | データ形式 |
---|---|
text/plain | プレーンテキスト |
text/html | HTML 文書 |
application/rss+xml | RSS フィード |
image/jpeg | JPEG 画像 |
image/svg+xml | SVG 画像 |
基本的には text/css
、text/html
を除き、テキストデータとして開くことが可能でも、トップレベルタイプ名は application
を利用することが多い。
4.4.1 メディアタイプを Content-Type で指定する必要性
全ての API は適切なメディアタイプをクライアントに返すべき。クライアントの多くは Content-Type の値を使ってデータ形式を判断しているため。
4.4.2 x- で始まるメディアタイプ
application/x-msgpack
のようにサブタイプが x-
で始まるものは、このメディアタイプが IANA(Internet Assigned Numbers Authority) に登録されていないことを示す。
例外的に HTML のフォームデータを送信する際に使われる application/x-www-form-urlencoded
だけは RFC1866 で明記され、IANA に登録された正式メディアタイプになっている。
4.4.3 自分でメディアタイプを定義する場合
RFC6838 において x-
で始まるメディアタイプが未登録のメディアタイプを表すものとはみなされないと明記されているため、独自メディアタイプとして x-
で始まるものを定義するべきではない。
サブタイプをその登録方法によって分類するためのカテゴリである
Registration tree を利用するべき。サブタイプの先頭に接頭辞を付けて区分する。
ツリー名 | 接頭辞 | 説明 |
---|---|---|
Standards tree (標準ツリー) | なし | IANA に登録されている一般的なデータ形式 |
Vendor tree (ベンダツリー) | vnd . | 広く利用されることを目的としているものの、特定の企業や団体が管理しているデータ形式 (Excel 等) |
Personal tree (パーソナルツリー) | prs. | 実験的な実装、あるいは公に公開されることのない製品においてのみ扱うデータ形式 |
Unregistered tree (未登録ツリー) | x. | ローカル環境等のプライベート環境のみで利用するデータ形式。ベンダツリーやパーソナルツリーで十分なため基本的には利用は推奨されていない。 |
公開 API において独自のメディアタイプを定義する場合は、基本的にはベンダツリーを利用する。フォーマットは以下の通り。
application/vnd.companyname.awesomeformat
4.4.4 JSON や XML を用いた新しいデータ形式を定義する場合
JSON や XML などの標準化されたデータ形式を使って、独自のデータ形式を定義する場合は +xml
や +json
のように用いたデータ形式を +
に続けて記述する。
メディアタイプ | データ形式 |
---|---|
application/rss+xml | RSS フィード |
application/atom+xml | Atom フィード |
4.4.5 メディアタイプとセキュリティ
正しいメディアタイプを指定していない場合、ブラウザを介した場合にセキュリティ上の問題を引き起こす可能性がある。
JSON ファイルを間違って text/html
で配信してしまった場合、その JSON ファイルの URI を直接叩いてアクセスした際に、ブラウザはデータ形式をもとに HTML として表示する。
この時 JSON 中に javascript が埋め込まれていた場合にそれが実行されてしまう。
4.4.6 リクエストデータとメディアタイプ
Accept ヘッダ
クライアントが「どのメディアタイプが受け入れ可能か」をサーバに伝えるために使われる。複数のメディアタイプを列挙でき、q(Quality Value) で優先度を指定できる。
Accept: text/html, application/xhtml+xml, application/xml;q=0.9, image/webp;1=0.8
クライアント側が欲しいデータ形式をサーバ側に伝える方法として Accept ヘッダは利用されるが、URI のクエリパラメータで指定する方法も一般的で手軽である。どちらを利用するかは議論が分かれる。