JSONの正しいContent-Typeは「application/json」!MIMEタイプの基本とヘッダー指定方法を解説
インターネット上で使われるすべてのリソースには、「メディアタイプ(MIMEタイプ)」と呼ばれる種別情報が割り当てられています。MIMEは「Multipurpose Internet Mail Extension(多目的インターネットメール拡張)」の略で、サーバーとクライアント間の通信において欠かせない情報です。
ブラウザーは、送られてきたリソースのメディアタイプを把握することで、その内容を適切に処理できます。同様に、サーバー側も受信したデータの種類を知ることで、正確な解析と処理が可能になります。
Content-Typeはどこで宣言される?
リソースのメディアタイプは、クライアントがサーバーにリクエストを送る際にはリクエストヘッダーのContent-Typeフィールドに、サーバーがレスポンスを返す際にはレスポンスヘッダーのContent-Typeフィールドに、それぞれ宣言されます。
明示的にコンテンツタイプを宣言しなかった場合、クライアント側が自動判別を試みることもありますが、その結果は必ずしも正確とは限りません。だからこそ、明示的に宣言することが重要なのです。
メディアタイプの主なカテゴリー
メディアタイプにはさまざまな形式があり、以下のようなカテゴリーに分類されています。
- application
- audio
- font
- example
- image
- message
- model
- multipart
- text
- video
各カテゴリーにはさらに個別のタイプが存在します。たとえば、application/jsonはapplicationカテゴリーの一種であり、text/htmlはtextカテゴリーの一種です。
メディアタイプの完全な一覧は、IANA(Internet Assigned Numbers Authority:インターネット上の重要な要素を管理・調整する機関)のメディアタイプレジストリで確認できます。
これらのタイプは、テキスト、音声、画像、HTMLなど、インターネット全体で利用される多様なデータ形式を幅広くカバーしています。
ブラウザーがリソースのメディアタイプを知る必要がある理由
前述のとおり、ブラウザーは受け取ったコンテンツの種類を把握している必要があります。ここで具体例を見てみましょう。
次のコードは、HTMLファイルを配信するNode.jsサーバーの例です。
const http = require("http");
const fs = require("fs");
const path = require("path");
const server = http.createServer(function (req, res) {
const filePath = path.join(__dirname, "index.html");
var stat = fs.statSync(filePath);
res.writeHead(200, {
"Content-Type": "text/css",
"Content-Length": stat.size,
});
const readStream = fs.createReadStream(filePath);
readStream.pipe(res);
});
server.listen(5000);
console.log("Node.js web server at port 5000 is running..");
コードの細部は気にしなくて構いません。注目すべきは、配信しているのがindex.htmlファイルであるにもかかわらず、Content-Typeがtext/cssに設定されているという点です。
index.htmlの中身は次のとおりです。
<h1>Homepage</h1>
当然ながら、HTMLドキュメントとCSSファイルは別物です。サーバーを起動してlocalhost:5000にアクセスすると、結果は次のようになります。

DevToolsのネットワークタブでヘッダーを確認すれば、実際に受け取ったレスポンスの内容も確認できます。Chromeでの表示例はこちらです。

ブラウザーはこのコンテンツをCSSタイプとして受け取ったため、それをCSSとして扱おうとしたのです。
また、ブラウザーが受け取るコンテンツの種類を正確に把握していれば、そのデータに応じたセキュリティ基準を適用できるため、セキュリティ脆弱性の低減にもつながります。
MIMEタイプの概念とその重要性が理解できたところで、いよいよJSONについて見ていきましょう。
JSONに適切なContent-Type
JSONを適切に活用するには、ブラウザーがそれを正しく解釈できることが前提となります。かつてJSONにはtext/plainが使われることもありましたが、IANAによれば、JSONの公式MIMEタイプはapplication/jsonです。
つまり、サーバーへJSONを送信する場合も、サーバーからJSONを受信する場合も、ヘッダーのContent-Typeは必ずapplication/jsonと宣言すべきです。これこそが、クライアントとサーバーの双方が共通して理解する標準規格だからです。
まとめ
これまで述べたように、サーバー側(ブラウザーと同様)も、POSTリクエストなどで送られてくるデータの種類を知る必要があります。ファイルを含むフォームにenctype="multipart/form-data"属性が指定されるのは、まさにこのためです。
この方法でリクエストをエンコードしなければ、POSTリクエストは正しく機能しません。また、サーバーは受信データの種類を把握することで、初めてエンコード済みデータの解析方法を判断できます。
本記事では、MIMEタイプとは何か、そしてその目的について解説しました。あわせて、JSONの公式Content-Typeについても触れました。インターネット上でリソースをやり取りする際に、リソースタイプの宣言がなぜ重要なのか、ご理解いただけたなら幸いです。
-
Nextcloudサーバーに導入したいおすすめアプリ5選
```html クラウドストレージの選択肢は数多くあります。Dropbox、OneDrive、Google Driveなどがその代表例です。しかし、データをもっと自分の手で管理したいと考える方も多いはずです。Nextcloudなら、自分のサーバーにインストールでき、必要に応じてエンドツーエンド暗号化を有効にすることも可能です。 Nextcloud単体でも十分に優秀ですが、アプリを追加することでさらに便利になります。Nextcloudのアプリは、サーバーにさまざまな機能を追加できるのが大きな魅力です。一部のアプリはデフォルトでインストール・有効化されていますが、自分でインストールが必要なものも
-
Ping(ピング)とは何か?名前の由来からインターネットへの影響まで徹底解説
長年ウェブを利用している方や、マルチプレイゲームが好きな方なら、「Ping(ピング)」という言葉を目にしたことがあるでしょう。「Pingの数値は低いほど通信環境が良い」ということはご存じかもしれません。では、Pingとは一体何なのでしょうか?コンピューターの世界でどのような意味を持ち、なぜこのような奇妙な名前が付けられたのでしょうか?Pingという名前の由来Pingは頭字語(アクロニム)だとする説もあり、「Packet Internet or Inter-Network Groper」の略だと言う人もいます。しかし、これを裏付ける確かな根拠は存在しません。多くの人が一致して認めているのは、その