Invoke-WebRequest:无法绑定参数' Headers'

时间:2017-07-19 07:12:25

标签: powershell curl

我正在尝试在powershell中执行curl命令:

curl --user bitcoinipvision --data-binary '{"jsonrpc": "1.0", "id":"curltest", "method": "move", "params": ["acc-1", "acc-2", 6, 5, "happy birthday!"] }' -H 'content-type: application/json;' http://localhost:18332/

但是我得到了这个错误,问题是什么?

Invoke-WebRequest : Cannot bind parameter 'Headers'. Cannot convert the
"content-type: application/json;" value of type "System.String" to type
"System.Collections.IDictionary".
At line:1 char:158
+ ... 5, "happy birthday!"] }' -H 'content-type: application/json;' http:// ...
+                                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [Invoke-WebRequest], ParameterBindingException
    + FullyQualifiedErrorId : CannotConvertArgumentNoMessage,Microsoft.PowerShell.Commands.InvokeWebRequestCommand

3 个答案:

答案 0 :(得分:5)

正如一些评论者所说,curl实际上只是Invoke-WebRequest的别名:

PS> Get-Command curl

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

注意:我建议使用Get-Command,而不是Get-Alias,因为您可能不知道您使用的命令是别名,cmdlet还是可执行文件。< / em>的

从这一点开始,有两种方法可以解决您的问题:

  1. 使用PowerShell&#39; Invoke-RestMethod(或者,如果您使用的是PowerShell&lt; 3,Invoke-WebRequest):

    Invoke-RestMethod -Uri http://localhost:18332/ -Credential bitcoinipvision -body $thisCanBeAPowerShellObject 
    

    如您所见,由于JSON是IRM的默认内容类型,因此不需要内容类型;虽然您可以使用-ContentType更改它。

  2. 如果您在当前环境中可用,请使用原始cUrl。你必须这样打字:

    curl.exe --user bitcoinipvision --data-binary '{"jsonrpc": "1.0", "id":"curltest", "method": "move", "params": ["acc-1", "acc-2", 6, 5, "happy birthday!"] }' -H 'content-type: application/json;' http://localhost:18332/
    
  3. 我肯定更喜欢第一个第一个,因为PowerShell本身支持JSON答案,这使您可以轻松使用它们,例如通过将其汇总到Where-ObjectFormat-TableSelect-ObjectMeasure-Object等等。如果您更喜欢使用cUrl,则必须自行解析curl.exe进程返回的String。这对二进制内容也可能有问题。

答案 1 :(得分:1)

我遇到了类似的问题,直到发现: https://github.com/MicrosoftDocs/azure-docs/issues/31851

“这些命令旨在在特定的VM内和Bash环境中运行。不是在PowerShell中运行。因此,在大多数情况下都会看到您看到的错误。”

答案 2 :(得分:0)

Curl基本上在PowerShell中使用Invoke-Webrequest。

您可以在错误中看到,标头基本上接受“ System.Collections.IDictionary” n的形式,并且您正在通过“ System.String”。

将页眉转换为字典/哈希表将解决此问题,

curl --user bitcoinipvision --data-binary '{"jsonrpc": "1.0", "id":"curltest", "method": "move", "params": ["acc-1", "acc-2", 6, 5, "happy birthday!"] }' -H @{ "content-type" = "application/json"} http://localhost:18332/