如果正文参数以' @'开头,则发出PowerShell POST请求

时间:2016-03-01 12:23:53

标签: rest powershell powershell-v5.0

我想在PowerShell中发出POST请求。以下是Postman的身体细节。

{
  "@type":"login",
  "username":"xxx@gmail.com",
  "password":"yyy"
}

如何在PowerShell中传递此内容?

3 个答案:

答案 0 :(得分:41)

您应该能够执行以下操作:

$params = @{"@type"="login";
 "username"="xxx@gmail.com";
 "password"="yyy";
}

Invoke-WebRequest -Uri http://foobar.com/endpoint -Method POST -Body $params

这会将帖子作为正文发送。但是 - 如果你想把它作为Json发布,你可能想要明确。要将其作为JSON发布,您可以指定ContentType并使用

将正文转换为Json
Invoke-WebRequest -Uri http://foobar.com/endpoint -Method POST -Body ($params|ConvertTo-Json) -ContentType "application/json"

额外:您还可以使用Invoke-RestMethod处理JSON和REST apis(这将为您节省一些额外的行以进行反序列化)

答案 1 :(得分:40)

使用Invoke-RestMethod来使用REST-API。将JSON保存为字符串并将其用作正文,例如:

$JSON = @'
{"@type":"login",
 "username":"xxx@gmail.com",
 "password":"yyy"
}
'@

$response = Invoke-RestMethod -Uri "http://somesite.com/oneendpoint" -Method Post -Body $JSON -ContentType "application/json"

如果您使用Powershell 3,我知道Invoke-RestMethod存在一些问题,但您应该可以使用Invoke-WebRequest作为替代:

$response = Invoke-WebRequest -Uri "http://somesite.com/oneendpoint" -Method Post -Body $JSON -ContentType "application/json"

如果您不想每次都编写自己的JSON,可以使用哈希表并在发布之前使用PowerShell将其转换为JSON。实施例

$JSON = @{
    "@type" = "login"
    "username" = "xxx@gmail.com"
    "password" = "yyy"
} | ConvertTo-Json

答案 2 :(得分:-3)

@Frode F.给出了正确的答案。

顺便说一下,Invoke-WebRequest还会打印出200 OK和很多bla,bla,bla ...,这可能有用,但我仍然更喜欢Invoke-RestMethod,它更轻。

此外,请记住,您只需要对正文使用| ConvertTo-Json,而不必对标题使用

$body = @{
 "UserSessionId"="12345678"
 "OptionalEmail"="MyEmail@gmail.com"
} | ConvertTo-Json

$header = @{
 "Accept"="application/json"
 "connectapitoken"="97fe6ab5b1a640909551e36a071ce9ed"
 "Content-Type"="application/json"
} 

Invoke-RestMethod -Uri "http://MyServer/WSVistaWebClient/RESTService.svc/member/search" -Method 'Post' -Body $body -Headers $header | ConvertTo-HTML

然后您可以在请求的末尾附加一个| ConvertTo-HTML,以提高可读性