インターネット
 Computer >> コンピューター >  >> ネットワーキング >> インターネット

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にアクセスすると、結果は次のようになります。

JSONの正しいContent-Typeは「application/json」!MIMEタイプの基本とヘッダー指定方法を解説

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

JSONの正しいContent-Typeは「application/json」!MIMEタイプの基本とヘッダー指定方法を解説

ブラウザーはこのコンテンツを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についても触れました。インターネット上でリソースをやり取りする際に、リソースタイプの宣言がなぜ重要なのか、ご理解いただけたなら幸いです。

  1. Nextcloudサーバーに導入したいおすすめアプリ5選

    ```html クラウドストレージの選択肢は数多くあります。Dropbox、OneDrive、Google Driveなどがその代表例です。しかし、データをもっと自分の手で管理したいと考える方も多いはずです。Nextcloudなら、自分のサーバーにインストールでき、必要に応じてエンドツーエンド暗号化を有効にすることも可能です。 Nextcloud単体でも十分に優秀ですが、アプリを追加することでさらに便利になります。Nextcloudのアプリは、サーバーにさまざまな機能を追加できるのが大きな魅力です。一部のアプリはデフォルトでインストール・有効化されていますが、自分でインストールが必要なものも

  2. Ping(ピング)とは何か?名前の由来からインターネットへの影響まで徹底解説

    長年ウェブを利用している方や、マルチプレイゲームが好きな方なら、「Ping(ピング)」という言葉を目にしたことがあるでしょう。「Pingの数値は低いほど通信環境が良い」ということはご存じかもしれません。では、Pingとは一体何なのでしょうか?コンピューターの世界でどのような意味を持ち、なぜこのような奇妙な名前が付けられたのでしょうか?Pingという名前の由来Pingは頭字語(アクロニム)だとする説もあり、「Packet Internet or Inter-Network Groper」の略だと言う人もいます。しかし、これを裏付ける確かな根拠は存在しません。多くの人が一致して認めているのは、その