如何使用包含数组或列表的JSON Body进行webrequest?

OCr*_*m85 6 powershell

情况

我需要与需要JSON帖子数据的REST API进行交互.所以我开始使用这样的东西:

简单的工作示例

$ReqURI = 'http://httpbin.org/post'
Invoke-WebRequest -Method Post -Uri $ReqURI -Body @{
    'api.token' = "api.token"
    'action' = 'create item'
} -Verbose| fl *
Run Code Online (Sandbox Code Playgroud)

所以我用httpbin.org测试了它:

工作

问题

但是,如果您需要在正文部分中使用列表或数组,如下例所示:

$ReqURI = 'http://httpbin.org/post'
$Response = Invoke-RestMethod -Method Post -Uri $ReqURI -Body @{
    'api.token' = "api.token"
    'names' = @('rJENK', 'rFOOBAR')
} -Verbose| fl *
$Response
Run Code Online (Sandbox Code Playgroud)

...你得到的东西就像转换错误:

转换问题

所以我想我可以将自己转换为JSON字符串并使用-Depth参数from ConvertTo-JSON.除此之外,我尝试了如果我先将哈希表转换为对象的样子.

但两次尝试都会返回相同甚至更糟的结果:

不工作

所以最后我切换到了Invoke-WebRequest.但这里的结果是一样的.

我的参考是使用JSON字符串的工作api调用:

"api.token" : "fooobar",
"names": [
    "rJENK",
    "rFOOBAR"
  ]
Run Code Online (Sandbox Code Playgroud)

个人解决方案

我想出了一个解决方法.看起来我正在使用的api无法处理包含嵌套元素或PowerShell创建的数组的请求.

非工作示例:

$ReqURI = 'http://httpbin.org/post'
$Response = Invoke-RestMethod -Method Post -Uri $ReqURI -Body @{
    'api.token' = "api.token"
    'names' = @('rJENK', 'rFOOBAR')
} -Verbose| fl *
$Response
Run Code Online (Sandbox Code Playgroud)

相反,我不得不伪造一个带索引的数组.这是解决方法:

$ReqURI = 'http://httpbin.org/post'
$Response = Invoke-RestMethod -Method Post -Uri $ReqURI -Body @{
    'api.token' = "api.token"
    'names[0]' = 'rJENK'
    'names[1]' = 'rFOOBAR'
} -Verbose| fl *
$Response
Run Code Online (Sandbox Code Playgroud)

Ran*_*tta 9

所以现在你必须使用内容类型作为Application/Json像:

$ReqURI = 'http://httpbin.org/post'

$Jsonbody= @{
    'api.token' = "api.token"
    'names' = @('rJENK', 'rFOOBAR')
        } | ConvertTo-Json

$Response = Invoke-RestMethod -Method Post -ContentType 'application/json' -Uri $ReqURI -Body $body -Verbose| fl *
Run Code Online (Sandbox Code Playgroud)

这应该可以完成您的工作。希望能帮助到你。