【问题标题】:PowerShell doesn't recognize provided parameterPowerShell 无法识别提供的参数
【发布时间】:2018-11-23 09:26:22
【问题描述】:

操作系统 - Windows 10

Powershell 版本 - 5.1.15063.1088

我正在使用 Windows PowerShell ISE(如果这有意义的话)。运行简单的 HTTP Post 函数时

Function MyBeautifulFunction {

  $myCredentials = Get-Credential

  $body = @{
          "query"="SELECT [System.Wheel],[System.SparkPlug],[System.EngineOil],[System.Headlight],[System.RadioButton] FROM JunkYard WHERE [System.Brand] = 'Ford' AND [System.Model] = 'GT' AND [System.Title] CONTAINS 'Rebuild'"
  } | ConvertTo-Json

  Invoke-RestMethod -Uri 'http://example.com//ford/parts/fuelpump/_apis/wit/wiql?api-version=2.0' `
    -Method Post `
    -Credential $myCredentials `
    -Body $body `
    -ContentType 'application/json' 

}

MyBeautifulFunction

编者注:Invoke-RestMethod 调用最初分散在 2 行中,没有续行,下面的 Adam's answer 部分将讨论。

我在 PowerShell ISE 控制台窗口中收到以下错误消息:

"message":"The request indicated a Content-Type of \"application/x-www-form-urlencoded\" for method type \"POST\" which is not supported. Valid 
content types for this method are: application/json, application/json-patch+json.

很明显,我在参数中传递了'application/json',但由于某种原因,PowerShell 仍然抱怨。有没有人遇到过这个错误?我应该向微软报告吗?感谢您的建议...

【问题讨论】:

    标签: rest powershell content-type


    【解决方案1】:

    您需要将标头传递给 headers 参数

    $headers = @{
        "Content-Type" = "application/json",
        "Accept" = "application/json"
    }
    
    Invoke-RestMethod -Uri 'http://example.com/123' -Method Post -Body $body -Headers $headers 
    

    见 - https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/invoke-restmethod

    【讨论】:

    • 谢谢!在文档页面上,它清楚地表明 Invoke-RestMethod 方法接受 ContentType 作为参数。所以如果请求方法是 Post,ContentType 总是设置为 application/x-www-form-urlencoded。参数的漂亮实现。
    • 这是传递标头数据的好方法,但您也可以将 ContentType 作为参数传递 - 仅供参考。
    • @Kevin Smith 顺便说一句,我认为它应该是 $headers = @{ "Content-Type" = "application/json" } 在 Content-Type 周围加上引号,否则 PoweShell 会抱怨破折号字符在内容和类型词之间
    【解决方案2】:

    几件事...

    首先,我一直调用 REST 服务,内容类型为 application/json,我没有任何问题。例如,以下对我来说很好:

    $url = 'https://jsonplaceholder.typicode.com/posts/1'
    $response_from_webservice = Invoke-RestMethod -Uri $url -ContentType 'application/json' -Method 'Get'
    

    jsonplaceholder... 是一项公共服务,可用于测试。如果您需要进行完整性检查,请随时在您的机器上运行 sn-p。

    其次,你发送的这个示例代码有这个Accept参数:

    Invoke-RestMethod -Uri 'http://example.com//ford/parts/fuelpump/_apis/wit/wiql?api-version=2.0' -Method Post -Credential $myCredentials 
    -Body $body -ContentType 'application/json' -Accept 'application/json'  
    

    我不相信我以前见过这种情况。我也在使用 Powershell v5.1.15063.1088 运行 Windows 10。我检查了docs。我检查了命令行开关的参数。没找到。

    我分享这个是为了解释,我不能用那个调用签名重新创建你的场景。

    如果您想在 HTTP 标头中添加 accept 条目,则必须直接执行此操作:

    $h = new-object 'system.collections.generic.dictionary[[string],[string]]'
    $h.add('accept', 'application/json')
    $r = Invoke-RestMethod -Uri '...' -ContentType 'application/json' -Method 'Post' -Headers $h
    

    第三,看起来您没有在 sn-p.xml 中指定内容类型。 sn-p 的 Invoke-RestMethod 与 body 和 contenttype 参数分开一行。只是要清楚,它不是包装。那里似乎有一个换行符。这意味着第二行-Body $body -ContentType 'application/json' -Accept 'application/json' 与它之前的调用无关;以下是您帖子的复制和粘贴:

    Invoke-RestMethod -Uri 'http://example.com//ford/parts/fuelpump/_apis/wit/wiql?api-version=2.0' -Method Post -Credential $myCredentials 
    -Body $body -ContentType 'application/json' -Accept 'application/json'  
    

    如果要将参数放在单独的行上,只需使用反引号即可。

    Invoke-RestMethod -Uri 'http://example.com//ford/parts/fuelpump/_apis/wit/wiql?api-version=2.0' `
    -Method Post `
    -Credential $myCredentials `
    -Body $body `
    -ContentType `
    'application/json' 
    

    现在,如果您不指定 ContentType(正如我建议的那样),它将默认为帖子上的“application/x-www-form-urlencoded”。据微软称:

    -内容类型

    指定网络请求的内容类型。

    如果省略该参数且请求方式为POST, Invoke-RestMethod 将内容类型设置为 应用程序/x-www-form-urlencoded。否则,内容类型不是 在调用中指定。

    【讨论】:

    • 感谢您的回复。我已经在一行中添加了所有内容 - 仍然无法正常工作。我删除了接受(即使必须将其作为我的端点的发布请求传递)参数 - 不起作用。添加 Content-Type 作为 $headers 变量的值 - 不起作用。每次我看到相同的错误消息时:请求指示方法类型 \"POST\" 的 Content-Type 为 \"application/x-www-form-urlencoded\",这是不受支持的。此方法的有效内容类型为:application/json、application/json-patch+json。”
    • 所以,让我们多谈谈标题中的 Accept 条目。 Invoke-RestMethod 没有附带参数来指定响应格式的外观。如果要添加条目,则需要手动进行。我已经用如何添加它的示例更新了我的答案。如果您的服务需要该标头条目而您不提供它,则可能是一件事。
    猜你喜欢
    • 1970-01-01
    • 2011-07-27
    • 1970-01-01
    • 1970-01-01
    • 2017-10-28
    • 2019-08-07
    • 1970-01-01
    • 1970-01-01
    • 2014-07-08
    相关资源
    最近更新 更多