💡

Windows Powershellでcurlを使うときの注意点

2022/06/08に公開

1.背景

私が所属するチームでは海外のとあるSaaSプロダクトを取扱してます。
そのSaaSが提供するAPIに対し、curlでリクエストをする機会がありました。

APIリクエストの各言語サンプルコードがSaaSのプロダクトチームから提供されており、それらをほぼそのまま拝借して利用するということをやっておりました。
curlでの利用機会も頻繁にあります。

2.陥った状況

Macで実行していたときはなんら問題はなかったのですが
実は最近、業務PCを私物のMacから会社支給のWindowsに乗り換えたのです。その流れでcurlコマンドをPowershallで発行するようにしたのですがエラーが発生して、どうも上手くいかなくなってしまいました。

$ curl -i -X GET 'https://hoge/sample/12345' -H 'x-hoge-api-key: abcdefg0123456789'
Invoke-WebRequest : パラメーター 'Headers' をバインドできません。"x-hoge-api-key: abcdefg0123456789" の値を "System.String" 型から "Syst
em.Collections.IDictionary" 型に変換できません。
発生場所 行:1 文字:51
+ ... https://hoge/sample/12345' -H 'x-hoge-api-key: abcdefg0123456789'
+                                       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [Invoke-WebRequest]、ParameterBindingException
    + FullyQualifiedErrorId : CannotConvertArgumentNoMessage,Microsoft.PowerShell.Commands.InvokeWebRequestCommand

3.解決方法

その1:シングルクォートは駄目、ダブルクォートに変える

Windowsでcurlを使うときの制約として、シングルクォートを使わず、ダブルクォートを使用する必要があるそうです。

変更後1
curl -i -X GET "https://hoge/sample/12345" -H "x-hoge-api-key: abcdefg0123456789"

ところがダブルクォートに変更してもまだだめです。

その2:エイリアスされてる

エラーの内容をよく見ると、Invoke-WebRequestという表記があります。
なんのことか分からないので調べてみると、Powershellに標準搭載されているリクエストコマンドのようですね。Get-Alias curlしてみると、curlはInvoke-WebRequestにエイリアスされていることが分かります。

$ Get-Alias curl

CommandType     Name                                               Version    Source
-----------     ----                                               -------    ------
Alias           curl -> Invoke-WebRequest



解決方法は以下を参考にさせて頂きました。ありがとうございます。
https://devadjust.exblog.jp/22690878/



私の場合、curlに拡張子をつけて暫定的に対応しました。

変更後2
$ curl.exe -i -X GET "https://hoge/sample/12345" -H "x-hoge-api-key: abcdefg0123456789"

HTTP/1.1 200 
// 以下略

4.まとめ

基本的にプロダクトチームはMacで業務を回していると聞いていますので、Macで実行することを前提としたサンプルコードになっていたようですね。
(そもそもcurlがUNIXからの利用を想定されてるんだし、そりゃそうか。)

5.参考サイト

以下も参考にさせて頂きました。ありがとうございます。
https://qiita.com/yamachan360/items/8c928738289cd518eec8

Discussion