如果一个请求参数以'@'开头,如何使用PowerShell进行POST请求

64

我想在PowerShell中发起POST请求。以下是Postman中的请求体详情。

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

我该如何在PowerShell中传递这个参数?

3个回答

98

你应该能够完成以下任务:

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

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

这将会以请求正文的形式发送此post。然而,如果您想将其作为JSON发布,则可能需要明确表达。要将其作为JSON发布,您可以指定ContentType,并使用相关方法将正文转换为Json。

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

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


1
虽然你可以使用哈希表(@{...})来进行GET请求,其中哈希表条目被转换为<key>=<value>&...的查询字符串,但我认为这对于POST JSON请求不起作用。将Invoke-WebRequest https://httpbin.org/post -Body @{ "foo"="bar"; "baz"="bam" } -Method POST -ContentType 'application/json'的输出与Invoke-WebRequest https://httpbin.org/post -Body '{ "foo":"bar", "baz":"bam" }' -Method POST -ContentType 'application/json'进行比较。我认为你需要显式调用ConvertTo-Json并传递结果字符串。 - mklement0
如果正文已经是JSON格式的字符串,为什么要创建一个哈希表并将其转换回JSON呢?OP显示他们的正文已经是JSON格式的。 - Jesse Chisholm
我需要在我的ConvertTo-Json参数中加上“-EscapeHandling EscapeNonAscii”才能使其正常工作。这可能只适用于我的情况,但也可能对其他人有帮助。 - Martini Bianco

72

使用Invoke-RestMethod来调用REST-APIs。将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

6

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

顺便提一下,Invoke-WebRequest还会打印出200 OK和大量的废话……这可能是有用的,但我仍然更喜欢更轻量级的Invoke-RestMethod

此外,请记住只需要将正文使用| ConvertTo-Json转换为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,以获得更好的可读性。


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