2013-08-16 10 views
5

Ich versuche, einen RestAPI Anruf zu einem Dienst zu machen, die in es gibt Dokumentation ist die folgende:Powershell v3 Invoke-RestMethod Headers

Eine Integration Server kann in XML und JSON-Formaten reagieren. Verwenden Sie eine der folgenden akzeptieren Header in Ihrer Anfragen:

  1. akzeptieren: application/json, /.
  2. akzeptieren: application/xml, /

Wenn der Header akzeptiert keine application/xml, application/json oder /, die Integration Server antwortet mit einem "406 Verfahren nicht akzeptabel" schließen Statuscode.

Mein Powershell-Code sieht wie folgt aus Invoke-RestMethod -URI https://URL/ticket -Credential $cred -Method Get -Headers @{"Accept"="application/xml"}

Aber ich bekomme die folgende Fehlermeldung an den Header beziehen: Invoke-RestMethod : This header must be modified using the appropriate property or method. Parameter name: name

Kann mir jemand helfen, mit dem Verständnis, warum Powershell mich nicht lassen geben Sie den Accept-Header ? Oder gibt es eine andere Methode, die mir hier fehlt?

Dank

+2

Nur ein Hinweis, dass dieser Fehler hat in neueren Versionen von PowerShell korrigiert. –

Antwort

1

Ich glaube dieser Header geschützt ist und Sie sollten es in WebRequest angeben. Nach Microsoft Connect ist es ein Bug:

Die Abhilfe von -ContentType mit ermöglicht ‚application/xml‘ angegeben werden, aber diese Benutzer-Version oder andere Gegenstände nicht hilft in der Regel in den Accept-Header angeben.

Aber es funktioniert nur in bestimmten Szenarien. Ich weiß nicht, welchen Dienst Sie aufrufen möchten, damit ich meine Annahme nicht testen kann.

3

Da Accept header could not be specified für weder Invoke-RestMethod noch Invoke-WebRequest in Powershell-V3, könnten Sie die folgende Funktion betrachten, die Invoke-RestMethod zu einem gewissen Grad simuliert:

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 
} 

Beispiele:

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

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