curlは、URLを指定してサーバーとデータをやり取りできるコマンドラインツールで、APIの動作確認やファイルのダウンロードなどに広く使われています。
本記事では、curlの基本的な書式から、APIへのGET・POSTリクエストの送り方、ファイルのダウンロード方法までを、実際のコマンドと実行結果で解説します。
Windows・Mac・Linuxでの違いや、よくあるエラーの対処法もあわせて紹介します。
curlとは
curlとは何か
curl(カール)は、URLを指定してサーバーとデータを送受信するためのコマンドラインツールです。
HTTPやHTTPSをはじめ、FTPやSMTPなど多くの通信プロトコルに対応しており、オープンソースのソフトウェアとして開発されています(curl公式サイト)。
curlは、次のような用途で利用できます。
- Webページの取得や応答内容の確認
- HTTPステータスコードやレスポンスヘッダーの確認
- APIからのJSONデータの取得や、APIへのデータの送信
- ファイルのダウンロードやアップロード
Web開発では、主にHTTPやHTTPSを利用してWebページを取得したり、APIにリクエストを送信したりする目的で使用されます。
APIドキュメントや手順書にはcurlのコマンド例が載っていることが多いため、読み方を覚えておくと、APIの仕様を理解したり動作を確かめたりしやすくなります。
コマンドの基本の書式とオプションの書き方
curlの基本的な書式は、次のとおりです。
curl [オプション] URLcurlの後ろに必要なオプションを指定し、最後にアクセス先のURLを記述します。
オプションを省略した場合はGETリクエスト(データを取得するためのリクエスト)を送信し、受け取ったレスポンス本文をそのまま表示します。
また、curlでは複数のオプションを組み合わせて、リクエストの送り方やレスポンスの表示方法を変えることもできます。
curl -s -i https://example.com/「-s」は進捗表示などを抑えるオプション、「-i」はレスポンスヘッダーを本文と一緒に表示するオプションです。
オプションには、「-i」のような短い形式のほか、「–include」のような長い形式もあり、次の2つのコマンドは同じ意味です。
curl -i https://example.com/
curl --include https://example.com/長い形式はオプションの意味を把握しやすく、短い形式はコマンドを簡潔に記述できるという利点があります。
なお、長いコマンドは行末に「\」を付けると複数行に分けて書けます(macOS・Linuxの場合。Windowsでの書き方は後述します)。
各オプションの詳しい仕様は、curl公式マニュアルで確認できます。
【実践】curlを動かしてみる
ターミナルを開いてcurlが使えるか確認する
まずは、curlを実行できる環境を用意しましょう。
curlはmacOSや多くのLinux環境、Windows 10(バージョン1803以降)とWindows 11に標準搭載されているため、多くの場合は追加のインストールなしで利用できます。
ターミナル(Windowsの場合はコマンドプロンプトまたはPowerShell)を開き、次のコマンドを実行してください。
curl --versioncurlが利用できる場合は、バージョン番号や対応している通信プロトコル、機能などの情報が表示されます。
Windows PowerShell 5.1でエラーになる場合は、「curl.exe –version」と入力してください(理由は「Windowsで注意すること」で解説します)。
「command not found」などと表示された場合は、curlがインストールされていないか、実行ファイルのパスが通っていない可能性があります。
Webページを取得してレスポンスを見る
curlが利用できることを確認したら、実際にWebページを取得してみましょう。
今回は、ドキュメントの例示用に用意されているドメイン「example.com」を使用します。
curl https://example.com/実行すると、ターミナルにHTML形式のテキストが表示されます。
ブラウザーは受け取ったHTMLを解析して画面に描画しますが、curlはレスポンス本文をそのまま出力するため、タグを含むソースコードが表示されます。
この違いを理解しておくと、curlで取得した結果を確認するときに迷いにくくなります。
APIからデータを取得する
APIからJSONデータを取得する
curlは、Webページを取得するだけでなく、APIにリクエストを送信してデータを取得する用途にも利用できます。
今回は、架空のTodoや投稿データを返してくれるテスト用の公開API「JSONPlaceholder」を使用します(登録不要)。
curl https://jsonplaceholder.typicode.com/todos/1正常に応答が返ってくると、次のようなJSONデータが表示されます。
このように、URLを指定するだけでAPIにGETリクエストを送信し、データを取得できます。
APIによっては、URLに「?userId=1」のようなパラメーターを付けて取得条件を指定できます。
「?」や「&」を含むURLは、シェルに記号として解釈されないよう「”」で囲みましょう。
curl "https://jsonplaceholder.typicode.com/todos?userId=1"レスポンスヘッダーとステータスコードを確認する
APIを利用するときは、データの内容だけでなく、リクエストがどのように処理されたかを確認することも重要です。
HTTPでは、サーバーからの応答に3桁のステータスコードが含まれており、リクエストが成功したか、認証やURLに問題があるかなどを判断する手掛かりになります。
主なステータスコードは次のとおりです。
| ステータスコード | 意味 |
|---|---|
| 200 OK | リクエストが正常に処理された |
| 201 Created | リソースが作成された |
| 301 Moved Permanently | リソースの移動先が恒久的に変更された |
| 400 Bad Request | リクエストの内容に問題がある |
| 401 Unauthorized | 認証が必要、または認証に失敗した |
| 403 Forbidden | アクセスが許可されていない |
| 404 Not Found | 指定したリソースが見つからない |
| 500 Internal Server Error | サーバー内部でエラーが発生した |
curlでレスポンスヘッダーと本文をまとめて確認するには、「-i」オプションを使用します。
curl -i https://jsonplaceholder.typicode.com/todos/1実行すると、1行目にHTTPのバージョンとステータスコード、続いてレスポンスヘッダー、空行を挟んでレスポンス本文が表示されます。
この例では「HTTP/2 200」と表示されており、リクエストが正常に処理されたことがわかります(ヘッダーの内容は接続先や環境によって変わります)。
ステータスコードだけを確認したい場合は、「-w」オプションを使います。
curl -s -o /dev/null -w "%{http_code}\n" https://jsonplaceholder.typicode.com/todos/1「-o /dev/null」で本文を破棄し、「%{http_code}」でステータスコード(この例では「200」)だけを表示しています。
Windowsでは、「/dev/null」を「NUL」に置き換えてください。
ページの移動先までたどる
WebサイトやAPIによっては、指定したURLにアクセスすると、別のURLへ転送される場合があります。
このような転送をリダイレクトと呼びます。
curlは、初期設定ではリダイレクト先へ自動的にアクセスしません。
例えば、GitHubに「http://」でアクセスすると、「https://」のURLへ転送するよう指示する応答が返ってきます。
curl -I http://github.com/HTTP/1.1 301 Moved Permanently
Content-Length: 0
Location: https://github.com/「-I」は、HEADリクエストを送ってレスポンスヘッダーだけを取得するオプションです。
「301」と転送先の「Location」が返ってきていますが、curlは転送先にはアクセスしていません。
転送先までたどるには、「-L」オプションを指定します。
curl -L -I http://github.com/301の応答に続いて、転送先「https://github.com/」の「200」の応答も表示されます。
転送が複数回あっても、curlが順にたどります(初期設定では最大50回)。
データやファイルを送受信する
HTTPヘッダーを指定して送る
HTTPヘッダーは、リクエストやレスポンスに付ける追加情報です。
リクエストヘッダーでは、送信するデータの形式や、どのような形式の応答を希望するかなどをサーバーに伝えられます。
curlでリクエストヘッダーを指定するには、「-H」オプションを「”ヘッダー名: 値”」の形式で使用します。
curl -H "Accept: application/json" https://jsonplaceholder.typicode.com/todos/1この例では、「JSON形式の応答を希望する」ことをサーバーに伝えています。
ヘッダーを複数指定したい場合は、「-H」を繰り返し記述します。
なお、「-H」は送信するリクエストヘッダーを指定するオプションで、受け取ったレスポンスヘッダーを表示する「-i」や「-I」とは役割が異なります。
JSONデータをPOSTで送る
APIにデータを送信して新しいデータを作成するときは、POSTメソッドがよく利用されます。
GETがデータを「取得」するためのメソッドであるのに対し、POSTはリクエスト本文(ボディ)に入れたデータをサーバーに「送信」するためのメソッドです。
curlでは「-d」で送信するデータを指定し、JSONを送る場合は「-H」で「Content-Type: application/json」も指定します(macOS・Linux向けの書き方です)。
curl -X POST \
-H "Content-Type: application/json" \
-d '{"title":"Learn curl","completed":false,"userId":1}' \
https://jsonplaceholder.typicode.com/todos実行すると、送信したデータに「”id”: 201」が付いたJSONが返ってきます。
ただし、JSONPlaceholderはテスト用のAPIのため、実際にはデータは保存されません(作成されたかのような応答を返すだけです)。
また、「-d」を指定すると、curlは自動的にPOSTメソッドで送信するため、上の例の「-X POST」は省略できます。
「-X」は、PUTやDELETEなどPOST以外のメソッドを使うときに指定するオプションと覚えておくとよいでしょう。
curl 7.82.0以降では、「–json」でJSON用のヘッダー指定とPOSTをまとめて行うこともできます。
curl --json '{"title":"Learn curl"}' https://jsonplaceholder.typicode.com/todos認証情報を付けて送る
APIによっては、利用者を識別するために認証情報が必要です。
代表的なのが、APIキーやアクセストークンをリクエストヘッダーに付けて送信する方式で、Bearerトークンを使用するAPIでは次のように指定します。
curl -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
https://api.example.com/dataAPIキーを専用のヘッダーで受け取るサービスでは、次のように指定する場合もあります。
curl -H "X-API-Key: YOUR_API_KEY" \
https://api.example.com/data「YOUR_ACCESS_TOKEN」などは、サービスで発行された値に置き換えてください(URLは説明用の例のため動作しません)。
認証方式やヘッダー名はサービスごとに異なるため、APIの公式ドキュメントを確認しましょう。
また、コマンドに直接書いた認証情報はシェルのコマンド履歴に残るため、手順書やチャットにそのまま貼り付けないよう注意が必要です。
ファイルをダウンロードする
curlでは、取得したデータをファイルに保存したり、Web上のファイルをダウンロードしたりできます。
ファイル名を指定して保存する場合は、「-o」(小文字)の後ろにファイル名を指定します。
curl -o example.html https://example.com/URLに含まれるファイル名のまま保存する場合は、「-O」(大文字)を使用します(この例では「curl-logo.svg」として保存されます)。
curl -O https://curl.se/logo/curl-logo.svgどちらの場合も、ファイルはコマンドを実行したディレクトリ(カレントディレクトリ)に保存されます。
現在のディレクトリは、macOS・Linuxでは「pwd」、Windowsのコマンドプロンプトでは「cd」で確認できます。
別の場所に保存したいときは、「-o」にフォルダのパスを含めるか、「–output-dir」で保存先を指定します。
ダウンロード先のURLがリダイレクトされる場合は、「-L」を組み合わせます。
curl -L -O https://github.com/curl/curl/raw/master/README.mdこのURLは別のURLへ転送されるため、「-L」を付けないと中身が空(0バイト)のファイルが保存されます。
保存したファイルが空だったりエラーページのHTMLだったりする場合は、「-L」の付け忘れやURLの誤りを疑いましょう。
なお、ダウンロードしたファイルの安全性は、curlだけでは保証されません。
信頼できる配布元から取得し、チェックサム(改ざんの有無を確かめる値)が公開されている場合は照合しておくと安心です。
Windows・Mac・Linuxでの利用環境の違い
curlは、Windows・macOS・Linuxのいずれでも利用できるコマンドラインツールです。
基本的なコマンドの書き方は共通していますが、OSによって標準搭載の状況や、コマンドを解釈するシェルの仕様が異なります。
OSごとの標準搭載状況
各OSでの標準搭載状況は、次のとおりです。
| OS | 標準搭載の状況 | 入っていない場合 |
|---|---|---|
| macOS | 標準搭載 | 新しい版が必要ならHomebrewなどで導入 |
| Linux | 多くのディストリビューションで利用可能 | 最小構成やコンテナでは未導入の場合があり、aptやdnfなどで導入 |
| Windows | Windows 10(1803以降)・11に標準搭載 | curl公式サイトからWindows版を入手 |
なお、OS標準のcurlは最新版(2026年10月時点で8.23.0)より古かったり、対応機能が異なったりする場合があります。
特定のオプションを使いたい場合は、「curl –version」で実行環境のバージョンや機能を確認してください。
Windowsで注意すること
Windowsでは、コマンドプロンプトとPowerShellのどちらでもcurlを利用できますが、「curl」という名前の扱いに注意が必要です。
Windowsに標準搭載されているWindows PowerShell 5.1では、「curl」がPowerShellのコマンド「Invoke-WebRequest」の別名(エイリアス)になっています。
そのため、「curl」と入力するとcurl本体ではないコマンドが実行され、curlのオプションを付けるとエラーになります。
curl本体を実行するには、「curl.exe」と明示しましょう。
curl.exe --version別途インストールして使うPowerShell 7にはこのエイリアスがありませんが、「curl.exe」と入力しておけばどちらの環境でも確実に動きます(PowerShellの基本はこちら)。
もう一つの注意点が、複数行コマンドの書き方と引用符の扱いです。
本記事のmacOS・Linux向けのコマンドは行末の「\」で改行していますが、コマンドプロンプトでは「^」、PowerShellでは「`」(バッククォート)を使います。
また、Windows PowerShell 5.1ではJSON内の「”」がcurl.exeに正しく渡らず、APIから「JSONの形式が正しくない」というエラーが返ることがあります。
シェルによる違いを避けるには、JSONをファイルに保存し、「-d “@ファイル名”」で読み込む方法が確実です。
curl.exe -H "Content-Type: application/json" -d "@data.json" https://jsonplaceholder.typicode.com/todos事前に、「{“title”:”Learn curl”,”completed”:false,”userId”:1}」と記述した「data.json」を、コマンドを実行するフォルダにUTF-8で保存しておいてください。
このコマンドは、コマンドプロンプト・PowerShell 5.1・PowerShell 7のいずれでも実行できます。
よく使うオプション一覧
curlには、リクエストの送信方法やレスポンスの表示、ファイルの保存などを制御するためのオプションが用意されています。
ここでは、Web開発やAPIの動作確認でよく使われるものを紹介します。
| オプション | 機能 |
|---|---|
| -I | HEADリクエストを送信し、レスポンスヘッダーだけを取得する |
| -i | レスポンスヘッダーと本文を表示する |
| -L | リダイレクト先をたどる |
| -o ファイル名 | レスポンス本文を指定したファイルに保存する |
| -O | URLのファイル名で保存する |
| -s | 進捗表示やエラーメッセージを表示しない |
| -S | 「-s」と併用したときにエラーメッセージを表示する |
| -v | リクエストや接続に関する詳細情報を表示する |
| -H | リクエストヘッダーを指定する |
| -d | リクエスト本文のデータを指定する(POSTで送信される) |
| -X | HTTPメソッドを指定する |
| -u | ユーザー名とパスワードを指定する |
| -w | 転送後にステータスコードなどの情報を出力する |
| -f | HTTPエラー(400番台以上)のときにエラー終了する |
| –connect-timeout 秒数 | 接続確立までのタイムアウトを指定する |
| –max-time 秒数 | 転送全体のタイムアウトを指定する |
| -F | フォーム形式のデータを送信する |
| –json | JSONデータをPOSTで送信する(7.82.0以降) |
すべてのオプションは「curl –help all」で一覧表示でき、詳細はcurl公式マニュアルで確認できます。
よくあるエラーと対処法
curlを使用していると、URLの誤りやネットワークの問題、サーバー側の設定などによってエラーが発生することがあります。
エラーが起きた場合は、表示されたメッセージだけでなく、HTTPステータスコードや接続先の状態も確認しましょう。
ホストが見つからない・接続できない
指定したホスト名(ドメイン)が見つからない場合は、次のようなエラーが表示されます。
「Could not resolve host」は、ホスト名からIPアドレスを調べる名前解決(DNS)に失敗したことを示すエラーです。
まずは、URLのスペルや「https://」の書き方に誤りがないかを確認しましょう。
URLが正しいのに「Failed to connect」などで接続できない場合は、ネットワークやファイアウォール、VPN・プロキシ・社内ネットワークの制限が原因のこともあります。
別のネットワークや別のPCでも同じエラーになるかを確認すると、原因を切り分けやすくなります。
SSL証明書のエラーが出る
HTTPSでアクセスしたときに、証明書の検証に失敗してエラーになることがあります。
主な原因は、サーバー証明書の期限切れや、証明書の発行元を信頼できないこと、アクセス先のホスト名と証明書が一致しないことなどです。
まずは、URLが正しいか、PCの日付と時刻が正しく設定されているかを確認しましょう。
社内ネットワークやプロキシを経由している場合は、中継機器の証明書が影響していることもあるため、ネットワーク管理者に確認するのが確実です。
「-v」オプションを付けて実行すると、TLS接続や証明書の検証に関する詳細情報を確認できます。
curl -v https://example.com/
行頭の「*」は接続やTLSの情報、「>」は送信したリクエスト、「<」は受信したレスポンスを表し、どの段階でエラーになったかを確認できます。
なお、「-k」オプションを使うと証明書の検証を省略できますが、通信の安全性が確保されなくなるため、原因がわからないまま使うのは避けましょう。
社内独自の証明書を信頼させる必要がある場合は、「–cacert」で証明書ファイルを指定する方法があります。
何も表示されない・結果がおかしい
curlを実行しても何も表示されない場合、必ずしもエラーが発生しているとは限りません。
「-o」で出力先をファイルにしている場合は本文がターミナルに表示されず、「-s」を付けている場合はエラーメッセージも表示されません。
まずは指定したオプションを確認し、必要に応じて「-i」や「-v」を付けて再実行しましょう。
「-s」を使う場合も、「-sS」とすればエラーメッセージは表示されます。
また、curlは404や500が返ってきても、通信自体には成功したと判断して正常に終了します。
HTTPのエラーをcurlの終了コード(コマンドの成否を表す数値)にも反映させたい場合は、「-f」を指定します。
curl -f https://jsonplaceholder.typicode.com/todos/0存在しないIDを指定しているため、「The requested URL returned error: 404」と表示され、終了コード22でエラー終了します。
シェルスクリプトでAPIの応答を確認するときなどに便利です。
curlに関するよくある質問
Q. curlとブラウザーの違いは何ですか?
A. ブラウザーはHTMLやCSS、JavaScriptを処理してWebページを画面に描画するアプリケーションで、curlは受け取ったデータをそのまま扱うコマンドラインツールです。
レスポンス本文やヘッダー、ステータスコードを直接確認できるため、APIの動作確認や通信トラブルの調査に適しています。
Q. curlとPostmanはどちらを使えばよいですか?
A. Postmanは画面操作でAPIリクエストを作成・保存でき、リクエストの管理やチームでの共有に向いています。
curlは多くの環境ですぐに使え、コマンドをそのまま手順書やスクリプトに書けるのが利点です。
curlのコマンドはPostmanに読み込むこともできるため、用途に応じて使い分けるとよいでしょう。
Q. curlとwgetの違いは何ですか?
A. wgetはファイルのダウンロードに特化しており、Webサイトのページをまとめて取得する機能などを備えています。
curlはヘッダーの指定やAPIへのデータ送信など、リクエストを細かく組み立てる用途に向いています。
なお、macOSやWindowsにはwgetが標準搭載されていないため、追加のインストールなしで使えるのはcurlです。
Q. curlを使うためにプログラミングの知識は必要ですか?
A. Webページの取得や公開APIからのデータ取得であれば、プログラミングの知識がなくても始められます。
認証が必要なAPIや複雑なリクエストを扱う場合は、HTTPメソッドやヘッダー、JSONの書式などの理解が役立ちます。
まとめ
curlは、Webページの取得だけでなく、APIへのGET・POSTリクエストの送信やファイルのダウンロード、ステータスコードの確認など、幅広い用途に利用できるコマンドラインツールです。
Windows・macOS・Linuxのいずれでも利用できますが、PowerShellでの「curl.exe」の指定や、引用符・改行の書き方など、実行環境に合わせてコマンドを調整することが重要です。
まずは本記事のコマンドを順番に実行し、APIドキュメントや手順書に載っているcurlコマンドを読み解くところから始めてみてください。