Rest PowerShell没有';无法识别提供的参数

Rest PowerShell没有';无法识别提供的参数,rest,powershell,content-type,Rest,Powershell,Content Type,操作系统-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.Eng

操作系统-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
调用最初是跨两行的,没有行延续,下面讨论这一部分

我在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仍在抱怨。以前有人遇到过这个错误吗?我应该用它向微软报告吗?感谢您的建议…

您需要将标题传递到headers参数中

$headers = @{
    "Content-Type" = "application/json",
    "Accept" = "application/json"
}

Invoke-RestMethod -Uri 'http://example.com/123' -Method Post -Body $body -Headers $headers 
请参见-

两件事

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

$url = 'https://jsonplaceholder.typicode.com/posts/1'
$response_from_webservice = Invoke-RestMethod -Uri $url -ContentType 'application/json' -Method 'Get'
jsonplaceholder。。。是一项公共服务,可用于测试。请在您的计算机上随意运行代码片段,以防需要进行健全性检查

其次,您发送的示例代码具有以下参数:

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。我已经查过了。我检查了commandlet的参数。我没有找到它

我分享这一点是为了解释,我不能用那个通话信号重现你的场景

如果要将
accept
条目添加到HTTP头中,则必须直接执行以下操作:

$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
第三,看起来您没有在代码段中指定内容类型。该代码段的
Invoke rest方法
与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”。据微软称:

-内容类型

指定web请求的内容类型

如果省略此参数且请求方法为POST, Invoke RestMethod将内容类型设置为 application/x-www-form-urlencoded。否则,内容类型不正确 在调用中指定


谢谢在文档页面上,它清楚地表明invokerestmethod方法接受ContentType作为参数。因此,如果请求方法是Post,ContentType总是设置为application/x-www-form-urlencoded。参数的漂亮实现。这是传递标题数据的好方法,但您也可以将ContentType作为参数传递-仅供参考。@Kevin Smith顺便说一句,我相信它应该是$headers=@{“Content Type”=“application/json”},并在内容类型周围加引号,否则,鲍威尔会抱怨内容和键入单词之间的破折号字符感谢响应。我在一行中添加了所有内容-仍然不起作用。我删除了Accept(即使必须将其作为端点的Post请求传递)参数-不起作用。将内容类型添加为$headers变量的值-不起作用。每次我看到相同的错误消息时:请求表示方法类型“POST”的内容类型为“application/x-www-form-urlencoded”,这是不受支持的。此方法的有效内容类型为:application/json、application/json patch+json。“那么,让我们进一步讨论一下标题中的
Accept
条目<代码>调用RestMethod没有附带参数来指定响应格式。如果要添加条目,则需要手动添加。我已经用一个如何添加的示例更新了我的答案。如果您的服务需要该头条目,而您不提供它,那么这可能是一件好事。