Powershell v3 Invoke-RestMethod标题

flo*_*oyd 7 rest powershell-3.0

我正在尝试对服务进行RestAPI调用,该服务在其文档中指定以下内容:

Integration Server可以以XML和JSON格式进行响应.在请求中使用以下接受标头之一:

  1. 接受:application/json,/.
  2. 接受:application/xml,/

如果accept标头不包含application/xml,application/json或/,则集成服务器将使用"406方法不可接受"状态代码进行响应.

我的powershell代码看起来像这样 Invoke-RestMethod -URI https://URL/ticket -Credential $cred -Method Get -Headers @{"Accept"="application/xml"}

但是我收到与标题有关的以下错误: Invoke-RestMethod : This header must be modified using the appropriate property or method. Parameter name: name

有人可以帮助我理解为什么powershell不会让我指定Accept标头?或者我在这里缺少另一种方法吗?

谢谢

Vad*_*hev 7

由于Accept无法在PowerShell V3中为Invoke-RestMethodInvoke-WebRequest 指定头,因此您可以考虑以下在某种程度上模拟的函数Invoke-RestMethod:

Function Execute-Request()
{
Param(
  [Parameter(Mandatory=$True)]
  [string]$Url,
  [Parameter(Mandatory=$False)]
  [System.Net.ICredentials]$Credentials,
  [Parameter(Mandatory=$False)]
  [bool]$UseDefaultCredentials = $True,
  [Parameter(Mandatory=$False)]
  [Microsoft.PowerShell.Commands.WebRequestMethod]$Method = [Microsoft.PowerShell.Commands.WebRequestMethod]::Get,
  [Parameter(Mandatory=$False)]
  [Hashtable]$Header,  
  [Parameter(Mandatory=$False)]
  [string]$ContentType  
)

   $client = New-Object System.Net.WebClient
   if($Credentials) {
     $client.Credentials = $Credentials
   }
   elseif($UseDefaultCredentials){
     $client.Credentials = [System.Net.CredentialCache]::DefaultCredentials 
   }
   if($ContentType) {
      $client.Headers.Add("Content-Type", $ContentType)
   }
   if($Header) {
       $Header.Keys | % { $client.Headers.Add($_, $Header.Item($_)) }  
   }     
   $data = $client.DownloadString($Url)
   $client.Dispose()
   return $data 
}
Run Code Online (Sandbox Code Playgroud)

例子:

Execute-Request -Url "https://URL/ticket" -UseDefaultCredentials $true

Execute-Request -Url "https://URL/ticket" -Credentials $credentials -Header @{"Accept" = "application/json"} -ContentType "application/json"
Run Code Online (Sandbox Code Playgroud)


boa*_*des 1

我相信此标头受到保护,您应该在 WebRequest 中指定它。根据Microsoft Connect 的说法,这是一个错误:

使用 -ContentType 的解决方法允许指定“application/xml”,但这不能帮助用户指定版本或通常在 Accept 标头中找到的其他项目。

但它仅在某些场景下有效。我不知道您要调用什么服务,所以我无法测试我的假设。