Powershell Invoke-Webrequest с JSON Body - не может десериализовать ...? - PullRequest
0 голосов
/ 01 июня 2018

Мне нужно выполнить 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 на [Source: java.io.StringReader@22c614;строка: 1, столбец: 1] В C: \ powershell_script_location \ ps.ps1: 114 char 9 + $ request = Invoke-WebRequest $ url -Metod 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, и у меня нет прямого доступа к нему.

1 Ответ

0 голосов
/ 02 июня 2018

Используйте Invoke-RestMethod вместо Invoke-WebRequest.

Если у вас есть тело в качестве строки, используйте:

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

Если тело должно быть построено из данных / параметров, ономожет быть проще создать хеш-таблицу и преобразовать ее в json с помощью ConvertTo-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"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...