Powershell使用JSON Body调用Invoke-Webrequest时,无法反序列化...?

5

我需要执行Invoke-Webrequest命令,并使用特定格式的正文将设备添加到产品中。以下是json格式的示例(直接从供应商文档中摘取):

$body_json = '{"datasource": [{
            "parentId": "123456789000",
            "name": "(name)",
            "id": "(value)",
            "typeId": 0,
            "childEnabled": false,
            "childCount": 0,
            "childType": 0,
            "ipAddress": "(ipAddress)",
            "zoneId": 0,
            "url": "(url)",
            "enabled": false,
            "idmId": 123456789000,
            "parameters": [{
                "key": "(key)",
                "value": "(value)"
            }]
        }]}'

当我尝试以其json表示形式提交时,出现以下错误:
Invoke-WebRequest : 无法将START_ARRAY令牌的实例反序列化为com.vendor.etc.DataSourceDetail。在[来源:java.io.StringReader@22c614; line: 1, column: 1]处
C:\powershell_script_location\ps.ps1:114字符9 + $request = Invoke-WebRequest $url -Method Post -Headers $headers -Body $body_json - ... + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-WebRequest], WebException + FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeWebRequestCommand
问题出在“parameters”的格式上,当省略“parameters”时,请求可以成功提交,但是添加的设备缺少重要的参数细节。
Invoke-WebRequest、JavaScriptSerializer、供应商的代码有问题,还是用户操作有误?如果需要任何澄清,请告诉我。
不幸的是,我不知道com.vendor.etc.DataSourceDetail实例的样子,因为我正在使用API,没有直接访问权限。
2个回答

11

使用Invoke-RestMethod替代Invoke-WebRequest

如果请求正文为字符串,请使用:

Invoke-RestMethod -Uri http://your-url.com -Method POST -Body $body_json -ContentType "application/json"   

如果要从数据/参数构建主体,可以更容易地通过构建 hashtable 并通过 ConvertTo-Json 将其转换为 json:

$body_json = @{
    datasource = @(
        @{
            parentId = 123456789000
            name = "name"
            id = "value"
            typeId = 0
            childEnabled = $false
            childCount = 0
            childType = 0
            ipAddress = "ipAddress"
            zoneId = 0
            url = "url"
            enabled = $false
            idmId = 123456789000
            parameters = @( @{
                key = "key"
                value = "value"
            })
       })} | ConvertTo-Json -Depth 4

Invoke-RestMethod -Method 'Post' -Uri http://your-url.com -Body $body_json -ContentType "application/json"

发布后,我最终解决了这个问题。哈希表的解决方案非常好,但我还必须在ConvertTo-Json上添加一些深度,否则它将无法获取'parameters'中的所有键/值。谢谢! - J. Doe
@J.Doe: pfx的JSON构建方法肯定更可取,但是得到的JSON与您问题中的字符串字面值等效。所以我猜这只是从 Invoke-WebRequest 切换到 Invoke-RestMethod 所带来的差异? - mklement0

0

未定义的正文

我不明白为什么服务器上的 req.bodyundefined(NodeJS Azure Function)。原来是我的标头为空字符串

不清楚是 invoke-restmethod 还是 azure-functions-core-tools 有漏洞。

FWIW。


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