【初心者向け】Windowsでのcurlコマンドの使い方:Webとの連携をマスターしよう
Webブラウザを使わずに、コマンドラインからWebサイトの情報を取得したり、APIにデータを送信したりする方法を知っていますか?開発者やシステム管理者にとって、これは非常に基本的なスキルであり、日々の作業を効率化するために欠かせません。そして、その中心的な役割を果たすコマンドの一つが「curl
」です。
「curl
」は、多様なプロトコル(HTTP, HTTPS, FTPなど)を使ってデータを送受信するための、非常に強力で多機能なコマンドラインツールです。Windows環境でも利用でき、Web開発、APIテスト、ファイルダウンロード、自動化スクリプトの作成など、幅広い用途で活躍します。
しかし、「コマンドラインツール」と聞くと、難しそうだと感じる初心者の方もいるかもしれません。また、curl
には非常に多くのオプションがあり、何から手をつければいいか分からないという声もよく聞かれます。
この記事は、Windows環境でcurl
コマンドを初めて使う方、あるいは基本的な使い方は知っているけれど、もっと色々なことができるようになりたいと考えている方を対象としています。
この記事では、以下の内容を、できるだけ分かりやすく、具体的な例を交えながら解説していきます。
curl
とは何か、なぜWindowsで使うと便利なのか- Windowsでの
curl
の準備(インストールと確認) - 最も基本的なWeb情報の取得方法(GETリクエスト)
- ファイルやWebページの内容をダウンロードする方法
- WebサイトやAPIにデータを送信する方法(POSTリクエストなど)
- ヘッダー情報の操作や確認方法
- 認証が必要なサイトへのアクセス方法
- その他の便利な機能とオプション
- Windows環境特有の注意点とトラブルシューティング
この記事を読み終える頃には、あなたはcurl
コマンドを使って、Webとの連携を自在に行えるようになるでしょう。さあ、curl
の世界へ飛び込んでみましょう!
1. curlとは何か、なぜWindowsで使うのか
1.1 curlの概要
curl
(カール)は、Daniel Stenberg氏によって開発された、コマンドライン上でデータを転送するための非常に汎用的なツールです。URLシンタックス(書式)を使って様々なプロトコル(HTTP, HTTPS, FTP, FTPS, SCP, SFTP, TFTP, DICT, TELNET, LDAP, LDAPS, FILE, POP3, IMAP, SMTP, RTMP, RTSPなど)経由でデータを送受信できます。
主な用途としては、
- WebサイトのHTMLソースコードを取得する
- APIにリクエストを送信し、レスポンスデータを受け取る
- インターネット上のファイルをダウンロード・アップロードする
- ネットワークの疎通確認やデバッグを行う
などがあります。
その多機能さと安定性から、開発者、システム管理者、テスターなど、様々な分野のプロフェッショナルに広く利用されています。
1.2 なぜWindowsでcurlを使うのか
Windowsでは、Webブラウザや専用のGUIツールを使えば、ほとんどのWeb操作は可能です。しかし、コマンドラインツールであるcurl
を使うことには、いくつかの大きなメリットがあります。
- 自動化: スクリプトやバッチファイルに組み込むことで、繰り返し行う作業(定期的なデータ取得、バックアップ、テストなど)を自動化できます。GUI操作では難しい自動化が容易になります。
- 効率性: GUIツールを起動し、マウスで操作するよりも、コマンド一つで素早く目的の操作を実行できる場合があります。特に複数の操作を連続して行いたい場合に威力を発揮します。
- デバッグ・テスト: API開発やWebサイトのトラブルシューティングにおいて、特定の条件(特定のヘッダーを付与する、POSTデータを送信するなど)でリクエストを送信し、レスポンスを詳細に確認するのに非常に便利です。ブラウザの開発者ツールよりも、より低レベルな通信を確認できます。
- 環境への依存が少ない:
curl
はクロスプラットフォームで動作するため、Windows、macOS、Linuxなど、様々なOSで同じように利用できます。これにより、異なる環境間での作業の互換性が高まります。 - 学習コストの低さ: 基本的な使い方はシンプルであり、多くのオプションがありますが、必要なものから少しずつ学んでいくことができます。
最近のWindows 10やWindows 11には、curl
が標準で搭載されるようになりました。これにより、特別なインストール作業なしに、すぐにコマンドプロンプトやPowerShellからcurl
を利用開始できます。これは、以前のWindowsバージョンと比較して、curl
を導入するハードルが劇的に下がったことを意味します。
この記事は、この「Windows標準搭載のcurl
」を前提に解説を進めます。
2. Windowsでのcurlの準備
幸いなことに、比較的新しいWindows 10やWindows 11をお使いであれば、多くの場合はすでにcurl
がインストールされています。まずは、ご自身の環境でcurl
が利用できるか確認してみましょう。
2.1 curlのインストール確認
コマンドプロンプト(cmd.exe
)またはPowerShellを起動します。Windowsの検索バーに「cmd」または「PowerShell」と入力して起動できます。
プロンプトが表示されたら、以下のコマンドを入力してEnterキーを押します。
cmd
curl --version
または
powershell
curl --version
もしcurl
がインストールされていれば、以下のようにバージョン情報が表示されます。
curl 7.77.0 (x86_64-pc-win32) libcurl/7.77.0 Schannel zlib/1.2.11
Release-Date: 2021-05-26
Protocols: dict file ftp ftps http https imap imaps pop3 pop3s smtp smtps telnet tftp
Features: AsynchDNS IPv6 Largefile SSPI Kerberos SPNEGO NTLM SSL libz
表示されるバージョン情報は環境によって異なりますが、このようにバージョンや機能に関する情報が表示されれば、curl
は利用可能です。
もし、「’curl’ は、内部コマンドまたは外部コマンド、操作可能なプログラムまたはバッチ ファイルとして認識されていません。」のようなエラーメッセージが表示された場合、curl
はまだインストールされていないか、環境変数Path
が正しく設定されていません。
2.2 curlのインストール方法(もし必要なら)
最近のWindowsでは標準搭載されていますが、古いバージョンを使っている場合や、何らかの理由で標準搭載版が利用できない場合は、手動でインストールする必要があります。いくつかの方法がありますが、初心者には以下のいずれかの方法がおすすめです。
方法1:ScoopやChocolateyといったパッケージマネージャーを使う
ScoopやChocolateyは、Windows用のソフトウェアをコマンドラインで簡単にインストール・管理できるツールです。これらのツールがインストール済みであれば、以下のコマンドでcurl
をインストールできます。(これらのツール自体のインストール方法はここでは割愛します)
- Scoop:
cmd
scoop install curl - Chocolatey:
cmd
choco install curl
これらの方法の利点は、依存関係の解決やアップデートもまとめて行ってくれることです。
方法2:curl公式サイトからダウンロードする
最も基本的な方法は、curl
の公式ウェブサイトから実行ファイルをダウンロードすることです。
curl
の公式サイト(https://curl.se/
)にアクセスします。- ダウンロードページ(
https://curl.se/download.html
)に進みます。 - お使いのWindowsのバージョン(32bitまたは64bit)に合わせて、最新版のzipファイルをダウンロードします。通常は「Win64 – x86_64」のリンクから、SSL対応版(schannelやOpenSSLを含むもの)を選ぶと良いでしょう。
- ダウンロードしたzipファイルを、任意の場所に展開します(例:
C:\tools\curl
)。 - 展開したフォルダ内の
bin
ディレクトリ(例:C:\tools\curl\bin
)にcurl.exe
があります。 - この
curl.exe
を実行できるように、そのディレクトリのパスをWindowsの環境変数Path
に追加します。環境変数Path
の設定方法は、Windowsのバージョンによって多少異なりますが、「システムのプロパティ」→「環境変数」から設定できます。この設定を行うことで、どのディレクトリからでもcurl
コマンドを実行できるようになります。
環境変数Path
を設定したら、新しいコマンドプロンプトまたはPowerShellを開き直し、再度curl --version
コマンドで確認してみてください。
インストールが完了し、curl --version
でバージョン情報が表示されることを確認できたら、次のステップに進みましょう。
3. curlの基本:Webページの取得(GETリクエスト)
curl
の最も一般的で基本的な使い方は、指定したURLから情報を取得することです。これはHTTPプロトコルにおける「GET」メソッドに相当します。WebブラウザがWebページを表示するときに行っているのも、基本的にこのGETリクエストです。
3.1 最も基本的な使い方
curl
コマンドの後に、取得したいWebページのURLを指定するだけです。
cmd
curl https://example.com
このコマンドを実行すると、https://example.com
のWebサーバーにGETリクエストが送信され、WebページのHTMLソースコードがコマンドプロンプトの画面(標準出力)に表示されます。
実行例:
“`cmd
C:\Users\your_user> curl https://example.com
Example Domain
This domain is for use in illustrative examples in documents. You may use this
domain in literature without prior permission or fee.
“`
画面にHTMLが表示されましたね。これが、curl
を使った最も基本的な情報の取得方法です。
3.2 URLの指定方法
curl
は様々なプロトコルをサポートしていますが、Webアクセスでは主にhttp://
またはhttps://
で始まるURLを使用します。
- http://: 暗号化されていない通信です。一般的なWebサイトや古いシステムで使用されます。
- https://: SSL/TLSによって暗号化された通信です。セキュリティが重要なWebサイト(オンラインバンキング、ショッピングサイト、ほとんどのモダンなWebサイト)で広く使われています。
curl
はデフォルトでHTTPSをサポートしています。
プロトコル部分(http://
やhttps://
)を省略した場合、curl
は通常http://
を推測しようとしますが、明示的に指定するのが確実です。
また、ポート番号を指定することもできます。Webサイトの場合、HTTPは通常80番ポート、HTTPSは通常443番ポートを使用するため、これらの場合はポート番号を省略できます。もし異なるポートを使用している場合は、URLの末尾に:ポート番号
のように指定します。
cmd
curl http://example.com:8080 # 8080番ポートにHTTPリクエスト
3.3 出力の確認とファイルへの保存
curl
はデフォルトで取得したデータを標準出力(画面)に表示します。しかし、Webページ全体やファイルをダウンロードしたい場合、画面に表示するのではなく、ファイルとして保存したいと思うはずです。そのためのオプションが-o
と-O
です。
-
-o <出力ファイル名>
または--output <出力ファイル名>
:
取得したデータを指定したファイル名で保存します。ファイル名を自由に決めたい場合に便利です。cmd
curl https://example.com -o example.html
このコマンドは、https://example.com
のHTMLソースを、カレントディレクトリにexample.html
という名前で保存します。 -
-O
または--remote-name
:
取得したデータのURLからファイル名を自動的に判断して保存します。特にインターネット上のファイルをダウンロードする場合に便利です。cmd
curl -O https://curl.se/logo/curl-logo.svg
このコマンドは、https://curl.se/logo/curl-logo.svg
にある画像を、URLの最後の部分からファイル名を判断して、カレントディレクトリにcurl-logo.svg
という名前で保存します。
注意点:
-o
や-O
で指定したファイルが既に存在する場合、デフォルトでは上書きされます。-o
オプションでディレクトリを指定することもできますが、通常はカレントディレクトリまたは絶対パスでファイル名を指定します。
これで、Webページの内容を画面に表示したり、ファイルとして保存したりする基本的な方法が分かりました。
4. HTTPメソッド:GET以外の操作を行う
Webとの連携は、単に情報を取得する(GET)だけではありません。Webサイトにログインしたり、フォームからデータを送信したり、API経由でサーバー上のデータを更新・削除したりする場合、GET以外のHTTPメソッドを使用します。curl
は、これらの様々なHTTPメソッドをサポートしています。
最もよく使われるのはGETとPOSTですが、その他にもPUT, DELETE, HEADなどがあります。HTTPメソッドは-X
オプションで指定します。
4.1 GETメソッド(再確認)
GETメソッドは、サーバーからリソースを取得するために使用されます。これはcurl
のデフォルトのメソッドなので、通常は-X GET
のように明示的に指定する必要はありません。単にURLを指定すればGETリクエストになります。
cmd
curl https://api.example.com/users/123 # ユーザーID 123の情報を取得
GETリクエストでは、データをサーバーに送信する際に、URLの末尾にクエリパラメータとして付加することが一般的です(例: ?key1=value1&key2=value2
)。クエリパラメータについては後述します。
4.2 POSTメソッド
POSTメソッドは、サーバーにデータを送信し、新しいリソースを作成したり、特定のアクションを実行したりするために使用されます。Webサイトのログインフォームや、APIにデータを送信する際によく使われます。
POSTメソッドを使用するには、-X POST
オプションと、送信するデータを指定するためのオプションを組み合わせます。
-X POST
: HTTPメソッドとしてPOSTを指定します。-d <データ>
または--data <データ>
: HTTPリクエストのボディに含めるデータを指定します。通常、フォームデータ(key1=value1&key2=value2
形式)やJSONデータを送信するのに使われます。データにスペースや特殊文字が含まれる場合は、引用符で囲む必要があります。
例:簡単なフォームデータをPOST送信
cmd
curl -X POST -d "username=testuser&password=testpass" https://example.com/login
このコマンドは、https://example.com/login
に対してPOSTリクエストを送信し、リクエストボディにusername=testuser&password=testpass
というデータを含めます。
例:JSONデータをPOST送信
APIによっては、データをJSON形式で送信する必要があります。その場合、送信するデータは-d
オプションで指定し、データがJSONであることを示すために適切なContent-Type
ヘッダーを-H
オプションで追加するのが一般的です。
cmd
curl -X POST -H "Content-Type: application/json" -d "{\"name\":\"Alice\",\"age\":30}" https://api.example.com/users
注意: WindowsのコマンドプロンプトでJSON内のダブルクォーテーションを扱う場合、バックスラッシュ(\
)でエスケープする必要があります。PowerShellの場合はシングルクォーテーションで全体を囲むことでエスケープが不要になることが多いです。上記の例はコマンドプロンプト形式です。PowerShellでは以下のようになります。
powershell
curl -X POST -H "Content-Type: application/json" -d '{"name":"Alice","age":30}' https://api.example.com/users
環境によって引用符の扱いが異なるため注意が必要です。複雑なJSONの場合は、ファイルに保存して-d @ファイル名
のように指定することもできます。
-
-F <名前=値>
または--form <名前=値>
:
multipart/form-data形式でデータを送信する場合に使用します。主にファイルのアップロードや、複数のデータをまとめて送信する場合に使われます。Webサイトのファイルアップロードフォームなどがこの形式を使用します。cmd
curl -X POST -F "file=@path/to/your/file.txt" -F "description=Uploaded via curl" https://example.com/upload
-F "file=@path/to/your/file.txt"
の部分は、file
という名前で指定したローカルファイル(path/to/your/file.txt
)を送信することを意味します。@
を付けないとファイルの内容ではなくファイル名自体がデータとして送信されてしまいます。
POSTリクエストは、サーバーにデータを渡すための非常に重要な手段です。-d
と-F
オプションの違い、そしてJSONデータの扱い方について理解しておきましょう。
4.3 PUTメソッド
PUTメソッドは、指定したURLにリソースを「置く」(作成または更新する)ために使用されます。例えば、特定のIDを持つリソース全体を、送信したデータで置き換える場合などに使われます。
cmd
curl -X PUT -H "Content-Type: application/json" -d '{"id":123,"name":"Alice Updated"}' https://api.example.com/users/123
この例では、IDが123のユーザーリソースを、送信したJSONデータで更新しようとしています。-d
オプションで送信データを指定するのはPOSTと同じです。
4.4 DELETEメソッド
DELETEメソッドは、指定したURLのリソースを削除するために使用されます。
cmd
curl -X DELETE https://api.example.com/users/123
この例では、IDが123のユーザーリソースを削除しようとしています。DELETEリクエストでは、通常リクエストボディにデータを含めることはありません。
4.5 その他のメソッド
HTTPには他にもHEAD, OPTIONS, PATCHなどのメソッドがありますが、これらも-X
オプションで指定できます。
-X HEAD
: リクエストに対するヘッダー情報のみを取得します。レスポンスボディは含まれません。これは、リソースが存在するかどうかや、最終更新日時などを確認するのに便利です。-I
オプションと同じです(後述)。-X OPTIONS
: 指定したURLに対してどのようなHTTPメソッドが利用可能かを確認します。-X PATCH
: リソースの一部を更新するために使用されます。PUTがリソース全体を置き換えるのに対し、PATCHは部分的な変更に利用されます。
-X
オプションは、デフォルトのGET以外のメソッドを使用したい場合に必ず必要になります。
5. ヘッダーの操作:リクエストとレスポンスの情報を確認・制御する
HTTP通信では、リクエストやレスポンスの本体(ボディ)だけでなく、「ヘッダー」という付加情報も非常に重要です。ヘッダーには、データの種類、エンコーディング、認証情報、クッキー、キャッシュの制御方法など、通信に関する様々なメタデータが含まれています。
curl
を使うと、これらのヘッダー情報を確認したり、独自にヘッダーを追加してリクエストを送信したりすることができます。
5.1 ヘッダーの確認
-
-I
または--head
:
指定したURLに対するHEADリクエストを送信し、レスポンスヘッダーのみを表示します。Webサイトのステータスコード(正常に表示できるかなど)や、サーバーの種類、最終更新日時などを素早く確認したい場合に便利です。レスポンスボディは表示されません。cmd
curl -I https://example.com実行例:
“`cmd
C:\Users\your_user> curl -I https://example.com
HTTP/2 200
accept-ranges: bytes
cache-control: max-age=604800
content-type: text/html; charset=UTF-8
etag: “3147526947+ident”
expires: Tue, 07 May 2024 09:58:31 GMT
last-modified: Wed, 17 Oct 2018 17:18:26 GMT
server: ECS (oxr/8306)
vary: Accept-Encoding
x-cache: HIT
content-length: 1270``
HTTP/2 200`は、リクエストが成功したこと(ステータスコード200 OK)を示しています。その他の行は、サーバーやコンテンツに関する様々な情報です。 -
-i
または--include
:
GETリクエストなどでレスポンスボディを取得する際に、レスポンスヘッダーも一緒に表示します。通常はヘッダー情報なしでボディだけが表示されるため、ヘッダーも含めて全体のレスポンスを確認したい場合に便利です。cmd
curl -i https://example.com実行例:
“`cmd
C:\Users\your_user> curl -i https://example.com
HTTP/2 200
accept-ranges: bytes
cache-control: max-age=604800
content-type: text/html; charset=UTF-8
etag: “3147526947+ident”
expires: Tue, 07 May 2024 09:58:31 GMT
last-modified: Wed, 17 Oct 2018 17:18:26 GMT
server: ECS (oxr/8306)
vary: Accept-Encoding
x-cache: HIT
content-length: 1270<!doctype html>
… (HTMLソースコードが続く) …
``
-i`オプションを使うと、ヘッダー情報とボディ情報が両方表示されるのが分かります。
5.2 ヘッダーの指定
-
-H <ヘッダー名: ヘッダー値>
または--header <ヘッダー名: ヘッダー値>
:
送信するHTTPリクエストに、カスタムヘッダーを追加するために使用します。認証情報や、送信するデータの形式を示す場合など、様々な目的で利用されます。複数のヘッダーを追加したい場合は、-H
オプションを複数指定します。cmd
curl -H "User-Agent: MyCustomCurlClient/1.0" -H "Accept-Language: ja,en;q=0.9" https://example.com
この例では、User-Agent
ヘッダーとAccept-Language
ヘッダーを指定してリクエストを送信しています。サーバーはこれらのヘッダーを読み取り、レスポンスの内容を変えたり、アクセス元の情報を記録したりします。
よく使われる-H
オプションの使用例です。
-
Content-Type: リクエストボディに含まれるデータの形式を指定します。特にPOSTやPUTでデータを送信する際に重要です。
- フォームデータ:
-H "Content-Type: application/x-www-form-urlencoded"
(-d
でkey=value形式のデータを送る場合のデフォルトです) - JSONデータ:
-H "Content-Type: application/json"
- ファイルのアップロードなど:
-H "Content-Type: multipart/form-data"
(-F
オプションを使った場合のデフォルトです)
cmd
curl -X POST -H "Content-Type: application/json" -d '{"name":"Bob"}' https://api.example.com/users - フォームデータ:
-
Authorization: 認証情報を含めるために使用します。ベーシック認証やBearer認証など、様々な形式があります。認証については後述します。
“`cmd
Bearer認証の例
curl -H “Authorization: Bearer your_access_token” https://api.example.com/data
“` -
Cookie: Cookie情報を送信します。セッションを維持したり、パーソナライズされたコンテンツを取得したりするのに使われます。Cookieについては後述のCookieに関するセクションで詳しく説明します。
cmd
curl -H "Cookie: sessionid=abcdef123456" https://example.com/profile
-H
オプションは、単にWebページを取得するだけでなく、APIとの複雑な連携や、Webアプリケーションのデバッグを行う上で非常に重要なオプションです。
6. データの送信:GETとPOST/PUTでの違い
Webサーバーにデータを送信する方法は、使用するHTTPメソッドによって異なります。主にGET、POST、PUTメソッドでデータを送信しますが、その方法と目的は異なります。
6.1 GETリクエストでのデータ送信(クエリパラメータ)
GETリクエストでは、データをURLのクエリパラメータとして送信するのが一般的です。クエリパラメータは、URLの末尾に?
を付けた後に、キー=値
の形式で記述し、複数のパラメータは&
で区切ります。
cmd
curl "https://example.com/search?query=curl command&category=software"
この例では、query=curl command
とcategory=software
という2つのデータをURLの一部としてサーバーに送信しています。
注意点:
- URLの長さには制限があるため、大量のデータを送信するには向きません。
- クエリパラメータはURLにそのまま表示されるため、パスワードなどの機密情報を送るべきではありません。
- スペースや日本語などの特殊文字を含む場合は、URLエンコードする必要があります。
curl
は通常自動的にエンコードを行いますが、手動で正確なURLを指定することも重要です。
6.2 POST/PUTリクエストでのデータ送信(リクエストボディ)
POSTやPUTリクエストでは、データをHTTPリクエストの「ボディ」に含めて送信するのが一般的です。これにより、GETリクエストのURL長制限を気にすることなく、大量のデータや機密情報(HTTPS使用時)を送信できます。
データの形式は様々ですが、よく使われるのは以下の形式です。
-
application/x-www-form-urlencoded: Webサイトの標準的なフォーム送信で使われる形式です。
キー1=値1&キー2=値2
のような形式のデータを送信します。-d
または--data
オプションで指定します。cmd
curl -X POST -d "name=Taro Yamada&[email protected]" https://example.com/register
-d
オプションでキー=値
形式のデータを指定すると、curl
は自動的にContent-Type: application/x-www-form-urlencoded
ヘッダーを追加します(明示的に指定しない場合)。 -
application/json: APIとの連携で最もよく使われる形式の一つです。JSON形式のデータを送信します。
-d
または--data
オプションで指定し、-H "Content-Type: application/json"
ヘッダーを通常一緒に指定します。cmd
curl -X POST -H "Content-Type: application/json" -d '{"title":"New Article","body":"This is the content."}' https://api.example.com/articles
前述の通り、WindowsのコマンドプロンプトとPowerShellでは引用符やエスケープのルールが異なる場合があるため注意が必要です。複雑なJSONや長いJSONの場合は、テキストファイルに保存して、-d @ファイル名
のように指定するのがおすすめです。例:
request.json
というファイルに{"title":"New Article","body":"This is the content."}
と記述した場合。
cmd
curl -X POST -H "Content-Type: application/json" -d @request.json https://api.example.com/articles
この方法だと、コマンドライン上で複雑なエスケープをする必要がなくなり、非常に便利です。 -
multipart/form-data: ファイルのアップロードや、複数の異なる種類のデータをまとめて送信する場合に使われる形式です。
-F
または--form
オプションで指定します。cmd
curl -X POST -F "document=@path/to/your/report.pdf" -F "submitter=Alice" https://example.com/upload-report
この例では、document
という名前でPDFファイルを、submitter
という名前でテキストデータ(Alice
)を同時に送信しています。-F
オプションを使うと、curl
は自動的にContent-Type: multipart/form-data
ヘッダーを追加します。
POST/PUTリクエストでデータを送信する際には、-d
または-F
オプションを適切に使い分けること、そして必要に応じて-H "Content-Type: ..."
ヘッダーを指定することが重要です。特にAPIとの連携では、APIドキュメントを参照して、どの形式でデータを送信する必要があるかを確認しましょう。
7. レスポンスの扱い:取得した情報を理解する
curl
コマンドを実行してデータを受信した後、そのレスポンスがどのようなものなのかを理解することが重要です。単にWebページの内容が表示されるだけでなく、通信の状態を示すステータスコード、レスポンスに関するメタデータであるヘッダー、そして実際に送られてきたデータ本体(ボディ)が含まれています。
7.1 ステータスコードの確認
HTTPレスポンスには、リクエストが成功したか、エラーが発生したかなど、処理の結果を示す「ステータスコード」が含まれています。例えば、200 OK
は成功、404 Not Found
はリソースが見つからない、500 Internal Server Error
はサーバー内部のエラーなどを示します。
前述の-I
(または--head
)オプションや-i
(または--include
)オプションを使うと、レスポンスヘッダーの最初の行にステータスコードが表示されます。
cmd
curl -I https://example.com
出力の最初の行にある HTTP/1.1 200 OK
や HTTP/2 200
の数字部分(200)がステータスコードです。
-w
または--write-out
オプションを使うと、レスポンスに関する様々な情報をカスタマイズ可能な形式で出力できます。これを使ってステータスコードだけを簡単に取得することも可能です。
cmd
curl -s -o NUL -w "%{http_code}\n" https://example.com
このコマンドでは、
* -s
(--silent
): 進捗情報やエラーメッセージ以外の出力を抑制します。(通常は不要なHTML出力を防ぐ)
* -o NUL
: レスポンスボディをファイルに保存せず、Windowsの特別なデバイスであるNUL(何も出力しない)に捨てることで、画面へのボディ表示を防ぎます。
* -w "%{http_code}\n"
(--write-out
): 指定した形式で情報を出力します。%{http_code}
はステータスコードを表す変数です。\n
は改行です。
このコマンドを実行すると、画面にはステータスコードである200
のみが表示されます。これは、スクリプトなどでステータスコードを確認して処理を分岐させたい場合に非常に便利です。
7.2 レスポンスヘッダーの表示
-i
または--include
オプションを使うと、レスポンスボディの前にレスポンスヘッダーが表示されます。これにより、サーバーの種類、Content-Type
、Set-Cookie
(サーバーがクライアントに保存してほしいCookie)、キャッシュ関連の情報などを確認できます。
cmd
curl -i https://example.com
レスポンスヘッダーを詳細に分析することで、WebサーバーやAPIの挙動を理解する助けになります。
7.3 レスポンス本文のみの表示
デフォルトでは、curl
はレスポンスボディ(Webページの内容など)を標準出力に表示します。もしヘッダー情報を表示したくない場合は、特にオプションを指定する必要はありません(-i
や-I
を使わなければデフォルトでボディのみ表示されます)。
エラーが発生した場合に、エラーメッセージのみを表示し、正常なレスポンスボディは表示しないようにしたい場合は、-S
オプションと-s
オプションを組み合わせて使うことがあります。
-s
または--silent
: 進捗情報やエラーメッセージ以外の冗長な出力を抑制します。-S
または--show-error
:-s
と組み合わせて使用した場合でも、エラーメッセージ(例: 接続エラー、ファイルが見つからないなど)は表示するようにします。
cmd
curl -s -S https://non-existent-domain.com
このコマンドを実行すると、存在しないドメインへのアクセス試行によるエラーメッセージが表示されますが、通常の進捗情報は表示されません。
7.4 詳細な情報の表示
-
-v
または--verbose
:
リクエストとレスポンスに関する非常に詳細な情報を表示します。実際にcurl
がサーバーとどのように通信しているのか(使用しているプロトコル、送信しているヘッダー、SSL/TLSのネゴシエーションなど)を確認できます。デバッグ目的で非常に役立ちます。cmd
curl -v https://example.com
-v
オプションを使うと、>
で始まる行がクライアント(curl
)からサーバーへ送信されたリクエスト、<
で始まる行がサーバーからクライアントへ返されたレスポンスのヘッダー、*
で始まる行が接続に関する補足情報として表示されます。レスポンスボディもその後に表示されます。出力は非常に詳細になりますが、通信のどの段階で問題が発生しているかなどを特定するのに役立ちます。初心者にとっては最初は情報過多に感じるかもしれませんが、困ったときには試してみる価値のあるオプションです。
レスポンスの扱い方を理解することは、curl
を使ったWeb連携において非常に重要です。ステータスコードで結果を確認し、ヘッダーで付加情報を得て、必要に応じて詳細なデバッグ情報を表示する、という流れを覚えておきましょう。
8. 認証:パスワードで保護されたリソースにアクセスする
多くのWebサイトやAPIでは、情報にアクセスするために認証が必要です。curl
は様々な認証方法に対応しており、コマンドラインから認証情報を渡してリソースにアクセスできます。
8.1 ベーシック認証
ベーシック認証は、ユーザー名とパスワードをBase64エンコードしてヘッダーに含める、比較的シンプルな認証方法です。curl
では-u
または--user
オプションを使って認証情報を指定できます。
-
-u <ユーザー名>:<パスワード>
または--user <ユーザー名>:<パスワード>
:
ベーシック認証のユーザー名とパスワードを指定します。cmd
curl -u "myuser:mypassword" https://example.com/protected/resource
パスワードをコマンドラインに平文で書くのはセキュリティ上リスクがあるため、curl
を実行したシェルの履歴などにパスワードが残ってしまいます。より安全な方法として、-u ユーザー名
のようにパスワードを省略して実行すると、curl
がパスワードの入力を促してくれます。cmd
curl -u "myuser" https://example.com/protected/resource
Enter host password for user 'myuser':
このように表示されたら、パスワードを入力してEnterキーを押します。これにより、パスワードがコマンド履歴に残るのを防ぐことができます。
8.2 Bearer認証(トークン認証)
API認証で近年よく使われるのがBearer認証です。これは、APIキーやアクセストークンなどのトークンをAuthorization: Bearer <トークン>
という形式でヘッダーに含めて送信する方法です。curl
では-H
オプションを使ってAuthorizationヘッダーを追加します。
cmd
curl -H "Authorization: Bearer your_access_token_here" https://api.example.com/data
your_access_token_here
の部分を、実際に取得したアクセストークンに置き換えて実行します。この方法はAPIのドキュメントに記載されていることが多いので、APIを利用する際は確認しましょう。
8.3 その他の認証方法
curl
は、上記の他にDigest認証、NTLM認証、Kerberos認証など、様々な認証プロトコルに対応しています。特定の種類の認証が必要な場合は、curl
のドキュメントを参照するか、-u
オプションや-H
オプションと組み合わせて、必要な情報を渡す方法を確認してください。
認証情報の取り扱いには十分注意が必要です。特に公開された場所でパスワードをコマンドラインに直接入力したり、スクリプトにハードコードしたりすることは避けるべきです。可能な場合は、環境変数を使ったり、安全なパスワード入力方法を利用したりすることを検討しましょう。
9. リダイレクトの処理:転送先のURLに自動でアクセスする
Webサイトにアクセスした際、サーバーから「このページは別のURLに移転しました」という指示(リダイレクト)が返されることがあります。ブラウザは自動的にその新しいURLにアクセスし直してくれますが、curl
はデフォルトではリダイレクトに従いません。リダイレクトされたURLに自動でアクセスしたい場合は、オプションを指定する必要があります。
9.1 リダイレクトとは
リダイレクトは、HTTPステータスコードの3xx(例: 301 Moved Permanently
, 302 Found
, 303 See Other
, 307 Temporary Redirect
, 308 Permanent Redirect
)によってサーバーからクライアントに指示されます。レスポンスヘッダーにはLocation
フィールドが含まれており、そこに新しい転送先のURLが記述されています。
デフォルトでcurl
がリダイレクトに従わないことを確認してみましょう。多くのWebサイトはhttp://
からhttps://
へのリダイレクトを設定しています。
cmd
curl http://example.com
このコマンドを実行すると、多くの場合、HTMLソースコードが表示される代わりに、リダイレクトを示すヘッダー情報(-i
オプションを付けている場合)や、「Moved Permanently」といったメッセージが表示されるだけかもしれません。
9.2 自動追跡 (-L
)
-
-L
または--location
:
このオプションを指定すると、curl
はサーバーからリダイレクトの指示を受け取った際に、その新しいURLに自動的にアクセスし直します。Webサイトの最終的なコンテンツを取得したい場合に非常に便利です。cmd
curl -L http://example.com
今度は、http://example.com
へのアクセスから始まったリクエストが、サーバーからのリダイレクト指示(例:Location: https://example.com/
)に従って自動的にhttps://example.com
に再リクエストされ、最終的なページのHTMLソースコードが表示されるはずです。
多くのWebサイトやAPIアクセスにおいて、リダイレクトは一般的な挙動です。目的のデータにたどり着くためには、-L
オプションが不可欠になる場面が多くあります。-L
オプションを付けずに期待する結果が得られない場合は、リダイレクトが発生していないか疑ってみると良いでしょう。
10. プロキシの設定:社内ネットワークなどからアクセスする
企業などのネットワーク環境では、インターネットへのアクセスがプロキシサーバーを経由するように設定されていることがよくあります。curl
もプロキシサーバー経由でのアクセスをサポートしています。
-
-x <プロキシURL>
または--proxy <プロキシURL>
:
指定したプロキシサーバーを経由してリクエストを送信します。プロキシURLは通常、http://ホスト名:ポート番号
またはhttp://ユーザー名:パスワード@ホスト名:ポート番号
のような形式で指定します。cmd
curl -x http://proxy.example.com:8080 https://www.google.com
認証が必要なプロキシの場合は、ユーザー名とパスワードを含めて指定します。cmd
curl -x http://proxyuser:[email protected]:8080 https://www.google.com
パスワードをコマンドラインに書くのはセキュリティリスクがあるので、環境変数を使うなどの別の方法も検討してください。
また、環境変数HTTP_PROXY
またはHTTPS_PROXY
にプロキシURLを設定しておくと、curl
は自動的にそのプロキシを使用します。コマンドラインで毎回指定する手間が省けます。
Windowsで環境変数を設定するには、「システムのプロパティ」→「環境変数」を使用するか、コマンドプロンプトやPowerShellでset HTTP_PROXY=...
のようにコマンドを実行します(ただし、この方法で設定した環境変数はそのセッション限りで有効です)。
cmd
set HTTP_PROXY=http://proxy.example.com:8080
curl https://www.google.com
これにより、コマンドラインで-x
オプションを指定しなくてもプロキシ経由でアクセスできるようになります。
社内ネットワークなど、特別なネットワーク環境からインターネット上のリソースにアクセスする必要がある場合は、プロキシ設定が必須になることがあります。
11. SSL/TLS:安全なHTTPS通信
インターネット上の通信の多くは、セキュリティ確保のためにHTTPS(HTTP over SSL/TLS)が使用されています。curl
はHTTPSに標準で対応しており、特別なオプションを指定しなくても通常はHTTPSサイトにアクセスできます。
11.1 HTTPSへのアクセス
URLをhttps://
で始めるだけで、curl
は自動的にSSL/TLSによる暗号化通信を行います。
cmd
curl https://www.google.com
この際、curl
は接続先のサーバーから送られてくるSSL証明書を検証し、信頼できる認証局によって署名されているか、期限切れではないかなどをチェックします。検証に成功すれば、安全な通信路が確立されます。
11.2 証明書関連のエラー回避 (-k
)
しかし、自己署名証明書を使っているサイトや、何らかの理由で証明書の検証が失敗する場合(例えば、会社のイントラネットで独自の証明書を使っている、中間者攻撃の可能性があるなど)、curl
はデフォルトで通信を拒否し、エラーメッセージを表示します。
このような場合、検証をスキップして強制的に接続するためのオプションがあります。
-
-k
または--insecure
:
サーバー証明書の検証を行わずに、HTTPS接続を確立します。cmd
curl -k https://self-signed.example.com/非常に重要な注意点:
-k
オプションは、セキュリティ上のリスクを無視することになります。証明書検証は、接続先のサーバーが本当に意図した相手であるかを確認するための重要なプロセスです。安易に-k
オプションを使用すると、悪意のある第三者による中間者攻撃などに気づけなくなる可能性があります。-k
オプションは、あくまでテスト環境や、信頼できる内部ネットワークでのみ使用するなど、使用する状況を限定すべきです。インターネット上の未知のサイトに対して-k
オプションを使うことは、セキュリティ上推奨されません。証明書のエラーが発生した場合は、その原因(証明書の問題、ネットワークの問題など)を調査する方が安全です。
ほとんどの場合、公開されているHTTPSサイトにアクセスする際には-k
オプションは不要です。証明書検証が正常に行われるためです。
12. ダウンロードとアップロード
curl
は、Webページの内容を取得するだけでなく、インターネット上のファイルをダウンロードしたり、逆にファイルをアップロードしたりする機能も持っています。
12.1 ダウンロード (-o
, -O
)
ファイルダウンロードの基本的な方法は、既にセクション3で解説した-o
オプションと-O
オプションです。
-o <出力ファイル名>
: ファイル名を指定して保存。
cmd
curl -o my_download.zip https://example.com/files/latest.zip-O
: URLからファイル名を推測して保存。
cmd
curl -O https://example.com/images/logo.png
-O
オプションは複数のURLを同時に指定することも可能で、その場合、それぞれのURLからファイル名を推測して複数のファイルをダウンロードします。
cmd
curl -O https://example.com/file1.txt -O https://example.com/file2.txt
進捗バーの表示
大きなファイルをダウンロードする場合、ダウンロードの進捗状況を確認したいことがあります。curl
はデフォルトでダウンロードの進捗状況をテキストベースのメーターで表示しますが、より見やすい進捗バーを表示するオプションもあります。
-
-#
または--progress-bar
:
#
記号を使ったシンプルな進捗バーを表示します。cmd
curl -O -# https://example.com/largefile.zip
######################################################################## 100.0%
12.2 アップロード (-T
)
curl
を使って、ローカルにあるファイルをFTPサーバーやHTTPサーバー(PUTメソッドをサポートしている場合など)にアップロードすることも可能です。
-
-T <アップロードするファイル>
または--upload-file <アップロードするファイル>
:
指定したファイルを、URLで指定した場所にアップロードします。“`cmd
FTPサーバーへのアップロード例
curl -T mydocument.txt ftp://ftp.example.com/incoming/
HTTPサーバーへのアップロード例(PUTメソッドを使用)
curl -T myimage.jpg https://example.com/uploads/myimage.jpg -X PUT
“`
アップロード先のURLは、サーバーの構成によって異なります。FTPの場合は通常ディレクトリを指定し、ファイル名はローカルのファイル名が使われます。HTTP PUTの場合は、アップロード後のファイル名をURLのパスに含めることが多いです。
ファイル転送機能は、Web開発やシステム運用でファイルを配置したり、サーバー間でファイルを移動させたりする際に役立ちます。
13. その他の便利なオプション
curl
には非常に多くのオプションがあり、ここでは全てを紹介できませんが、初心者の方にも役立ついくつかの便利なオプションをさらに紹介します。
13.1 タイムアウト
ネットワークの状況によっては、サーバーからの応答が非常に遅れたり、全く応答がなかったりする場合があります。curl
のデフォルト設定では、応答が返ってくるまで長時間待機してしまうことがあります。これを防ぐためにタイムアウト時間を設定できます。
--connect-timeout <秒>
:
TCP接続を確立するまでの最大時間を秒単位で指定します。この時間内に接続できない場合、エラーとなります。-
--max-time <秒>
:
リクエスト開始から完了までの最大時間を秒単位で指定します。この時間内にデータの転送が完了しない場合、エラーとなります。cmd
curl --connect-timeout 5 --max-time 10 https://slow-server.example.com/
この例では、接続に5秒、全体の処理に10秒を超えた場合にタイムアウトとして処理を中断します。応答が遅いサーバーや不安定なネットワークでコマンドが固まるのを防ぐのに役立ちます。
13.2 試行回数
ネットワークの一時的な問題でリクエストが失敗した場合に、自動的に再試行させることができます。
-
--retry <回数>
:
リクエストが失敗した場合に、指定した回数だけ自動的に再試行します。cmd
curl --retry 3 https://unstable-network.example.com/
このコマンドは、もし最初の試行が失敗した場合、最大で3回まで自動的に再試行します。一時的なネットワーク障害によるコマンドの失敗を防ぐのに便利です。
13.3 Cookie
HTTP Cookieは、Webサイトがユーザーのブラウザに保存する小さなデータ片です。セッション管理、ユーザー設定の記憶、トラッキングなどに使われます。curl
もCookieの送受信を扱うことができます。
-b <ファイル>
または--cookie <ファイル>
:
リクエストを送信する際に、指定したファイルからCookieを読み込んでヘッダーに含めます。-c <ファイル>
または--cookie-jar <ファイル>
:
レスポンスに含まれるSet-Cookie
ヘッダーを受け取り、指定したファイルにCookie情報を保存します。
これらのオプションを組み合わせることで、ログインが必要なサイトにアクセスしたり、セッションを維持したりすることができます。
例:ログインして保護されたページにアクセスする
- ログインページにアクセスし、Cookieを保存します。
cmd
curl -c cookies.txt -d "username=myuser&password=mypass" https://example.com/login
(ログインに成功すると、サーバーはセッション情報をCookieとして返します。それがcookies.txt
ファイルに保存されます。) - 保存したCookieを使って保護されたページにアクセスします。
cmd
curl -b cookies.txt https://example.com/protected/page
cookies.txt
ファイルには、セッションを維持するためのCookie情報が含まれており、-b
オプションによって次のリクエストのヘッダーに含まれて送信されるため、サーバーはあなたがログイン済みであることを認識します。
Cookieファイルは、各行にドメイン、フラグ、パス、セキュアフラグ、有効期限、名前、値が記述された特定のフォーマット(Netscape形式など)で保存されます。手動で編集することも可能ですが、基本的には-c
オプションで取得したものをそのまま-b
オプションで利用するのが一般的です。
13.4 リファラー (-e
)
リファラーとは、ユーザーがどのページから現在のページに遷移してきたかを示す情報です。Webサイトによっては、特定のリファラーからのアクセスのみを許可したり、リファラーによって表示内容を変えたりすることがあります。
-
-e <リファラーURL>
または--referer <リファラーURL>
:
Referer
ヘッダーを指定したURLで送信します。cmd
curl -e "https://example.com/previous_page" https://example.com/current_page
(実際のReferer
ヘッダーはスペルミスでReferer
となっていますが、オプション名はreferer
です。)
13.5 ユーザーエージェント (-A
)
ユーザーエージェントとは、クライアント(Webブラウザやcurl
などのツール)の種類やバージョン、OSなどの情報をサーバーに伝えるためのヘッダーです。Webサイトによっては、ユーザーエージェントによって表示を変えたり、特定のユーザーエージェントからのアクセスを拒否したりします。
-
-A <ユーザーエージェント文字列>
または--user-agent <ユーザーエージェント文字列>
:
User-Agent
ヘッダーを指定した文字列で送信します。デフォルトではcurl/バージョン
のようなユーザーエージェントが送信されます。“`cmd
ブラウザのユーザーエージェントを偽装する例
curl -A “Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36” https://example.com
“`
これにより、Webサイト側からはまるでWindows上のChromeブラウザからアクセスがあったかのように見えます。
これらのオプションを使いこなすことで、より高度なWebスクレイピングや、特定の状況を再現したデバッグなどが可能になります。
14. トラブルシューティング
curl
を使っていても、ネットワークの問題、サーバー側の問題、コマンドの入力ミスなど、様々な理由でエラーが発生することがあります。ここでは、初心者の方が遭遇しやすい一般的なエラーとその原因、対処法について解説します。
14.1 一般的なエラーメッセージ
curl
のエラーメッセージは比較的親切ですが、英語で表示されるため戸惑うかもしれません。いくつかの代表的なエラーメッセージを見てみましょう。
curl: (6) Could not resolve host: example.com
- 原因: 指定したホスト名(ドメイン名)をIPアドレスに変換できませんでした。インターネットに接続されていない、DNSサーバーの設定が間違っている、ドメイン名が存在しない、入力ミスなどが考えられます。
- 対処法: インターネット接続を確認する。ドメイン名が正しいか確認する。PCのDNS設定を確認する。
ping example.com
などで疎通を確認してみる。
curl: (7) Failed to connect to example.com port 80: Connection refused
- 原因: 指定したホストのポートに接続できませんでした。サーバーが起動していない、指定したポートでサービスが提供されていない、ファイアウォールによって通信がブロックされているなどが考えられます。
- 対処法: サーバーが起動しているか確認する。ポート番号が正しいか確認する。クライアント側・サーバー側のファイアウォール設定を確認する。
curl: (35) Schannel: SSL/TLS: The certificate authority is invalid or incorrect
またはcurl: (60) SSL certificate problem: unable to get local issuer certificate
- 原因: HTTPS接続時に、サーバー証明書の検証に失敗しました。証明書が信頼できない認証局によって発行されている、自己署名証明書である、証明書が期限切れ、中間証明書が不足している、クライアント側の信頼済みルート証明書ストアに問題があるなどが考えられます。
- 対処法: 接続先のサイトが正規のものであることを確認する。自己署名証明書など、検証エラーが想定される場合は自己責任で
-k
オプションを使用する(ただし非推奨)。企業の内部サイトなどで証明書エラーが出る場合は、必要な証明書をシステムにインストールしてもらう必要があるかもしれません。
curl: (22) The requested URL returned error: 404 Not Found
- 原因: サーバーは応答したが、指定したURLにリソースが見つかりませんでした(HTTPステータスコード404)。URLのパスが間違っている、リソースが削除されたなどが考えられます。
- 対処法: URLのスペルやパスが正しいか確認する。リソースが存在するか確認する。
curl: (22) The requested URL returned error: 401 Unauthorized
- 原因: サーバーは応答したが、認証が必要なリソースへのアクセスが認証失敗となりました(HTTPステータスコード401)。認証情報(ユーザー名/パスワード、トークンなど)が間違っているか、提供されていないなどが考えられます。
- 対処法:
-u
オプションや-H "Authorization: ..."
ヘッダーで正しい認証情報を提供しているか確認する。
14.2 -v
オプションを使ったデバッグ
前述の通り、-v
(--verbose
) オプションはトラブルシューティングにおいて非常に強力なツールです。このオプションを付けてcurl
コマンドを実行すると、リクエストとレスポンスの詳細が表示されるため、問題が通信のどの段階で発生しているかを特定するのに役立ちます。
例えば、-v
オプションの出力を見ることで、
* Trying ...
: どのIPアドレスに接続しようとしているか* Connected to ...
: どこに接続できたか* schannel: ...
または* SSL connection using ...
: SSL/TLS接続がどのように確立されているか> GET / HTTP/1.1
: どのようなリクエストヘッダーを送信しているか< HTTP/1.1 401 Unauthorized
: サーバーからどのようなステータスコードやレスポンスヘッダーが返ってきたか
などを確認できます。エラーメッセージだけでは原因が掴めない場合、-v
オプションを試してみることを強くお勧めします。
15. Windowsでの使用上の注意点
curl
コマンド自体はクロスプラットフォームで設計されていますが、コマンドを実行する環境であるWindowsのコマンドプロンプト(cmd.exe
)やPowerShellには、Unix/Linux系のシェルとは異なる挙動や注意点があります。
15.1 パスの指定方法
Windowsでは、ディレクトリの区切り文字にバックスラッシュ(\
)を使用するのが一般的ですが、curl
コマンドのオプション引数としてファイルパスを指定する場合(例: -o
, -T
, -d @
など)、通常はフォワードスラッシュ(/
)を使用しても問題ありません。これは多くのコマンドラインツールで共通の慣習です。ただし、コマンドプロンプトによってはバックスラッシュでないと正しく解釈されない場合もあります。どちらか一方で試してみて、うまくいかない場合はもう一方を試すのが良いでしょう。
例:
cmd
curl -o C:\Users\your_user\Downloads\page.html https://example.com # バックスラッシュ
curl -o C:/Users/your_user/Downloads/page.html https://example.com # フォワードスラッシュ
Windowsのコマンドプロンプトでは、通常どちらも正しく扱われます。
15.2 引用符の使い分け (cmd.exe vs PowerShell)
これがWindowsでcurl
を使う際に最も注意が必要な点の一つです。コマンドプロンプト(cmd.exe
)とPowerShellでは、特殊文字や引用符の解釈方法が大きく異なります。
-
コマンドプロンプト (cmd.exe):
- 通常、引数はダブルクォーテーション(
"
)で囲みます。 - ダブルクォーテーションで囲まれた文字列の中で、リテラルのダブルクォーテーションを含めたい場合は、バックスラッシュ(
\
)でエスケープします。(例:\"
) - 特別な意味を持つ文字(
&
,<
,>
,|
,^
など)を文字列内で使いたい場合は、キャレット(^
)でエスケープするか、文字列全体をダブルクォーテーションで囲む必要があります。
例:JSONデータを送信する場合(再掲)
cmd
curl -X POST -H "Content-Type: application/json" -d "{\"name\":\"Alice\",\"age\":30}" https://api.example.com/users
JSON内のダブルクォーテーションを\"
とエスケープしています。 - 通常、引数はダブルクォーテーション(
-
PowerShell:
- 引数はシングルクォーテーション(
'
)またはダブルクォーテーション("
)で囲むことができます。 - シングルクォーテーションで囲まれた文字列は、変数展開や特殊文字のエスケープが行われません。リテラルとしてそのまま解釈されます。複雑な文字列(特にJSONなど、ダブルクォーテーションや特殊文字が多い場合)にはシングルクォーテーションが適しています。
- ダブルクォーテーションで囲まれた文字列では、PowerShellの変数(例:
$env:USERPROFILE
)や式が展開されます。文字列内にリテラルのダブルクォーテーションを含めたい場合は、ダブルクォーテーションを二つ重ねて記述します(例:""
)。
例:JSONデータを送信する場合(再掲)
powershell
curl -X POST -H "Content-Type: application/json" -d '{"name":"Alice","age":30}' https://api.example.com/users
JSON全体をシングルクォーテーションで囲むことで、JSON内のダブルクォーテーションをエスケープする必要がありません。例:ユーザー名を環境変数から取得して送信する場合
powershell
curl -d "user=$env:USERNAME" https://example.com/greet
ダブルクォーテーションで囲むことで、$env:USERNAME
が実行ユーザー名に展開されて送信されます。シングルクォーテーションで囲むと$env:USERNAME
という文字列そのままが送信されます。 - 引数はシングルクォーテーション(
どちらのシェルを使うかによって、引用符やエスケープの方法が異なることを理解しておくことが重要です。複雑なコマンドやデータ送信を行う場合は、使用しているシェルに合わせて正確な記法を用いる必要があります。迷う場合は、まずシンプルなコマンドで試したり、ドキュメントを参照したりするのが良いでしょう。
15.3 環境変数
Windowsでは、%VARIABLE_NAME%
(cmd.exe)または$env:VARIABLE_NAME
(PowerShell)の形式で環境変数の値を参照できます。認証情報やプロキシ設定など、コマンドラインに直接記述したくない情報を環境変数に設定しておき、curl
コマンドの中で参照するという使い方が可能です。
“`cmd
cmd.exe の場合
set MY_API_KEY=your_secret_key_abcdef
curl -H “X-API-Key: %MY_API_KEY%” https://api.example.com/data
“`
“`powershell
PowerShell の場合
$env:MY_API_KEY=”your_secret_key_abcdef”
curl -H “X-API-Key: $($env:MY_API_KEY)” https://api.example.com/data
``
$env:MY_API_KEY
PowerShellの場合、を文字列中に埋め込む際は、
${env:MY_API_KEY}や
$($env:MY_API_KEY)`のようにブレースや括弧で囲むとより確実です。
これにより、スクリプトなどでAPIキーなどの機密情報を直接記述するリスクを減らすことができます。
16. 実践的な例:curlを使ってみよう
これまでに学んだ基本的なオプションを組み合わせて、より実践的な例をいくつか見てみましょう。
16.1 簡単なAPIへのアクセス(GET)
公開されている天気予報APIなど、簡単なGETリクエストで情報を取得できるAPIを利用してみましょう。(実際のAPIのエンドポイントやキーは、API提供元のドキュメントを参照してください)
例: Open-Meteo (オープンソースの気象API)
cmd
curl "https://api.open-meteo.com/v1/forecast?latitude=52.52&longitude=13.41&hourly=temperature_2m"
このコマンドは、ベルリン(緯度経度指定)の1時間ごとの気温を取得するAPIにリクエストを送信し、結果のJSONデータが表示されます。
16.2 ファイルダウンロードの自動化(バッチファイル/スクリプト)
複数のファイルを定期的にダウンロードしたい場合など、curl
とバッチファイルやPowerShellスクリプトを組み合わせると自動化できます。
cmd.exe バッチファイルの例 (download_files.bat):
“`batch
@echo off
set URL1=https://example.com/data/fileA.csv
set URL2=https://example.com/data/fileB.csv
set DOWNLOAD_DIR=C:\Users\your_user\Documents\DownloadedData
if not exist “%DOWNLOAD_DIR%” mkdir “%DOWNLOAD_DIR%”
echo Downloading %URL1%…
curl -L -O “%URL1%” –output-dir “%DOWNLOAD_DIR%”
if %ERRORLEVEL% neq 0 echo Failed to download %URL1%
echo Downloading %URL2%…
curl -L -O “%URL2%” –output-dir “%DOWNLOAD_DIR%”
if %ERRORLEVEL% neq 0 echo Failed to download %URL2%
echo Download process finished.
``
–output-dir <ディレクトリ>
*: ダウンロードしたファイルを指定したディレクトリに保存します(
-oや
-Oと組み合わせて使用)。
%ERRORLEVEL%
*は直前のコマンドの終了コードです。
0`以外はエラーを示します。
PowerShell スクリプトの例 (download_files.ps1):
“`powershell
$urls = @(
“https://example.com/data/fileA.csv”,
“https://example.com/data/fileB.csv”
)
$downloadDir = “C:\Users\your_user\Documents\DownloadedData”
if (-not (Test-Path $downloadDir)) {
New-Item -Path $downloadDir -ItemType Directory | Out-Null
}
foreach ($url in $urls) {
Write-Host “Downloading $url…”
curl -L -O $url –output-dir $downloadDir
if ($LASTEXITCODE -ne 0) {
Write-Warning “Failed to download $url”
}
}
Write-Host “Download process finished.”
``
$LASTEXITCODE` は直前のコマンドの終了コードです。
*
これらのスクリプトをタスクスケジューラなどで定期実行することで、手動でダウンロードする手間を省けます。
16.3 Webサイトのヘッダー情報の取得と比較
複数のWebサイトのサーバー情報やキャッシュ設定などを比較したい場合に、-I
オプションと組み合わせると便利です。
cmd
curl -I https://www.google.com
curl -I https://www.yahoo.co.jp
curl -I https://www.bing.com
これらのコマンドの出力を比較することで、各サイトが使用しているWebサーバーの種類(Server
ヘッダー)、キャッシュの制御方法(Cache-Control
, Expires
ヘッダー)、コンテンツのタイプ(Content-Type
ヘッダー)などの違いを確認できます。
16.4 POSTリクエストを使った簡単なデータ送信
jsonplaceholderのような、ダミーデータを提供するAPIを使ってPOSTリクエストを試すことができます。
“`cmd
JSONデータをPOST送信する例
curl -X POST -H “Content-Type: application/json” -d ‘{“title”: “foo”, “body”: “bar”, “userId”: 1}’ https://jsonplaceholder.typicode.com/posts
``
/posts`エンドポイントにPOSTし、APIからのレスポンス(通常は新しく作成されたリソースのデータとID)が表示されます。
このコマンドは、指定したJSONデータを
これらの例はごく一部ですが、curl
が様々な用途で活用できる強力なツールであることを示しています。
17. まとめ:curl活用の第一歩を踏み出そう
この記事では、Windows環境でcurl
コマンドを使うための基本的な知識と多くの便利なオプションについて解説しました。
- curlとは: Webとのデータ送受信を行う強力なコマンドラインツール
- Windowsでの準備: 多くの場合は標準搭載、必要ならインストールとPath設定
- 基本操作: URLを指定してGETリクエストで情報を取得
- 出力: 標準出力への表示、
-o
,-O
オプションによるファイル保存 - HTTPメソッド:
-X
オプションでGET, POST, PUT, DELETEなどを使い分け - データの送信:
-d
でボディデータ、-F
でmultipart/form-data、GETではクエリパラメータ - ヘッダー:
-I
や-i
で確認、-H
でカスタムヘッダーを追加 - 認証:
-u
によるベーシック認証、-H
によるBearer認証など - リダイレクト:
-L
オプションで自動追跡 - プロキシ:
-x
オプションで経由設定 - HTTPS: デフォルト対応、
-k
で証明書検証をスキップ(非推奨) - ファイル転送:
-O
,-o
でダウンロード、-T
でアップロード - 便利なオプション: タイムアウト、リトライ、Cookie、ユーザーエージェントなど
- トラブルシューティング: エラーメッセージの理解、
-v
オプションによるデバッグ - Windows固有の注意点: パス指定、引用符の使い分け(cmd vs PowerShell)
curl
のオプションは非常に多岐にわたりますが、ここで紹介した基本的なオプションをマスターすれば、Webサイトの情報の取得、APIのテスト、ファイルのダウンロード・アップロードなど、多くの一般的なタスクを実行できるようになります。
最初から全てを覚える必要はありません。必要になったときにこの記事やcurl
の公式ドキュメントを参照しながら、一つずつオプションの使い方を習得していくのがおすすめです。
curl
コマンドは、Webブラウザだけではできないような、より細かく、より自動化されたWebとの連携を可能にします。コマンドラインに慣れることは、開発やシステム管理のスキルを向上させる上で非常に役立ちます。
さあ、コマンドプロンプトやPowerShellを開いて、実際にcurl
コマンドを色々試してみてください。好奇心を持って様々なオプションやURLを試すことが、習得への近道です。
この記事が、あなたのWindowsにおけるcurl
コマンド活用の手助けになれば幸いです。
これで、約5000語のWindows向けcurl
コマンド初心者向け詳細解説記事は完了です。