curl コマンドの使い方完全ガイド|API・ファイル取得・POST送信の実例集
結論:この4つを覚えれば9割いける
curl https://example.com # GET(中身を表示)
curl -O https://example.com/file.zip # ファイルとして保存
curl -X POST -d 'key=value' URL # POST送信
curl -H "Authorization: Bearer xxx" URL # ヘッダー付き
残りはオプションの組み合わせだけ。
即決チェック表
| やりたいこと | コマンド |
|---|---|
| URLの中身を表示 | curl URL |
| ファイルとして保存 | curl -O URL |
| 名前を指定して保存 | curl -o name.html URL |
| レスポンスヘッダーも見る | curl -i URL |
| ヘッダーだけ見る | curl -I URL |
| リダイレクトを追う | curl -L URL |
| POSTでデータ送信 | curl -X POST -d 'a=1' URL |
| JSONを送る | curl -H "Content-Type: application/json" -d '{...}' URL |
| 認証ヘッダーを付ける | curl -H "Authorization: Bearer TOKEN" URL |
| 進捗を消して結果だけ | curl -s URL |
このまま貼って使える。
基本:GET リクエスト
curl https://example.com
レスポンスボディが標準出力に流れる。HTMLでもJSONでもそのまま表示される。
中身が長いときはページャに渡す
curl -s https://api.example.com/data | less
-s(silent)で進捗バーを消すのがポイント。パイプに渡すときは必須級。
ファイルを保存する:-O と -o
# サーバー側のファイル名で保存(file.zip になる)
curl -O https://example.com/file.zip
# 自分で名前を決めて保存
curl -o myfile.zip https://example.com/file.zip
| オプション | 挙動 |
|---|---|
-O(大文字) | URLの末尾をファイル名にする |
-o name(小文字) | 指定した名前で保存 |
⚠️ 混同注意。 大文字小文字で全く別の動きをする。
ヘッダーを確認する:-i と -I
# ボディ + レスポンスヘッダー
curl -i https://example.com
# ヘッダーだけ(HEADリクエスト)
curl -I https://example.com
ステータスコードやリダイレクト先を確認したいときに使う。
HTTP/2 200
content-type: text/html; charset=UTF-8
cache-control: max-age=3600
ステータスコードの意味は HTTPステータスコード一覧 を参照。
リダイレクトを追う:-L
# ✗ 301/302 が返ると中身が表示されない
curl https://example.com/old
# ✓ リダイレクト先まで追跡する
curl -L https://example.com/old
http:// を https:// に飛ばすサイトや短縮URLでは -L が必須。「中身が空っぽ」のときはまずこれを疑う。
POST でデータを送る
フォーム形式(application/x-www-form-urlencoded)
curl -X POST \
-d 'name=taro' \
-d 'age=20' \
https://api.example.com/users
-d を使うと自動的に POST になるので、実は -X POST は省略できる。
JSON を送る
curl -X POST \
-H "Content-Type: application/json" \
-d '{"name":"taro","age":20}' \
https://api.example.com/users
JSONのときは Content-Type ヘッダーを忘れると 415 エラーになりやすい。
ファイルの中身を送る
curl -X POST \
-H "Content-Type: application/json" \
-d @body.json \
https://api.example.com/users
-d @ファイル名 でファイルの中身をそのまま送れる。長いJSONはこれが楽。
ヘッダーを付ける:-H
# 認証トークン
curl -H "Authorization: Bearer eyJhbGc..." https://api.example.com/me
# 複数指定もOK
curl \
-H "Authorization: Bearer TOKEN" \
-H "Accept: application/json" \
https://api.example.com/me
API を叩くときの定番。-H は何個でも並べられる。
認証
Basic認証
curl -u username:password https://example.com/secret
トークン認証(推奨)
curl -H "Authorization: Bearer YOUR_TOKEN" https://api.example.com/data
⚠️ パスワードやトークンを直書きするとシェルの履歴(.bash_history)に残る。本番運用では環境変数を使う:
curl -H "Authorization: Bearer $API_TOKEN" https://api.example.com/data
よく使うオプション一覧
| オプション | 意味 |
|---|---|
-s | 進捗バー・エラーを非表示(silent) |
-S | -s でもエラーは表示(show error) |
-L | リダイレクトを追う |
-i | レスポンスヘッダーも表示 |
-I | ヘッダーのみ(HEAD) |
-o file | ファイル名を指定して保存 |
-O | URL末尾の名前で保存 |
-H | ヘッダーを追加 |
-d | POSTデータ(自動でPOSTになる) |
-X | メソッドを明示(GET/POST/PUT/DELETE) |
-u | Basic認証 |
-k | SSL証明書の検証をスキップ |
-w | 結果のフォーマット出力 |
--max-time | タイムアウト秒数 |
-s -S はセットで覚えると便利。**「普段は静か、エラーだけ出す」**が作れる。
実務でハマるポイント
1. JSONを送ったのに受け取れない
# ✗ Content-Type がないとサーバーがJSONと認識しない
curl -X POST -d '{"a":1}' URL
# ✓ ヘッダーを付ける
curl -X POST -H "Content-Type: application/json" -d '{"a":1}' URL
2. 中身が表示されない=リダイレクト
-L を付ける。前述のとおり301/302で起きる典型パターン。
3. シングルクォートとダブルクォートの罠
# ✗ 変数が展開されない(シングルクォート)
curl -H 'Authorization: Bearer $TOKEN' URL
# ✓ 変数を展開したいならダブルクォート
curl -H "Authorization: Bearer $TOKEN" URL
JSONの " とシェルの展開がぶつかるときは、外をシングル・中をダブルにすると衝突しない。
4. SSL証明書エラー
curl: (60) SSL certificate problem
検証を飛ばすには -k。ただし中間者攻撃のリスクがあるので、開発環境の自己署名証明書に限定すること。本番では証明書を正しく設定する。
デバッグに効くオプション
通信の中身を全部見る:-v
curl -v https://example.com
送信ヘッダー(>)と受信ヘッダー(<)が全部出る。APIが期待通り叩けているか確認するときの最強オプション。
ステータスコードと所要時間だけ取る:-w
curl -s -o /dev/null -w "%{http_code} %{time_total}s\n" https://example.com
# → 200 0.342s
-o /dev/nullでボディを捨てる-wで欲しい情報だけ取り出す
監視スクリプトでよく使う形。
実用スニペット集
APIの疎通確認(ヘルスチェック)
curl -s -o /dev/null -w "%{http_code}\n" https://example.com/health
# 200 以外なら異常
タイムアウトを設定して固まらないようにする
curl --max-time 10 https://slow.example.com
ダウンロードの再開(中断したファイルの続き)
curl -C - -O https://example.com/big.zip
-C - で途中から再開できる。大きいファイルで回線が切れたときに。
POST結果を整形して見る(jq併用)
curl -s https://api.example.com/users | jq .
JSON APIのレスポンス確認はこれが鉄板。
curl と wget の違い
| 観点 | curl | wget |
|---|---|---|
| 得意なこと | API操作・リクエスト全般 | ファイルダウンロード |
| 標準出力 | デフォルトで標準出力 | デフォルトでファイル保存 |
| 再帰ダウンロード | 不可 | 可能(-r) |
| プロトコル対応 | 非常に多い | HTTP/HTTPS/FTP中心 |
APIを叩く・細かいリクエストを作るなら curl。 サイトを丸ごと落とすなら wget。
まとめ
| やること | コマンド |
|---|---|
| 中身を見る | curl URL |
| 保存する | curl -O URL |
| POST送信 | curl -X POST -d 'a=1' URL |
| ヘッダー付き | curl -H "..." URL |
| デバッグ | curl -v URL |
-dを付けたら自動でPOST。Content-Typeを忘れない。 中身が空なら-L、固まるなら--max-time。
関連記事
- HTTPステータスコード一覧 — 200・301・404・500の意味
- crontab の書き方完全ガイド — curl を定期実行する監視スクリプトに
- CORSエラーの原因と対処 — ブラウザからのリクエストでハマったとき
- .env 管理ガイド — APIトークンを安全に扱う