curlコマンドを使いこなすチートシート|基本から実践APIまで完全網羅
APIの動作確認やデータ取得を手軽にやりたいとき、まず頼りになるのがcurlコマンドですよね。GUIツールを起動しなくても、ターミナルからサッとリクエストを投げられるのが最大の魅力です。
今回は、curlの基本操作からヘッダー指定、JSON送信、認証パターン、そしてWordPress REST APIやGitHub API、Chatwork APIといった実践的なAPI呼び出しまで、チートシート形式でまとめてみました。手元に置いておけばいつでも使える一覧になっている、、はず!
目次
curlの基本(HTTPメソッド)
curlはデフォルトでGETリクエストを送ります。他のHTTPメソッドを使うには -X オプションで指定します。
GETリクエスト
一番シンプルな形。URLを指定するだけでOKです。
# 基本のGET
curl https://api.example.com/users
# クエリパラメータ付き
curl "https://api.example.com/users?page=1&per_page=10"
POSTリクエスト
データを送信してリソースを作成する場合に使います。
# フォームデータの送信
curl -X POST -d "name=taro&email=taro@example.com" https://api.example.com/users
# JSONデータの送信
curl -X POST \
-H "Content-Type: application/json" \
-d '{"name":"taro","email":"taro@example.com"}' \
https://api.example.com/users
PUT / PATCHリクエスト
既存リソースの更新に使います。PUTは全体置換、PATCHは部分更新という使い分けが一般的です。
# PUT(全体更新)
curl -X PUT \
-H "Content-Type: application/json" \
-d '{"name":"jiro","email":"jiro@example.com"}' \
https://api.example.com/users/1
# PATCH(部分更新)
curl -X PATCH \
-H "Content-Type: application/json" \
-d '{"name":"saburo"}' \
https://api.example.com/users/1
DELETEリクエスト
curl -X DELETE https://api.example.com/users/1
ヘッダー指定(-H)
APIを叩くとき、ヘッダーの設定は避けて通れないですよね。-H オプションで自由にカスタムヘッダーを追加できます。
# Content-Typeの指定
curl -H "Content-Type: application/json" https://api.example.com/data
# Acceptヘッダー
curl -H "Accept: application/json" https://api.example.com/data
# Authorizationヘッダー(Bearer トークン)
curl -H "Authorization: Bearer YOUR_TOKEN_HERE" https://api.example.com/me
# 複数ヘッダーを指定
curl -H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "X-Custom-Header: custom-value" \
https://api.example.com/data
JSONデータの送信(-d / –data-raw)
JSON形式でデータを送る場面は非常に多いです。-d と --data-raw の違いも押さえておくと便利ですね。
# -d でJSON送信(Content-Typeは明示的に指定が必要)
curl -X POST \
-H "Content-Type: application/json" \
-d '{"title":"テスト記事","status":"draft"}' \
https://example.com/wp-json/wp/v2/posts
# --data-raw は特殊文字(@など)をそのまま扱う
curl -X POST \
-H "Content-Type: application/json" \
--data-raw '{"email":"user@example.com"}' \
https://api.example.com/users
# ファイルからJSONを読み込んで送信
curl -X POST \
-H "Content-Type: application/json" \
-d @data.json \
https://api.example.com/users
# ヒアドキュメントで複雑なJSONを送信
curl -X POST \
-H "Content-Type: application/json" \
-d @- https://api.example.com/users <<'EOF'
{
"name": "taro",
"email": "taro@example.com",
"profile": {
"age": 30,
"city": "Tokyo"
}
}
EOF
ポイント: -d を使うと @ から始まる値がファイル名として解釈されます。メールアドレスなど @ を含むデータをそのまま送りたいなら --data-raw を使うのが安全です。
ファイルアップロード(-F)
画像やドキュメントのアップロードには -F(multipart/form-data)を使います。
# 画像ファイルのアップロード
curl -X POST \
-H "Authorization: Bearer YOUR_TOKEN" \
-F "file=@/path/to/image.jpg" \
https://api.example.com/upload
# ファイルとテキストデータを同時に送信
curl -X POST \
-F "file=@photo.jpg" \
-F "description=プロフィール画像" \
-F "category=avatar" \
https://api.example.com/upload
# Content-Typeを明示的に指定
curl -X POST \
-F "file=@document.pdf;type=application/pdf" \
https://api.example.com/upload
-F を使うと、curlが自動的に Content-Type: multipart/form-data を設定してくれます。 -H で別途指定する必要はないですね。
レスポンスの確認(-v / -i / -o)
APIのデバッグでは、レスポンスヘッダーやステータスコードを確認したい場面が多いです。用途に応じたオプションを使い分けていきます。
# -i: レスポンスヘッダーを表示
curl -i https://api.example.com/users
# -v: リクエスト・レスポンスの詳細を表示(デバッグに最適)
curl -v https://api.example.com/users
# -o: レスポンスボディをファイルに保存
curl -o response.json https://api.example.com/users
# -O: URLのファイル名で保存
curl -O https://example.com/files/document.pdf
# -s: プログレスバーを非表示(スクリプト向け)
curl -s https://api.example.com/users
# -w: レスポンスの情報をフォーマット指定で表示
curl -s -o /dev/null -w "HTTP Status: %{http_code}\nTime: %{time_total}s\n" \
https://api.example.com/users
特に -w オプションはAPIのパフォーマンス計測にも使えます。ステータスコードだけ取得したい場合は -o /dev/null と組み合わせると便利です。
認証パターン
APIごとに認証方式は異なります。よく使う3パターンを押さえておきます。
Bearer トークン認証
OAuthやJWTなど、多くのモダンなAPIで採用されている方式です。
curl -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
https://api.example.com/me
Basic認証
ユーザー名とパスワードをBase64エンコードして送る方式です。WordPressのアプリケーションパスワードなどで使います。
# -u オプションで指定(curlが自動的にBase64エンコード)
curl -u "username:password" https://api.example.com/data
# ヘッダーで直接指定する場合
curl -H "Authorization: Basic $(echo -n 'username:password' | base64)" \
https://api.example.com/data
Cookie認証
ブラウザセッションと同じ認証方式を使いたい場合です。
# Cookieを送信
curl -b "session_id=abc123; token=xyz789" https://example.com/dashboard
# Cookieをファイルに保存して再利用
curl -c cookies.txt -d "user=admin&pass=secret" https://example.com/login
curl -b cookies.txt https://example.com/dashboard
リダイレクト追従(-L)
curlはデフォルトでリダイレクト(301, 302)を追従しません。-L をつけると自動で追従してくれます。
# リダイレクトを追従
curl -L https://example.com/old-page
# リダイレクトの回数を制限(デフォルトは50回)
curl -L --max-redirs 5 https://example.com/old-page
# リダイレクト先を確認(-vと組み合わせ)
curl -L -v https://example.com/old-page 2>&1 | grep "Location:"
短縮URLの展開先を調べたいときなどにも -L -v の組み合わせは重宝しますね。
タイムアウト設定
外部APIを叩くスクリプトでは、タイムアウトの設定が大事です。応答のないサーバーに延々と待たされるのを防げます。
# 接続タイムアウト(サーバーへの接続確立までの制限時間)
curl --connect-timeout 5 https://api.example.com/data
# 全体タイムアウト(リクエスト全体の制限時間)
curl --max-time 30 https://api.example.com/large-data
# 両方を組み合わせ(実用的な設定)
curl --connect-timeout 5 --max-time 30 https://api.example.com/data
# リトライ設定(失敗時に再試行)
curl --retry 3 --retry-delay 2 https://api.example.com/data
--connect-timeout は接続確立までの時間、--max-time はレスポンス受信完了までの全体時間を制限します。スクリプトで使う場合はどちらも設定しておくのがおすすめです。
jqとの組み合わせ
APIのレスポンスはJSON形式が多いです。jq コマンドと組み合わせると、必要なデータだけを抽出したり、整形して表示したりできます。
# JSONを整形して表示
curl -s https://api.example.com/users | jq .
# 特定のフィールドだけ抽出
curl -s https://api.example.com/users | jq '.[].name'
# 条件でフィルタリング
curl -s https://api.example.com/users | jq '[.[] | select(.active == true)]'
# 複数フィールドを組み合わせて新しいオブジェクトを生成
curl -s https://api.example.com/users | jq '[.[] | {id, name, email}]'
# レスポンスの件数をカウント
curl -s https://api.example.com/users | jq 'length'
# ネストされたデータにアクセス
curl -s https://api.example.com/users/1 | jq '.profile.address.city'
jqが入っていない場合は brew install jq でインストールできます。JSONを扱うなら必須のツールですね。
実践例:各APIへのアクセス
ここからは実際のAPIを使った具体的な例です。コピペしてすぐに使えるようにまとめました。
WordPress REST API
WordPressのREST APIはBasic認証(アプリケーションパスワード)で利用できます。
# 記事一覧を取得
curl -s "https://example.com/wp-json/wp/v2/posts?per_page=5" | jq '[.[] | {id, title: .title.rendered, status}]'
# 新規記事を作成(下書き)
curl -X POST \
-u "admin:XXXX XXXX XXXX XXXX XXXX XXXX" \
-H "Content-Type: application/json" \
-d '{"title":"curlから投稿テスト","content":"これはcurlから投稿した記事です。","status":"draft"}' \
https://example.com/wp-json/wp/v2/posts
# 記事を更新
curl -X POST \
-u "admin:XXXX XXXX XXXX XXXX XXXX XXXX" \
-H "Content-Type: application/json" \
-d '{"title":"更新したタイトル"}' \
https://example.com/wp-json/wp/v2/posts/123
# メディア(画像)をアップロード
curl -X POST \
-u "admin:XXXX XXXX XXXX XXXX XXXX XXXX" \
-F "file=@eyecatch.jpg" \
https://example.com/wp-json/wp/v2/media
GitHub API
GitHub APIはPersonal Access Token(PAT)を使ったBearer認証が基本です。
# 自分のリポジトリ一覧
curl -s -H "Authorization: Bearer ghp_xxxxxxxxxxxx" \
https://api.github.com/user/repos | jq '[.[] | {name, private, language}]'
# リポジトリの情報を取得
curl -s https://api.github.com/repos/owner/repo | jq '{name, description, stargazers_count, forks_count}'
# Issueを作成
curl -X POST \
-H "Authorization: Bearer ghp_xxxxxxxxxxxx" \
-H "Content-Type: application/json" \
-d '{"title":"バグ報告","body":"ログイン画面でエラーが発生します","labels":["bug"]}' \
https://api.github.com/repos/owner/repo/issues
# プルリクエスト一覧
curl -s -H "Authorization: Bearer ghp_xxxxxxxxxxxx" \
https://api.github.com/repos/owner/repo/pulls | jq '[.[] | {number, title, user: .user.login, state}]'
Chatwork API
Chatwork APIは X-ChatWorkToken ヘッダーでAPIトークンを渡す独自の認証方式です。
# 自分の情報を取得
curl -s -H "X-ChatWorkToken: YOUR_API_TOKEN" \
https://api.chatwork.com/v2/me | jq .
# ルーム一覧を取得
curl -s -H "X-ChatWorkToken: YOUR_API_TOKEN" \
https://api.chatwork.com/v2/rooms | jq '[.[] | {room_id, name, type}]'
# メッセージを送信
curl -X POST \
-H "X-ChatWorkToken: YOUR_API_TOKEN" \
-d "body=curlからのテスト送信です" \
https://api.chatwork.com/v2/rooms/ROOM_ID/messages
# タスクを作成
curl -X POST \
-H "X-ChatWorkToken: YOUR_API_TOKEN" \
-d "body=レビューお願いします&to_ids=12345&limit=1735689600" \
https://api.chatwork.com/v2/rooms/ROOM_ID/tasks
よく使うオプション一覧
最後に、よく使うcurlオプションを一覧でまとめておきます。
-X METHOD HTTPメソッドを指定(GET/POST/PUT/PATCH/DELETE)
-H "Header" リクエストヘッダーを追加
-d "data" リクエストボディを送信(POSTデータ)
--data-raw @を特殊文字として扱わずにデータを送信
-F "key=val" multipart/form-dataで送信(ファイルアップロード)
-u user:pass Basic認証
-b "cookie" Cookieを送信
-c file Cookieをファイルに保存
-o file レスポンスをファイルに保存
-O URLのファイル名で保存
-i レスポンスヘッダーを表示
-v 詳細な通信情報を表示
-s プログレスバーを非表示
-S -sと併用してエラーだけ表示
-L リダイレクトを追従
-k SSL証明書の検証をスキップ
-w "format" レスポンス情報のフォーマット出力
--connect-timeout N 接続タイムアウト(秒)
--max-time N 全体タイムアウト(秒)
--retry N リトライ回数
--retry-delay N リトライ間隔(秒)
まとめ
curlはシンプルなコマンドですけど、オプションの組み合わせ次第でかなり柔軟に使えます。特にAPIの動作確認やデバッグでは、GUIツールよりも素早く操作できるのが強みですね。
このチートシートを手元に置いておけば、「あのオプション何だっけ?」というときにすぐ参照できる、、はず!
今回は以上です!