PowerShell WebRequest POST

11

在Windows PowerShell 3.0中引入了 Invoke-RestMethod cmdlet。

Invoke-RestMethod cmdlet 接受 -Body<Object> 参数以设置请求主体。

由于某些限制,Invoke-RestMethod cmdlet 在我们的情况下无法使用。另一方面,文章 InvokeRestMethod for the Rest of Us 中描述的替代方案符合我们的需求:

$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 

但是它仅适用于GET方法。请问您能否建议如何扩展此代码示例以使用POST方法发送请求正文(类似于Invoke-RestMethod中的Body参数)?

2个回答

20

首先,更改更新HTTP方法的那一行代码。

$request.Method= 'POST';

接下来,您需要将消息正文添加到 HttpWebRequest 对象中。为此,您需要获取对请求流的引用,然后向其中添加数据。

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

注意PowerShell Core版本现在已经在GitHub上开源,并且跨平台运行于Linux、Mac和Windows操作系统。如有任何与Invoke-RestMethod命令相关的问题,请在该项目的GitHub问题跟踪器上进行报告,以便进行跟踪和修复。


1
谢谢你,Trevor!这是我认为应该实现的方式,但我不确定这是否是最好的方式。 - Vadim Gremyachev
@TrevorSullivan 如果我的请求体中有一个 JSON,它会是什么样子? - Campinho
@campinho:只需将“asdf”替换为您的JSON即可 :) - user189198
1
@TrevorSullivan,我可以用这种方式发送文件吗?像$Body = [reports[]]$filecontent;我在这里有一个问题(http://stackoverflow.com/questions/39144921/how-to-pass-an-array-via-web-request),现在我看到了这个答案。你觉得这个解决方案在我的情况下会起作用吗? - gofr1
1
@irl_irl 是的,我在这里找到了关于这个问题的答案:http://stackoverflow.com/questions/39144921/how-to-pass-an-array-via-web-request - gofr1
显示剩余2条评论

5
$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;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接