HTTP Content-Type ヘッダー:完全ガイド (2026年版)
Content-Type ヘッダーについて開発者が知っておくべきことのすべて
Hyperealで構築を始めよう
Kling、Flux、Sora、Veoなどに単一のAPIでアクセス。無料クレジットで開始、数百万規模まで拡張可能。
クレジットカード不要 • 10万人以上の開発者 • エンタープライズ対応
HTTP Content-Type ヘッダー:完全ガイド (2026年版)
Content-Type ヘッダーは、最も重要な HTTP ヘッダーの一つです。これは、リクエストまたはレスポンスのボディに含まれるデータの型をサーバー(またはクライアント)に伝え、データのパースや処理方法を決定させます。Content-Type の設定を誤ると、415 Unsupported Media Type、不正な形式の JSON、ファイルアップロードの失敗、文字化けといった、API で最も一般的なエラーの原因となります。
このガイドでは、MIME タイプの基礎から、主要な言語やフレームワークでの実践的な例まで、Content-Type について知っておくべきすべての情報を網羅します。
Content-Type ヘッダーとは?
Content-Type ヘッダーは、リソースやリクエスト・レスポンスボディ内のデータのメディアタイプ(MIME タイプとも呼ばれる)を示す HTTP エンティティヘッダーです。以下のフォーマットに従います。
Content-Type: type/subtype; parameter=value
例:
Content-Type: application/json; charset=utf-8
Content-Type: text/html; charset=utf-8
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary
3つの構成要素
| パート | 説明 | 例 |
|---|---|---|
| Type | 全般的なカテゴリ | application, text, image, audio, video, multipart |
| Subtype | 具体的なフォーマット | json, html, png, mp4, form-data |
| Parameters | オプションのメタデータ | charset=utf-8, boundary=xxx |
一般的な Content-Type の値
以下は、Web 開発や API で最も頻繁に使用される Content-Type の参照表です。
テキストタイプ
| Content-Type | 用途 |
|---|---|
text/plain |
フォーマットなしのプレーンテキスト |
text/html |
HTML ドキュメント |
text/css |
CSS スタイルシート |
text/javascript |
JavaScript ファイル |
text/csv |
カンマ区切り値 (CSV) |
text/xml |
XML ドキュメント (application/xml が推奨) |
アプリケーションタイプ
| Content-Type | 用途 |
|---|---|
application/json |
JSON データ (API で最も一般的) |
application/xml |
XML データ |
application/x-www-form-urlencoded |
HTML フォームデータ (デフォルト) |
application/octet-stream |
バイナリデータ (汎用) |
application/pdf |
PDF ドキュメント |
application/zip |
ZIP アーカイブ |
application/gzip |
Gzip 圧縮データ |
application/graphql+json |
GraphQL リクエスト |
マルチパートタイプ
| Content-Type | 用途 |
|---|---|
multipart/form-data |
ファイルアップロード、ファイルを含むフォームデータ |
multipart/mixed |
単一のメッセージ内の混合コンテンツタイプ |
multipart/alternative |
異なるフォーマットの同一コンテンツ (メール等) |
画像タイプ
| Content-Type | 用途 |
|---|---|
image/png |
PNG 画像 |
image/jpeg |
JPEG 画像 |
image/gif |
GIF 画像 |
image/webp |
WebP 画像 |
image/svg+xml |
SVG ベクター画像 |
image/avif |
AVIF 画像 |
オーディオ・ビデオタイプ
| Content-Type | 用途 |
|---|---|
audio/mpeg |
MP3 オーディオ |
audio/wav |
WAV オーディオ |
audio/ogg |
OGG オーディオ |
video/mp4 |
MP4 ビデオ |
video/webm |
WebM ビデオ |
Content-Type の使い分け
application/json
REST API で最も一般的な Content-Type です。構造化データを送受信する際に使用します。
curl -X POST https://api.example.com/users \
-H "Content-Type: application/json" \
-d '{"name": "John", "email": "john@example.com"}'
application/x-www-form-urlencoded
HTML の <form> 送信におけるデフォルトの Content-Type です。データは & で区切られたキーと値のペアとしてエンコードされます。
curl -X POST https://api.example.com/login \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "username=john&password=secret123"
リクエストボディ内のデータは以下のようになります:
username=john&password=secret123
特殊文字はパーセントエンコーディングされます(例:スペースは + または %20 になります)。
multipart/form-data
ファイルのアップロードに必須です。各フィールドは、独自の Content-Type を持つ個別のパートとして送信されます。
curl -X POST https://api.example.com/upload \
-H "Content-Type: multipart/form-data" \
-F "file=@photo.jpg" \
-F "description=My vacation photo"
各言語での Content-Type の設定方法
JavaScript (Fetch API)
// JSON リクエスト
const response = await fetch('https://api.example.com/data', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({ name: 'John', email: 'john@example.com' }),
});
// フォームデータ (Content-Type は自動的に設定されます)
const formData = new FormData();
formData.append('file', fileInput.files[0]);
formData.append('name', 'John');
const response = await fetch('https://api.example.com/upload', {
method: 'POST',
// FormData を使用する場合、手動で Content-Type を設定しないでください
// ブラウザが正しい boundary を含めて設定します
body: formData,
});
Python (Requests)
import requests
# JSON リクエスト (json= 引数で Content-Type が自動設定されます)
response = requests.post(
'https://api.example.com/data',
json={'name': 'John', 'email': 'john@example.com'}
)
# Form-urlencoded (data= 引数で自動設定されます)
response = requests.post(
'https://api.example.com/login',
data={'username': 'john', 'password': 'secret123'}
)
# ファイルアップロード (files= 引数で自動設定されます)
with open('photo.jpg', 'rb') as f:
response = requests.post(
'https://api.example.com/upload',
files={'file': ('photo.jpg', f, 'image/jpeg')},
data={'description': 'My vacation photo'}
)
# 明示的な Content-Type の指定
response = requests.post(
'https://api.example.com/data',
headers={'Content-Type': 'application/xml'},
data='<user><name>John</name></user>'
)
Go
package main
import (
"bytes"
"encoding/json"
"net/http"
)
func main() {
// JSON リクエスト
data := map[string]string{"name": "John", "email": "john@example.com"}
jsonData, _ := json.Marshal(data)
req, _ := http.NewRequest("POST", "https://api.example.com/data",
bytes.NewBuffer(jsonData))
req.Header.Set("Content-Type", "application/json")
client := &http.Client{}
resp, _ := client.Do(req)
defer resp.Body.Close()
}
cURL
# JSON
curl -X POST https://api.example.com/data \
-H "Content-Type: application/json" \
-d '{"name": "John"}'
# フォームデータ
curl -X POST https://api.example.com/login \
-d "username=john&password=secret"
# ファイルアップロード
curl -X POST https://api.example.com/upload \
-F "file=@photo.jpg" \
-F "description=My photo"
# バイナリデータ
curl -X POST https://api.example.com/binary \
-H "Content-Type: application/octet-stream" \
--data-binary @file.bin
API レスポンスにおける Content-Type
クライアントがデータを正しくパースできるように、サーバー側もレスポンスに正しい Content-Type を設定する必要があります。
Express.js
app.get('/api/users', (req, res) => {
// res.json() は Content-Type: application/json を自動的に設定します
res.json({ users: [] });
});
app.get('/report.pdf', (req, res) => {
res.setHeader('Content-Type', 'application/pdf');
res.sendFile('/path/to/report.pdf');
});
app.get('/page', (req, res) => {
// 文字列を指定した res.send() は Content-Type: text/html を設定します
res.send('<h1>Hello</h1>');
});
FastAPI (Python)
from fastapi import FastAPI
from fastapi.responses import JSONResponse, HTMLResponse, StreamingResponse
app = FastAPI()
@app.get("/api/users")
async def get_users():
# デフォルトで application/json を返します
return {"users": []}
@app.get("/page", response_class=HTMLResponse)
async def get_page():
return "<h1>Hello</h1>"
@app.get("/download")
async def download_file():
return StreamingResponse(
open("file.pdf", "rb"),
media_type="application/pdf"
)
charset パラメータ
charset パラメータは、テキストコンテンツの文字エンコーディングを指定します。特別な理由がない限り、標準である UTF-8 を常に使用すべきです。
Content-Type: text/html; charset=utf-8
Content-Type: application/json; charset=utf-8
注:JSON の仕様 (RFC 8259) では、JSON は UTF-8 でエンコードされることが定められています。技術的には application/json に charset パラメータは不要ですが、明示化のために多くの API で含められています。
Content-Type と Accept ヘッダーの違い
これら2つのヘッダーは混同されやすいですが、役割が異なります。
| ヘッダー | 目的 | 使用される場所 | 方向 |
|---|---|---|---|
Content-Type |
ボディのフォーマットを説明 | リクエストおよびレスポンス | 「これを送信します」 |
Accept |
特定のフォーマットを要求 | リクエストのみ | 「これを返してほしい」 |
# 「JSONを送るので、JSONを返してほしい」
curl -X POST https://api.example.com/data \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{"name": "John"}'
よくあるエラーと解決策
415 Unsupported Media Type
サーバーが、送信された Content-Type を受け付けていません。
# 誤り:JSON専用のエンドポイントにフォームデータを送信している
curl -X POST https://api.example.com/data \
-d "name=John"
# 解決策:代わりに JSON を送信する
curl -X POST https://api.example.com/data \
-H "Content-Type: application/json" \
-d '{"name": "John"}'
400 Bad Request (Malformed JSON)
Content-Type は JSON になっていますが、ボディが有効な JSON 形式ではありません。
# 誤り:有効な JSON ではない
curl -X POST https://api.example.com/data \
-H "Content-Type: application/json" \
-d "name=John"
# 解決策:正しい JSON 構文を使用する
curl -X POST https://api.example.com/data \
-H "Content-Type: application/json" \
-d '{"name": "John"}'
FormData を使用したファイルアップロードの失敗
JavaScript で FormData を使用する場合、手動で Content-Type を設定しないでください。ブラウザが適切な boundary 文字列とともに自動設定する必要があります。
// 誤り
const formData = new FormData();
formData.append('file', file);
fetch('/upload', {
method: 'POST',
headers: { 'Content-Type': 'multipart/form-data' }, // これを行ってはいけません
body: formData,
});
// 正解
fetch('/upload', {
method: 'POST',
// ブラウザに boundary 付きの Content-Type を設定させる
body: formData,
});
コンテンツ・ネゴシエーション (Content Negotiation)
一部の API は複数のレスポンス形式をサポートしています。クライアントは Accept ヘッダーを使用して特定の形式を要求し、サーバーはレスポンスの Content-Type を使用して送信した形式を確定します。
# XML レスポンスを要求
curl -H "Accept: application/xml" https://api.example.com/users
# JSON レスポンスを要求
curl -H "Accept: application/json" https://api.example.com/users
まとめ
Content-Type ヘッダーは、HTTP 通信の仕組みにおいて根本的な役割を果たします。正しく設定することで、サーバーとクライアントが正しくデータをパースし、ファイルのアップロードを成功させ、API が適切な形式を返すことが保証されます。モダンなフレームワークの多くは、一般的なケース(JSON、フォームデータ)では Content-Type を自動的に処理してくれますが、その仕組みを理解しておくことは、避けられないエッジケースのデバッグに大いに役立ちます。
画像、ビデオ、オーディオ、トーキングアバターなどの AI 生成メディアを含むアプリケーションを構築している場合は、Hypereal AI をぜひチェックしてください。正しい Content-Type ヘッダーでメディアを返し、すべての複雑な処理を代行する統合型 API を提供しています。
Hypereal AI を無料で試す -- 35クレジット提供。クレジットカード不要。
