2014-04-07 13 views
7

In Windows PowerShell 3.0 wurde Invoke-RestMethod Cmdlet eingeführt.PowerShell WebRequest POST

Invoke-RestMethod Das Cmdlet akzeptiert -Body<Object> Parameter zum Festlegen des Hauptteils der Anforderung.

Aufgrund einer bestimmten Einschränkungen Invoke-RestMethod Cmdlet konnte in unserem Fall nicht verwendet werden. Von der anderen Seite eine alternative Lösung in Artikeln beschrieben InvokeRestMethod for the Rest of Us paßt unsere Bedürfnisse:

$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 

Aber es ist für eine GET-Methode nur vorgesehen. Könnten Sie bitte vorschlagen, wie Sie dieses Codebeispiel um die Möglichkeit erweitern können, den Nachrichtentext mithilfe der Methode POST (ähnlich Body in Invoke-RestMethod) zu senden?

Antwort

15

Zuerst ändern Sie die Zeile, die die HTTP-Methode aktualisiert.

$request.Method= 'POST'; 

Als nächstes müssen Sie den Nachrichtentext zum HttpWebRequest Objekt hinzuzufügen. Dazu müssen Sie einen Verweis auf den Anforderungsstream abrufen und dann Daten hinzufügen.

$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(); 

HINWEIS: PowerShell Core Ausgabe ist jetzt Open Source auf GitHub und Cross-Plattform auf Linux, Mac und Windows. Alle Probleme mit dem Cmdlet Invoke-RestMethod sollten im GitHub-Issue-Tracker für dieses Projekt gemeldet werden, damit sie verfolgt und behoben werden können.

+1

danke, Trevor! Dies ist die Art und Weise, wie ich dachte, es sollte umgesetzt werden, war aber nicht sicher, ob dies der beste Weg ist –

+0

Sie sind herzlich willkommen, @VadimGremyachev :) Ich freue mich, das hat Ihnen geholfen! –

+0

@TrevorSullivan Wie würde der Körper aussehen, wenn ich einen JSON drauf habe? – 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; 
}