【问题标题】:Powershell Invoke-Webrequest w/ JSON Body - Can not deserialize...?Powershell Invoke-Webrequest w/JSON Body - 不能反序列化......?
【发布时间】:2018-06-01 18:41:35
【问题描述】:

我需要使用特定格式的正文执行 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 在 [Source: java.io.StringReader@22c614;行:1,列:1] 在 C:\powershell_script_location\ps.ps1:114 字符 9 + $request = Invoke-WebRequest $url -Method Post -Headers $headers -Body $body_json - ... +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + 类别信息:无效操作: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-WebRequest], WebException + FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeWebRequestCommand

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

Invoke-WebRequest, JavaScriptSerializer, 有什么问题吗? 供应商的代码,还是这是用户错误?如果需要任何澄清,请告诉我。

很遗憾,我不知道com.vendor.etc.DataSourceDetail 实例是什么样的,因为我使用的是 API,并且无法直接访问它。

【问题讨论】:

  • 请允许我给你一个标准的建议给新手:如果一个答案解决了你的问题,请点击它旁边的大复选标记 (✓) 接受它,也可以选择给它投票(up - 投票需要 15 个或更多声望点)。如果您发现其他答案有帮助,请给他们投票。接受(您将获得 2 个声望点)和投票可以帮助未来的读者。请参阅the relevant help-center article。如果您的问题尚未得到完全解答,请提供反馈或self-answer

标签: json powershell


【解决方案1】:

使用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"

【讨论】:

  • 在我发帖后才弄清楚这一点。哈希表解决方案效果很好,但我还必须在 ConvertTo-Json 上添加一些 -Depth ,否则如果没有它,它将无法获得“参数”中的所有键/值。谢谢!
  • @J.Doe:pfx 的构造 JSON 的方法绝对是可取的,但生成的 JSON 等效于您问题中的字符串文字。所以我认为只是从Invoke-WebRequest 切换到Invoke-RestMethod 造成了不同吗?
【解决方案2】:

主体未定义

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

不清楚是 invoke-restmethod 还是 azure-functions-core-tools 有错误。

FWIW。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-23
    • 2020-03-17
    • 1970-01-01
    • 1970-01-01
    • 2021-11-07
    相关资源
    最近更新 更多