APIテストとデバッグガイド:cURLからオンラインツールまで

開発ツール

HTTPリクエストメソッド

メソッド 用途 冪等性 安全性
GET リソースの取得 ✅ ✅
POST リソースの作成 ❌ ❌
PUT 全量更新 ✅ ❌
PATCH 部分更新 ❌ ❌
DELETE リソースの削除 ✅ ❌
HEAD ヘッダー情報の取得 ✅ ✅
OPTIONS CORSプリフライト ✅ ✅

よく使うリクエストヘッダー

ヘッダー 説明 例
Content-Type リクエストボディの形式 application/json
Accept 期待するレスポンス形式 application/json
Authorization 認証情報 Bearer token...
User-Agent クライアント識別子 Mozilla/5.0...
Cookie Cookie session=abc123
X-Request-ID リクエスト追跡ID UUID

Content-Typeの代表的な値

値 用途
application/json JSONデータ
application/x-www-form-urlencoded フォームデータ
multipart/form-data ファイルアップロード
text/plain プレーンテキスト
text/html HTML

認証方式

1. Bearer Token(最も一般的)

# cURL
curl -H "Authorization: Bearer eyJhbGciOiJIUzI1NiJ9..." \
  https://api.example.com/users

# JavaScript
fetch('https://api.example.com/users', {
  headers: {
    'Authorization': 'Bearer eyJhbGciOiJIUzI1NiJ9...',
  },
});

2. Basic認証

# cURL(自動エンコード)
curl -u username:password https://api.example.com/users

# 手動エンコード
# Base64("username:password") = "dXNlcm5hbWU6cGFzc3dvcmQ="
curl -H "Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ=" \
  https://api.example.com/users

3. API Key

# 方法1:ヘッダー
curl -H "X-API-Key: your-api-key" \
  https://api.example.com/users

# 方法2:クエリパラメータ
curl "https://api.example.com/users?api_key=your-api-key"

cURLコマンド詳解

基本的なGETリクエスト

# 最もシンプルなGET
curl https://api.example.com/users

# レスポンスヘッダーを表示
curl -i https://api.example.com/users

# レスポンスヘッダーのみ表示
curl -I https://api.example.com/users

# リダイレクトをたどる
curl -L https://example.com/redirect

POSTリクエスト

# JSONデータ
curl -X POST https://api.example.com/users \
  -H "Content-Type: application/json" \
  -d '{"name": "Alice", "email": "alice@example.com"}'

# フォームデータ
curl -X POST https://api.example.com/users \
  -d "name=Alice&email=alice@example.com"

# ファイルアップロード
curl -X POST https://api.example.com/upload \
  -F "file=@photo.jpg" \
  -F "description=My photo"

高度なオプション

# タイムアウト設定
curl --connect-timeout 5 --max-time 30 https://api.example.com

# ファイルに出力
curl -o response.json https://api.example.com/users

# サイレントモード(進捗を表示しない)
curl -s https://api.example.com/users

# 詳細出力(デバッグ用)
curl -v https://api.example.com/users

# SSL証明書の検証をスキップ(開発環境のみ)
curl -k https://self-signed.example.com

# プロキシ
curl -x http://proxy:8080 https://api.example.com

# Cookie
curl -b "session=abc123" https://api.example.com/users

# Cookieの保存と送信
curl -c cookies.txt -b cookies.txt https://api.example.com/users

よくあるHTTPステータスコード

ステータスコード 意味 よくある原因
200 OK 成功
201 Created POSTによる作成成功
204 No Content DELETE成功
301 Moved Permanently 恒久的なリダイレクト
304 Not Modified キャッシュヒット
400 Bad Request パラメータエラー
401 Unauthorized 未認証
403 Forbidden 権限不足
404 Not Found リソースが存在しない
409 Conflict リソースの競合
422 Unprocessable Entity バリデーション失敗
429 Too Many Requests レート制限
500 Internal Server Error サーバー側エラー
502 Bad Gateway 上流サービスが利用不可
503 Service Unavailable サービス過負荷

ToolsKuでAPIをテストする

cURLをコードに変換

  1. cURLからコードへの変換ツールを開く
  2. cURLコマンドを貼り付ける
  3. 対象言語(JavaScript/Python/Go/Javaなど)を選択
  4. 生成されたコードをコピー

例

# 入力するcURL
curl -X POST https://api.example.com/users \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer token123" \
  -d '{"name": "Alice"}'

JavaScriptに変換:

const response = await fetch('https://api.example.com/users', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    'Authorization': 'Bearer token123',
  },
  body: JSON.stringify({ name: 'Alice' }),
});
const data = await response.json();

APIデバッグのテクニック

1. リクエスト/レスポンスの全体を確認する

# -v で詳細情報を表示
curl -v https://api.example.com/users

# 出力:
> GET /users HTTP/1.1          ← リクエストライン
> Host: api.example.com        ← リクエストヘッダー
> Authorization: Bearer ...
>
< HTTP/1.1 200 OK              ← ステータスライン
< Content-Type: application/json ← レスポンスヘッダー
< X-RateLimit-Remaining: 99
<
[{"id": 1, "name": "Alice"}]   ← レスポンスボディ

2. JSONレスポンスを整形する

# jq で整形
curl -s https://api.example.com/users | jq

# python を使用
curl -s https://api.example.com/users | python -m json.tool

# またはToolsKuのJSON整形ツールを使用

3. レスポンスタイムを計測する

# 詳細な時間統計
curl -w "DNS: %{time_namelookup}s\nConnect: %{time_connect}s\nTTFB: %{time_starttransfer}s\nTotal: %{time_total}s\n" \
  -o /dev/null -s https://api.example.com/users

# 出力:
# DNS: 0.012s
# Connect: 0.035s
# TTFB: 0.120s
# Total: 0.125s

4. CORS問題の切り分け

ブラウザのエラー:
Access to fetch at 'https://api.example.com' from origin 'https://app.example.com'
has been blocked by CORS policy

切り分け手順:
1. OPTIONSプリフライトリクエストを確認
   curl -X OPTIONS -H "Origin: https://app.example.com" \
     -H "Access-Control-Request-Method: POST" \
     -i https://api.example.com/users

2. レスポンスヘッダーを確認
   Access-Control-Allow-Origin: https://app.example.com
   Access-Control-Allow-Methods: GET, POST, PUT, DELETE
   Access-Control-Allow-Headers: Content-Type, Authorization
   Access-Control-Max-Age: 86400

5. 認証問題の切り分け

401 Unauthorized の切り分け:
1. トークンの有効期限が切れていないか?→ JWTデコードツールで exp を確認
2. トークンの形式は正しいか?→ Bearer プレフィックスを確認
3. トークンは送信されているか?→ curl -v でリクエストヘッダーを確認

403 Forbidden の切り分け:
1. ユーザーに権限があるか?→ ユーザーロールを確認
2. IPはホワイトリストに入っているか?→ サーバーログを確認
3. レート制限を超えていないか?→ 429ステータスコードを確認

APIテストのベストプラクティス

1. 環境変数の管理

# 機密情報は環境変数に保存
export API_BASE="https://api.example.com"
export API_TOKEN="your-token"

curl -H "Authorization: Bearer $API_TOKEN" "$API_BASE/users"

2. リクエストコレクション

#!/bin/bash
# api-test.sh

BASE="https://api.example.com"
TOKEN="Bearer $API_TOKEN"
HEADER="-H 'Content-Type: application/json' -H 'Authorization: $TOKEN'"

# ユーザー一覧を取得
get_users() { curl -s $HEADER "$BASE/users" | jq; }

# ユーザーを作成
create_user() { curl -s -X POST $HEADER -d "$1" "$BASE/users" | jq; }

# 単一ユーザーを取得
get_user() { curl -s $HEADER "$BASE/users/$1" | jq; }

# 使い方
get_users
create_user '{"name":"Bob"}'
get_user 1

3. 自動テスト

// fetch でAPIテストを書く
async function testApi() {
  // GET をテスト
  const listRes = await fetch('/api/users');
  console.assert(listRes.status === 200, 'GET /users should return 200');

  // POST をテスト
  const createRes = await fetch('/api/users', {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({ name: 'Test' }),
  });
  console.assert(createRes.status === 201, 'POST /users should return 201');

  const created = await createRes.json();
  console.assert(created.name === 'Test', 'Name should match');
}

よくある質問

WindowsでcURLの引用符がうまくいかない?

Windows CMDはダブルクォートを使い、PowerShellにはエスケープの問題があります:

# PowerShell の curl は Invoke-WebRequest のエイリアス
# curl.exe で本物の cURL を呼び出す
curl.exe -X POST https://api.example.com/users `
  -H "Content-Type: application/json" `
  -d '{\"name\": \"Alice\"}'

リクエストがタイムアウトする場合の切り分けは?

1. DNS解決が遅い?→ curl -w で time_namelookup を確認
2. 接続確立が遅い?→ curl -w で time_connect を確認
3. サーバー処理が遅い?→ curl -w で time_starttransfer - time_connect を確認
4. レスポンス転送が遅い?→ curl -w で time_total - time_starttransfer を確認

まとめ

APIデバッグは開発者の日常です。cURLコマンド、HTTPステータスコード、認証方式、デバッグテクニックを身につければ、APIの問題を素早く特定できます。ToolsKuのcURLからコードへの変換ツールとJSON整形ツールはAPIデバッグの良き相棒として、APIのテストとレスポンスの確認を素早く行えます。

#APIテスト#HTTPリクエスト#cURL#APIデバッグ#チュートリアル