2014-04-07 14 views
7

W Windows PowerShell 3.0 wprowadzono Invoke-RestMethod cmdlet.PowerShell WebRequest POST

Invoke-RestMethod cmdlet przyjmuje parametr -Body<Object> do ustawiania treści żądania.

Ze względu na pewne ograniczenia nie można było użyć cmdlet w naszym przypadku. Z drugiej strony, alternatywne rozwiązanie opisane w artykule InvokeRestMethod for the Rest of Us pasuje do naszych potrzeb:

$request = [System.Net.WebRequest]::Create($url) 
$request.Method="Get" 
$response = $request.GetResponse() 
$requestStream = $response.GetResponseStream() 
$readStream = New-Object System.IO.StreamReader $requestStream 
$data=$readStream.ReadToEnd() 
if($response.ContentType -match "application/xml") { 
    $results = [xml]$data 
} elseif($response.ContentType -match "application/json") { 
    $results = $data | ConvertFrom-Json 
} else { 
    try { 
     $results = [xml]$data 
    } catch { 
     $results = $data | ConvertFrom-Json 
    } 
} 
$results 

Jednak jest ona przeznaczona tylko dla metody GET. Czy możesz sugerować, jak rozszerzyć tę próbkę kodu z możliwością wysłania treści żądania za pomocą metody POST (podobnie do parametru Body w Invoke-RestMethod)?

Odpowiedz

15

Najpierw zmień linię aktualizującą metodę HTTP.

Następnie należy dodać treść wiadomości do obiektu HttpWebRequest. Aby to zrobić, musisz pobrać odwołanie do strumienia żądań, a następnie dodać do niego dane.

$Body = [byte[]][char[]]'asdf'; 
$Request = [System.Net.HttpWebRequest]::CreateHttp('http://www.mywebservicethatiwanttoquery.com/'); 
$Request.Method = 'POST'; 
$Stream = $Request.GetRequestStream(); 
$Stream.Write($Body, 0, $Body.Length); 
$Request.GetResponse(); 

UWAGA: PowerShell Core edycja jest teraz open source na GitHub, a cross-platform na Linux, Mac i Windows. Wszelkie problemy z poleceniem cmdlet Invoke-RestMethod należy zgłaszać w narzędziu do śledzenia zdarzeń GitHub dla tego projektu, aby można było je śledzić i naprawiać.

+1

dziękuję, Trevor! To jest sposób, w jaki myślałem, że powinien być zaimplementowany, ale nie był pewien, czy to jest najlepszy sposób. –

+0

Nie ma za co, @VadimGremyachev :) Cieszę się, że to pomogło! –

+0

@ TrevorSullivan Jak wyglądałoby ciało, jeśli mam na nim json? – Campinho

3
$myID = 666; 
#the xml body should begin on column 1 no indentation. 
$reqBody = @" 
<?xml version="1.0" encoding="UTF-8"?> 
<ns1:MyRequest 
    xmlns:ns1="urn:com:foo:bar:v1" 
    xmlns:ns2="urn:com:foo:xyz:v1" 
    <ns2:MyID>$myID</ns2:MyID> 
</ns13:MyRequest> 
"@ 

Write-Host $reqBody; 

try 
{ 
    $endPoint = "http://myhost:80/myUri" 
    Write-Host ("Querying "+$endPoint) 
    $wr = [System.Net.HttpWebRequest]::Create($endPoint) 
    $wr.Method= 'POST'; 
    $wr.ContentType="application/xml"; 
    $Body = [byte[]][char[]]$reqBody; 
    $wr.Timeout = 10000; 

    $Stream = $wr.GetRequestStream(); 

    $Stream.Write($Body, 0, $Body.Length); 

    $Stream.Flush(); 
    $Stream.Close(); 

    $resp = $wr.GetResponse().GetResponseStream() 

    $sr = New-Object System.IO.StreamReader($resp) 

    $respTxt = $sr.ReadToEnd() 

    [System.Xml.XmlDocument] $result = $respTxt 
    [String] $rs = $result.DocumentElement.OuterXml 
    Write-Host "$($rs)"; 
} 
catch 
{ 
    $errorStatus = "Exception Message: " + $_.Exception.Message; 
    Write-Host $errorStatus; 
} 
Powiązane problemy