具有JSON Body的Powershell Invoke-Webrequest - 无法反序列化......?

时间:2018-06-01 18:41:36

标签: json powershell

我需要使用特定格式的主体执行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:无法反序列化实例   com.vendor.etc.DataSourceDetail出自START_ARRAY令牌[来源:   java.io.StringReader@22c614; line:1,column:1] At   C:\ powershell_script_location \ ps.ps1:114 char 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

问题在于“参数”参数的格式,因为省略“参数”时请求提交正常,但是 我正在添加的设备缺少重要的参数详细信息。

Invoke-WebRequest, JavaScriptSerializer,是否有问题 供应商的代码,或者这是用户错误?如果需要澄清,请告诉我。

不幸的是我不知道com.vendor.etc.DataSourceDetail实例是什么样的,因为我正在使用API​​而我无法直接访问它。

2 个答案:

答案 0 :(得分:2)

使用Invoke-RestMethod代替Invoke-WebRequest

如果您将身体作为字符串使用:

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

如果必须使用数据/参数构造主体,则可能更容易构建哈希表并通过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"

答案 1 :(得分:0)

身体未定义

我不明白为什么服务器上的req.bodyundefined(NodeJS Azure函数)。原来我有一个标头,它是一个空字符串

尚不清楚invoke-restmethod azure-functions-core-tools 是否存在错误。

FWIW。