我需要使用特定格式的主体执行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 : Can not deserialize instance of com.vendor.etc.DataSourceDetail out of START_ARRAY token at [Source: 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,但无法直接访问它。
最佳答案
使用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"
关于json - 具有/JSON正文的Powershell Invoke-Webrequest-无法反序列化吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50649349/