[英]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.