Powershell v3调用RestMethod头

Powershell v3调用RestMethod头,rest,powershell-3.0,Rest,Powershell 3.0,我正在尝试对服务进行RestAPI调用,该服务在其文档中指定以下内容: 集成服务器可以以XML和JSON格式响应。在应用程序中使用以下接受标头之一 要求: 接受:application/json,/ 接受:application/xml/ 如果accept标头不包括application/xml、application/json或/,则集成服务器将以“406 method not acceptable”状态代码响应 我的powershell代码如下所示 Invoke RestMethod-URI

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

集成服务器可以以XML和JSON格式响应。在应用程序中使用以下接受标头之一 要求:

  • 接受:application/json,/
  • 接受:application/xml/
  • 如果accept标头不包括application/xml、application/json或/,则集成服务器将以“406 method not acceptable”状态代码响应

    我的powershell代码如下所示
    Invoke RestMethod-URIhttps://URL/ticket -凭证$cred-Method Get-Headers@{“Accept”=“application/xml”}

    但是我得到了与标题相关的以下错误:
    Invoke RestMethod:必须使用适当的属性或方法修改此标头。
    参数名称:名称

    有人能帮助我理解为什么powershell不让我指定Accept标头吗?还是我还缺少另一种方法


    谢谢

    我相信这个标题是受保护的,你应该在WebRequest中指定它。据了解,这是一个错误:

    使用-ContentType的变通方法允许指定“application/xml”,但这无助于用户指定版本或通常在Accept头中找到的其他项

    但它只在特定的场景下起作用。我不知道你想调用什么服务,所以我不能测试我的假设。

    < P>因为在PultBuSE V3中既没有,也没有考虑,下面的函数可以在某种程度上模拟<代码>调用REST方法< /> >:

    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 
    }
    
    示例:

    Execute-Request -Url "https://URL/ticket" -UseDefaultCredentials $true
    
    Execute-Request -Url "https://URL/ticket" -Credentials $credentials -Header @{"Accept" = "application/json"} -ContentType "application/json"
    

    请注意,此错误已在较新版本的PowerShell中更正。