2013-08-16 8 views
5

Próbuję nawiązać połączenie RestAPI do usługi, która określa w to następujące dokumenty:PowerShell v3 Invoke-RestMethod Główki

integracja Serwer może odpowiedzieć w formatach XML i JSON. Użyj jednego z następujących zaakceptować nagłówków w twoich wniosków:

  1. zaakceptować: application/json, /.
  2. zaakceptować: application/xml, /

Jeśli przyjąć nagłówek nie obejmuje application/xml, application/json lub /, serwer integracja będzie reagować z "406 metoda nie do przyjęcia" Kod statusu.

Mój kod PowerShell wygląda to Invoke-RestMethod -URI https://URL/ticket -Credential $cred -Method Get -Headers @{"Accept"="application/xml"}

Ale pojawia się następujący błąd odnoszący się do nagłówka: Invoke-RestMethod : This header must be modified using the appropriate property or method. Parameter name: name

Czy ktoś może mi pomóc w zrozumieniu dlaczego PowerShell nie pozwala mi określić Zebrane nagłówek ? Czy jest jeszcze inna metoda, której tu brakuje?

Dzięki

+2

Wystarczy pamiętać, że ten błąd ma został poprawiony w nowszych wersjach PowerShell. –

Odpowiedz

1

wierzę ten nagłówek jest chroniony i należy określić ją w WebRequest. Według Microsoft Connect to jest błąd:

Obejście korzystania -ContentType pozwala na „application/xml”, która zostanie określona, ​​ale to nie pomaga użytkownikom na określenie wersji lub inne przedmioty, zazwyczaj znajdujący się w nagłówku Accept.

Ale działa tylko w niektórych scenariuszach. Nie wiem, z jakiej usługi próbujesz się odwołać, więc nie mogę przetestować mojego założenia.

3

Od Accept header could not be specified ani dla Invoke-RestMethod ani Invoke-WebRequest w PowerShell V3, można rozważyć następujące funkcje, które symulują do pewnego stopnia 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 
} 

Przykłady:

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

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