今までcurlのためだけにWSLのUbuntuを起動するということをやっていたのですが、最近発見した方法がこちら。
- PowerShell 7.x をインストールする。
- PowerShell 7.x 上でcurlを実行する。
- POSTリクエストを投げる時は、JSONボディ全体をダブルクォートでくくり、中身の引用符にシングルクォートを使う。
PowerShell 7.xをインストールするとcurlを実行できる理由
- Windows10の1803以降では、標準でcurlコマンドがインストールされており、コマンドプロンプトを使えば普通にcurlが使えます。
- しかしながら、個人的にコマンドプロンプトは好きじゃないので、PowerShellを使いたい。
- しかしWindowsに標準インストールされているPowerShell (2020/7/22現在のバージョンは5.1)でcurlを呼ぶと、Invoke-WebRequest というコマンドが実行されてしまいます。curlがInvoke-WebRequestのエイリアスになっているためです。1
- そこで、Windows標準インストール版PowerShellの後継版(7.x)を利用します。こちらはクロスプラットフォーム化された後継版です。2
- この後継版(以下pwsh)では、Invoke-WebRequestへのエイリアスが削除されています。
ちなみに PowerShell 7.x のインストール方法ですが、Microsoftの説明を参照してください。とは言ってもGitHubからmsiファイルをダウンロードして実行するだけです。
普通にインストールしても、PowerShell 5.1を上書きしたりはしないので大丈夫です。
今回は本日2020/7/22時点でのLTS最新版、7.0.3を使いました。
alias を削除するという方法もあるみたいですが、PCを引っ越したりしたときに忘れそうなので、今回は別の方法で試しました。
(2020/7/23追記)コメントで指摘いただきましたが、PowerShell 5.1でも"curl"ではなく"curl.exe"と書くだけで Invoke-WebRequestのエイリアスを回避できます。
JSONボディの送り方
PowerShell上でcurlを使う際、POSTでJSONデータを送りたいことがあります。Linuxでやるように
-d '{"query": "hogehoge"}'
と書くと、"BadArgument"と怒られてしまいます。
Windows 環境における curl コマンド利用のまとめ (平成最終版)によると、どうやら下記のようにエスケープする必要があるようです。
-d '"{\"query\": \"hogehoge\"}"'
……面倒ですね。面倒だと思ったので、単純に中身をシングルクォートにしてみました。つまりこうです。
-d "{'query': 'hogehoge'}"
動きます。
RFCによると、JSONの文字列は本来ダブルクォートでくくる必要があるらしいのですが、通ります。
少なくとも私がテストしたサーバーでは通りました。
個人的にcurlを使うのはちょっとしたテストだけなので、当面これで行こうと思います。
上記で動かないサイトがあったらどうする?
ごーばっくとぅー WSL
-
単純なGetならともかく、-H も -X も使えない仕様にしたの、なんでなん……? ↩
-
PowerShell Coreとも呼ばれているようですが、PowerShell Core だったのは 6.x 系だけで、最近正式リリースされた 7.x系では単純に「PowerShell」と呼ばれているようです。Microsoftの説明のページにて「PowerShell Core」ではなく「PowerShell」と書かれているのを見て、私もちょっと混乱しました。 ↩