LoginSignup
132
132

More than 3 years have passed since last update.

Windows 環境における curl コマンド利用のまとめ (平成最終版)

Last updated at Posted at 2019-05-03

curl コマンド は REST API などの動作を確認するのに有用なツールです。ただこのツール、マックだと標準でインストールされているのですが、Windows だと自分で追加インストールしなくてはいけません。しかも日本語の問題もあります。

最近、Windows 環境における curl コマンドの質問を多く受けるので、現時点で私の知る限りの情報をまとめておきます。

Windows 用 curl コマンド

インストール

Download ページ から Windows 用の curl コマンドをダウンロードしてインストールします。

パスの設定などがうまくできず、動作しない場合には、ダウンロードした zip ファイルを解凍したフォルダのなかにある bin フォルダのアドレスをテキストとしてコピーして、
image.png
コマンドプロンプトの cd コマンドでその bin フォルダに移動して、そこで curl コマンドを実行するのがお手軽で良いでしょう。

【追記】Windows 10 April 2018 Update から curl が標準コマンドとして追加されたとの話あり。インストール前に curl --version を実行して導入されているか確認してみてください。

コマンドプロンプトにおける注意点と実行例

コマンドプロンプトにおける、日本語対応のための注意点をまとめておきます。

  1. コマンドプロンプトの表示フォントを Unicode 対応のもの(MSゴシックなど)に変更しておく
  2. 表示するデータに日本語が含まれる場合は chcp 65001 で UTF-8 表示モードに変更
  3. 送信データに日本語が含まれる場合は事前にその文字列を Unicode エンコーディングしておく
    (例:ハロー → \u30cf\u30ed\u30fc)
  4. curl などのコマンドを実行
  5. 利用後は chcp 932 で SJIS 表示モードに戻す

これらの対応が必要な理由は、Windows のコマンドプロンプトがいまだに SJIS (Shift-JIS) という古い文字コードで動作しているからです。インターネット系のプロトコルは基本 UTF-8 なので、工夫しないとこういった文字化けが発生してしまいます。

更に悩ましいのは、chcp 65001 で UTF-8 モードに変更しても、単に表示部分だけしか変更してくれていないことです。なので日本語を含むデータを送信したい場合、やっぱり文字化けが発生してしまい、3. の対応策が併せて必要になります。

以下は上記を守って IBM Cloud翻訳API を利用して、英日・日英翻訳を実行してみた例です。日本語の送受信ができています。以降で詳細を説明します。
image.png

【2020年5月23日 追記】 Windows Terminal での実行

このたび正式バージョンが公開された Windows Terminal は Unicode 対応なので、コマンドプロンプトで実行した際、上記のコードページの問題が解決されています!
image.png
まあ、日本語は相変わらず 3. の Unicode エンコーディングが必要みたいなのですが… だいぶ楽になりました!

ちなみに Power Shell との組み合わせだと、英語から日本語への翻訳であれば、JSON をシングルクォーテーションで囲んであげれば同様に文字化けせずに動作する模様。
image.png
ただしこの場合、日本語から英語に翻訳する方法が不明だったりします。Unicode エンコードしても怒られる気がする… (時間あったら調査してみます)

まあとりあえず、Windows Terminal ちょっと良い感じ。日本語表示が化けないだけでも有難いです。

JSON データに関する補足

最近は改善されてきた気がしますが、いまだに Windows では動かない以下のような JSON データの指定がされた curl コマンドの例が使われていることがあります。

curl --request POST --header 'Content-Type: application/json' --data '{"text":["Hello"],"model_id":"en-ja"}' 'https://rtk-lt.mybluemix.net/echo'

残念ながら、Windows のコマンドプロンプトでは、シングルクォーテーション ' を文字列の指定に利用できません。なのでダブルクォーテーション " を用いて、かつ内部で使用されたダブルクォーテーションをエスケープした以下の書き方でないと動作しません。

curl --request POST --header "Content-Type: application/json" --data "{\"text\":[\"Hello\"],\"model_id\":\"en-ja\"}" "https://rtk-lt.mybluemix.net/echo"

まどろっこしいですが、この記述方法だとマック(Unix/Linux)でもWindowsでも動作するようですので、この書き方に慣れていきましょう。

REST API を叩いてみよう

curl コマンドの簡単なテスト先

curl コマンドの動作確認にお勧めなのは Zen API です。以下のように https://api.github.com/zen にアクセスすれば禅の言葉がランダムに得られます。

curl https://api.github.com/zen

こんな感じで。
image.png

また、POST 形式で REST API にデータを渡す際に、データが正しく設定できているか確認したいことがあります。なので、curl コマンドによる POST アクセスの確認用に、渡された JSON データをそのまま返すだけの、シンプルな echo サービスを作成してみました。この投稿を読んでいただいている時点でまだ動いていれば、ご自由にご利用ください。

サービスURL: https://rtk-lt.mybluemix.net/echo/

Windows からの利用例は以下で、送信した JSON データがそのまま表示されているのがわかります。

curl --request POST --header "Content-Type: application/json" --data "{\"text\":[\"Hello\"],\"model_id\":\"en-ja\"}" "https://rtk-lt.mybluemix.net/echo"

image.png

翻訳サービスについて

今回利用した翻訳サービスですが、IBM Cloud の無料アカウント から作成でき、そのまま無料でサービスを維持できますので、こういった場合のテスト目的でもお勧めです。(多言語対応だし)

サービスの作成と apiKey 入手については、以前に投稿した 翻訳サービスの作成と接続 の記事あたりを参考にしてみてください。

また Language Translator API Document にある curl 用の実行例が非常に参考になります。
image.png

curl --user apikey:{apikey} --request POST --header "Content-Type: application/json" --data "{\"text\":[\"Hello\"],\"model_id\":\"en-es\"}" "{url}/v3/translate?version=2018-05-01"

といいますか、この curl 用の実行例をコピーして、{apiKey}{url} 部分をサービス資格情報から得て置き換えればそのまま利用できます。

実際に実行した様子がコチラ。Hello がスペイン語の Hola に翻訳されているのがわかります。
image.png
※ apiKey がそのまま写っていますが、近いうち変更する予定があるので気にしないでください

今回は日本語を中心に説明しましたが、表示フォントにハングル文字が含まれていれば、en-ko 指定で英語から韓国語への翻訳もできます。
image.png

もうひとつの方法

実は Windows にも最初から用意されている、curl コマンドの同等機能があります。それが PowerShell における curl コマンドで、実態は Invoke-WebRequest というコマンドの Alias です。

こちらを使えば curl をインストールする必要は無いのですが、コマンドの書式が違うので少し書き直す必要があります。

例えば先ほどの Zen API を PowerShell から呼び出してみましょう。

Invoke-WebRequest https://api.github.com/zen

ただこれだと、多くの情報が表示されて禅の言葉がわかりにくいので、以下のように、得られた結果から Content だけを抜き出し表示します。

(Invoke-WebRequest https://api.github.com/zen).Content

image.png
また、先ほどのシンプルな echo サービスを PowerShell から呼び出してみましょう。

(Invoke-WebRequest 'https://rtk-lt.mybluemix.net/echo' -Method Post -ContentType "application/json" -Body '{"text":["Hello"],"model_id":"en-ja"}').Content

image.png
curl と似てはいるのですが、指定するオプションが違うのがわかります。--request-Method ですし、--header ではなく -ContentType という専用のオプションで JSON 形式を指定しています。

そして翻訳サービスを呼び出すコマンドは以下になります。

$lt_apiKey = 'aPezFimn2qyE4v-sr8rDfXfuzTed2ETDEz2vqzj9a6aW'
$lt_url = 'https://gateway-tok.watsonplatform.net/language-translator/api/v3/translate?version=2018-05-01'

$sec_pw = ConvertTo-SecureString -String $lt_apiKey -AsPlainText -Force
$cred = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList 'apiKey', $sec_pw
Invoke-WebRequest $lt_url -Credential $cred -Method Post -ContentType "application/json" -Body '{"text":["Hello"],"model_id":"en-ja"}'

apiKey を渡す際に PSCredential オブジェクトを作成して $cred にセットしているあたりが、PowerShell 独特の部分です。これを -Credential オプションで指定することで、認証機能をパスしています。

今回は最初に $lt_apiKey$lt_url の変数を用意することで、$cred が定義され、これを汎用的に利用できるように記述してみました。一度実行すれば変数が定義されますので、最後の行(Invoke-WebRequestコマンド)だけで何度も実行可能です。

JSON データに関しては、マックなどと同様にシングルクォーテーション ' で囲めますので、Windows 特有のダブルクォーテーション " のエスケープが不要になります。ちょっと嬉しいポイントですね。

以下が実際の実行の様子です。curl コマンドと同じことが実行できていることがわかります。
image.png

こちら、curl 用の記述から、Invoke-WebRequest 用の記述への書き換えは、初心者には難しいと思います。curl を用いたワークショップなどを企画されている方が居たら、curl の操作例に併記して、Invoke-WebRequest での実行例も記載することもご検討をお願いします!Windows 利用者にとって敷居が下がると思われます。

失敗例

オマケとして、失敗例も簡単に紹介しておきましょう。

PowerShell から curl.exe してみる

PowerShell は新しい技術なので、きっと Unicode ベースで表示してくれるだろう、と期待して Windows 用の curl コマンドを PowerShell から呼び出してみました。curl コマンドは既に Alias 名で取られているので、curl.exe と拡張子付きで呼んであげるのがポイントです。

が、ここまで苦労しても、コマンドプロンプトと結果は同じ… SJIS ベースなんかい!っと突っ込んでしまいましたよ… (PowerShell は悪くないかもしれないけど)
image.png
コマンドプロンプトと同様に chcp 65001 してあげれば、いちおう日本語は表示できます。
image.png
が、これ単に PowerShell は処理を丸投げしているだけのようで、エスケープが二重に必要になり、かなり面倒なことに。これならコマンドプロンプトで実行したほうがマシなので、この方法は没にしました。。

というわけで

Windows にちゃんとした curl が標準装備されるその日まで、Windows 環境で Web サービスを学び始める方々の最初の躓きは終わらない… と、ならないように、とりあえず知っていることを全部まとめてみました。

どなたかの助けになれば、嬉しいです。ではでは。

132
132
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
132
132