简体   繁体   English

如何将JSON提交到PowerShell RestMethod或WebRequest中

[英]How do I submit JSON into a PowerShell RestMethod or WebRequest

I'm trying to connect to our McAfee ESM using a PowerShell API call. 我正在尝试使用PowerShell API调用连接到我们的McAfee ESM。

The API calls for parameters to be submitted to it in JSON form. API要求将参数以JSON形式提交给它。 I've tried to use the PowerShell ConvertTo-Json commandlet with a hash and i've also tried to use just straight json text. 我尝试将PowerShell ConvertTo-Json Commandlet与哈希一起使用,并且还尝试仅使用纯JSON文本。

$headers = @{
    'Content-Type' = 'application/json'
    'Accept' = 'application/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)"
        }]
    }}

$body_json_converted = @{
      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 $url -Body $body_json_converted -Method Post -Headers $headers

Invoke-WebRequest $url -Body $body_json -Method Post -Headers $headers

I expect to get a result back saying that it has sucessfully created the data source or to tell me that i'm missing a parameter of some sort. 我希望得到一个返回的结果,说它已经成功创建了数据源,或者告诉我我缺少某种参数。 What i'm actually getting is 我实际上得到的是

Invoke-RestMethod : Cannot deserialize instance of [ERROR] 'com.mcafee.siem.api.data.datasource.EsmDataSourceDetail' out of START_ARRAY [ERROR] token Invoke-RestMethod:无法从START_ARRAY [ERROR]令牌中反序列化[ERROR]'com.mcafee.siem.api.data.datasource.EsmDataSourceDetail'的实例

This appears to be almost an identical issue to this user: 对于该用户,这似乎几乎是一个相同的问题:

Powershell Invoke-Webrequest w/ JSON Body - Can not deserialize...? 带JSON主体的Powershell Invoke-Webrequest-无法反序列化...? but the user doesn't explain how he/she fixed it. 但是用户没有说明他/她如何修复它。

Edit: The McAfee ESM has an API help page for the particular API call to add a data source. 编辑:McAfee ESM有一个API帮助页面,用于特定的API调用以添加数据源。 All of the other API calls are documented the same. 所有其他API调用的文档均相同。 Here is the majority of the content from it: 以下是其中的大部分内容:

Description Add a data source. 说明添加数据源。

Parameters datasource Type: EsmDataSourceDetail Description: datasource to add Return Value ("return" JSON root element IS returned) Type: EsmDataSourceId Description: datasource id of the datasource that was just added Example REST Call (with JSON if applicable) https://siem/rs/esm/dsAddDataSource 参数datasource类型:EsmDataSourceDetail说明:要添加的数据源返回值(返回“ JSON” IS根元素)类型:EsmDataSourceId说明:刚刚添加的数据源的数据源ID示例REST调用(如果适用,带有JSON) https:// siem / RS / ESM / dsAddDataSource

Example JSON Content: JSON内容示例:

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

Looks like your $body_json_converted is wrong based on your JSON example. 根据您的JSON示例,您似乎$body_json_converted错误。

You've specified datasource as an array with a table in it. 您已将datasource指定为包含表的数组。 In the other two examples its just a table. 在其他两个示例中,它只是一个表。 parentId also looks like it should be a table. parentId看起来也应该是一个表。

[ordered] just makes it easier to compare. [ordered]只是使比较容易。

So, I would try: 因此,我会尝试:

$body_json_converted = @{
      datasource = [ordered]@{
           parentId = @{
               id = 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

Output from above: 上面的输出:

PS > $body_json_converted
{
  "datasource": {
    "parentId": {
      "id": 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"
      }
    ]
  }
}

If you'd prefer you can also just add the JSON directly instead of converting: 如果您愿意,也可以直接添加JSON而不是进行转换:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM