最初に抑えておくべきWindows curlの基本
- PowerShellでは、単に
curlと実行するとInvoke-WebRequestのエイリアス(別名)として動作する。 - Linux標準の
curlと同じ挙動をさせたい場合は、拡張子.exeを付加して実行する必要がある。 - ソースコードは同じだが、OSのビルド環境に起因する機能(Features)の差がある。(例:対応プロトコルやSSL/TLSバックエンド)
Windows標準でcurlは使えるのか?
Web通信のテストや、Web APIを実行する際、Linuxではよくcurlコマンドが利用される。
一方、WindowsでHTTPリクエストを送信するコマンドを調べると、PowerShellのInvoke-WebRequestコマンドや、Invoke-RestMethodコマンドがヒットする。しかし、curlに慣れているLinuxユーザーにとっては、PowerShellコマンドは取っ付き難い。
例えば、LinuxのcurlではHTTPレスポンスをそのまま標準出力しているのに対して、Invoke-WebRequestではBasicHtmlWebResponseObjectというPowerShellが整形したオブジェクトが返却される。もちろんコマンドオプションも違う。
ここでcurlに慣れ親しんだユーザーにも朗報で、実はWindowでもWindows 10 Version 1803 (RS4)以降であれば、curlを標準で利用することができる。ただし注意点があるので後述する。
PowerShellにおける「curl」と「curl.exe」の違い
早速、Windowsでcurlを使ってみる。しかし、結果を見るとLinuxのcurlのような出力形式ではない。
PS > curl https://www.madogiwa-engineer.com
StatusCode : 200
StatusDescription : OK
Content : <!doctype html>
<html lang="ja">
### 以下省略 ###
この理由は、curlがInvoke-WebRequestのAliasとなっており、実際にはInvoke-WebRequestを実行しているからである。
PS > Get-Alias curl
CommandType Name Version Source
----------- ---- ------- ------
Alias curl -> Invoke-WebRequest
Linux Likeなcurlを利用するには、拡張子.exeを付加したcurl.exeを実行する必要がある。
PS > curl.exe -s https://www.madogiwa-engineer.com | Select-Object -First 10
<!doctype html>
<html lang="ja">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover">
<meta name="referrer" content="no-referrer-when-downgrade">
<meta name="format-detection" content="telephone=no">
【補足】
PowerShellがコマンドを解釈する際、実行パスの検索(Path環境変数のチェック)よりもエイリアスのチェックが先に実行される。このため、curlと入力すると、システムに存在するC:\Windows\System32\curl.exeよりも、エイリアスであるInvoke-WebRequestが優先的に実行される。
コマンドプロンプト(cmd.exe)では、PowerShellのようなエイリアス設定がデフォルトでされていないため、curlまたはcurl.exeのどちらを実行しても、環境変数のPath経由でC:\Windows\System32\curl.exeが実行される
LinuxのcurlとWindowsのcurlに差はあるのか?
curlのソースコードはLinux/Windowsともに同じものを利用しているため、いずれのcurlも近い機能を有している。ただし、ビルドが異なるため、依存ライブラリや対応しているProtocol、Featuresが異なるので注意が必要である。それぞれ--versionオプションで確認できる。
◆Ubuntu24.04
$ curl --version
curl 8.5.0 (x86_64-pc-linux-gnu) libcurl/8.5.0 OpenSSL/3.0.13 zlib/1.3 brotli/1.1.0 zstd/1.5.5 libidn2/2.3.7 libpsl/0.21.2 (+libidn2/2.3.7) libssh/0.10.6/openssl/zlib nghttp2/1.59.0 librtmp/2.3 OpenLDAP/2.6.7
Release-Date: 2023-12-06, security patched: 8.5.0-2ubuntu10.6
Protocols: dict file ftp ftps gopher gophers http https imap imaps ldap ldaps mqtt pop3 pop3s rtmp rtsp scp sftp smb smbs smtp smtps telnet tftp
Features: alt-svc AsynchDNS brotli GSS-API HSTS HTTP2 HTTPS-proxy IDN IPv6 Kerberos Largefile libz NTLM PSL SPNEGO SSL threadsafe TLS-SRP UnixSockets zstd
◆PowerShell
PS > curl.exe --version
curl 8.16.0 (Windows) libcurl/8.16.0 Schannel zlib/1.3.1 WinIDN
Release-Date: 2025-09-10
Protocols: dict file ftp ftps gopher gophers http https imap imaps ipfs ipns ldap ldaps mqtt pop3 pop3s smb smbs smtp smtps telnet tftp ws wss
Features: alt-svc AsynchDNS HSTS HTTPS-proxy IDN IPv6 Kerberos Largefile libz NTLM SPNEGO SSL SSPI threadsafe Unicode UnixSockets
具体例を挙げると、Windowsのcurl(8.16.0 (Windows))は、nghttp2ライブラリを含んでおらず、Featuresを見るとHTTP/2に対応していない。そのため、--http2オプションを使用してもエラーとなる。
PS > curl.exe --http2 https://www.madogiwa-engineer.com
curl: option --http2: the installed libcurl version does not support this
curl: try 'curl --help' for more information
一方で、Ubuntuのcurl(8.5.0 (x86_64-pc-linux-gnu))はHTTP2に対応しているため、サイト側が対応していれば、HTTP/2を使った通信が可能だ。
$ curl --http2 -sI https://www.madogiwa-engineer.com | head -1
HTTP/2 200
その他の差分を以下に挙げるが、curl自身の差分ではなく、OSやシェルに起因するものである。
- TLS/SSLのバックエンドの差(Linuxは主にOpenSSL、Windowsはschannel)によって、対応しているCipher SuiteやTLSバージョンに差が出る。
- OS依存で改行コード(CRLF/LF)や文字コードの扱いが異なることがある
- シェルの違いでクォートの扱いが異なる
Windowsでcurlを使うための3つの選択肢
Windows環境でLinux Likeなcurlを利用する方法をまとめると、主に以下の3つの選択肢に分類できる。
| 解決方法 | 主な利点 | 注意点 |
|---|---|---|
| Windows標準のcurlを利用 | 追加の環境構築が不要 | 高度な機能(HTTP/2など)が使えない |
| WSLやDocker等でLinux環境を準備 | Linux curlの機能をそのまま利用できる | WindowsとLinuxを跨いだ操作が必要になることがある |
| libcurlをカスタムビルド | Windowsネイティブで高度な機能を使える | 環境構築や依存ライブラリのメンテナンス難易度が高い |
もしも、LinuxとWindowsのcurlの機能差分が気になるのであれば、WSLやDocker等でLinux環境を準備するのが良い。ただし、一般的なWeb APIテストやデータ取得といった利用用途であれば、Windowsのcurl.exeでもほとんど不満なく利用できるだろう。
どうしてもWindows環境のみでLinux curlと同等なFeaturesのcurlを使いたい場合は、libcurlを手動でビルドする選択肢もある。
以下にvcpkg(C/C++ライブラリのパッケージマネージャー)を利用した、カスタムビルドの大まかな手順を記載する。
- 環境構築:GitとVisual Studio(C++ワークロード付き)をインストール
- vcpkgのセットアップ:vcpkgをクローンし、初期ビルドを行う(今回の例では
C:\dev配下にvcpkgをクローンする)
PS > cd C:\dev
PS > git clone https://github.com/microsoft/vcpkg
PS > cd C:\dev\vcpkg
PS > .\bootstrap-vcpkg.bat
- curlのビルド:依存ライブラリを指定し、
curlをインストール(今回の例ではOpenSSLとHTTP/2を有効化)
PS > .\vcpkg install curl[openssl,http2,tool]:x64-windows
- 動作確認:ビルドした
curl.exeが以下のパスに格納される。
C:\dev\vcpkg\installed\x64-windows\tools\curl\curl.exe
格納されているパスまで移動し、--versionオプションで機能を確認すると、OpenSSLとnghttp2が依存ライブラリがインストールされていることがわかる。
PS > cd C:\dev\vcpkg\installed\x64-windows\tools\curl
PS > .\curl.exe --version
curl 8.17.0-DEV (Windows) libcurl/8.17.0-DEV OpenSSL/3.6.0 (Schannel) zlib/1.3.1 nghttp2/1.68.0
Release-Date: [unreleased]
Protocols: dict file ftp ftps gopher gophers http https imap imaps ipfs ipns mqtt pop3 pop3s rtsp smb smbs smtp smtps telnet tftp
Features: alt-svc AsynchDNS HSTS HTTP2 HTTPS-proxy IPv6 Kerberos Largefile libz MultiSSL NTLM SPNEGO SSL SSPI threadsafe TLS-SRP Unicode UnixSockets
また、--http2オプションでHTTP/2通信ができていることも確認できる。
PS > .\curl.exe -ksI --http2 https://www.madogiwa-engineer.com
HTTP/2 200
### 以下省略 ###
このカスタムビルドする方法であれば、Windows標準版では対応していないHTTP/2通信などが可能になる。ただし、環境構築やメンテナンスの難易度は高いので注意が必要だ。
【補足】
本稿ではvcpkgを利用してビルドしたが、nmakeでbuildする方法やcmakeでbuildする方法もある。
参考サイト
