HTTPはHTML専用じゃない話
正式名称は HyperText Transfer Protocol(ハイパーテキスト転送プロトコル)。「HTTPってハイパーテキストだからHTML専用でしょ?」と思われるかもしれませんが、実は最初から汎用の転送プロトコルとして設計されていました。いまはHTTPSで暗号化され、JSONやバイナリもゴロゴロ運んでいます。そう、意外と器用なやつなんですよね。
そもそも汎用プロトコルとして生まれた 🧭
初期HTTP/0.9〜1.0はシンプルなGET/レスポンス構造でしたが、中身はMIMEで何でもOKという設計でした。「HTML配送専用」ではなかったんですね、意外と。
設計のポイント
- Content-Typeで中身を宣言する前提。text/htmlだけでなくimage/pngやapplication/jsonなど何でも載せられる。
- メソッドとヘッダーで拡張しやすい構造。後からPOST/PUT/DELETEやCache-Controlなどが追加されても破綻しにくい。
- 正式名称は HyperText Transfer Protocol。「ハイパーテキスト」という言葉が強いだけで、中身はもっと懐深いです。
- HTTPSはHTTP + TLSのセット。転送中を暗号化し、証明書で相手を確認する仕組みがデフォルトになりました。
HTML以外、いまは当たり前
実務では非HTMLコンテンツが主役になる場面が多いです。「API=HTTPでJSON」がデフォルトみたいな空気すらありますね。
よくある非HTMLコンテンツ
- JSON / XML のWeb APIやWebhook(application/json, application/xml)。
- ファイル配信(image/png, application/pdf, application/zip など)。
- ストリーミングやイベント配信(text/event-streamによるSSE、WebSocketへのUpgradeなど)。
- GraphQLやgRPC-webなど、HTTPをトランスポートにした別プロトコル風のやりとり。
柔軟に運べる仕掛け 🤝
汎用性を支えるのはヘッダーと交渉の仕組み。Content-Type/Acceptが仲介役です。
コンテンツネゴシエーション
- クライアントはAcceptで欲しいメディアタイプを提示、サーバーはContent-Typeで実際に返すタイプを宣言。
- 言語やエンコードもAccept-Language / Accept-Encodingで交渉できる。
- 「JSONがいいな」「いやHTML返すね」みたいな柔軟さがHTTPの醍醐味ですね。
メソッドとボディの自由度
- GET/HEADで取得、POSTで送信・作成、PUT/PATCH/DELETEで更新/削除と役割が分かれている。
- リクエストボディにもレスポンスボディにも任意のペイロードを積める(Content-Typeだけはちゃんと付ける)。
実務のちょいコツ 💡
「とりあえずJSON返せばいいでしょ」から一歩進んで、HTTPらしいお作法を押さえるとトラブルが減ります。
おすすめの扱い方
- Content-Type/Acceptを正しく付ける。JSONならapplication/json、バイナリは適切なMIMEを選ぶ。
- ステータスコードは標準に沿って使う(200/201/204、4xx/5xx)。独自コードは避けるか意味を文書化。
- キャッシュ制御はCache-ControlとETagで。APIでもGETのレスポンスに付けると帯域が節約できる。
- エラーもJSONで返すなら形式を決めて統一(messageとcodeなど)。
ありがちな落とし穴
- Content-Type未設定や誤設定でクライアントがパースに失敗する。
- HTML前提のミドルウェアがAPIレスポンスを書き換える(例: フォームCSRFエラーでHTMLエラーページが混入)。
- JSONしか返さないのにAcceptを見ずに200/HTMLを返すと、意図せずブラウザでレンダリングされることも。うっかりですね。
ゆるまとめ
HTTPの名前に「ハイパーテキスト」とついているだけで、実は何でも運べる配達員。HTMLだけの人じゃないんですよ、という話でした。