Как отправить JSON в PowerShell RestMethod или WebRequest - PullRequest
0 голосов
/ 31 января 2019

Я пытаюсь подключиться к нашему McAfee ESM с помощью вызова API PowerShell.

API требует, чтобы параметры были переданы ему в форме JSON.Я пытался использовать командлет PowerShell ConvertTo-Json с хэшем, и я также пытался использовать только прямой текст 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

Я ожидаю получить результат обратно, сообщив, что он успешно созданисточник данных или сказать мне, что мне не хватает какого-то параметра.На самом деле я получаю

Invoke-RestMethod: Невозможно десериализовать экземпляр [ERROR] 'com.mcafee.siem.api.data.datasource.EsmDataSourceDetail' из START_ARRAY [ERROR] токена

Похоже, что это почти идентичная проблема для этого пользователя:

Powershell Invoke-Webrequest с JSON Body - Невозможно десериализовать ...? , нопользователь не объясняет, как он / она это исправил.

Редактировать: McAfee ESM имеет страницу справки API для конкретного вызова API для добавления источника данных.Все остальные вызовы API задокументированы одинаково.Вот большая часть содержимого из него:

Описание Добавить источник данных.

Параметры Тип источника данных: EsmDataSourceDetail Описание: источник данных для добавления Возвращаемое значение (возвращен корневой элемент JSON "return")Тип: EsmDataSourceId Описание: идентификатор источника данных только что добавленного источника данных Пример вызова REST (с JSON, если применимо) https://siem/rs/esm/dsAddDataSource

Пример содержимого 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)"
    }]
}}

1 Ответ

0 голосов
/ 02 февраля 2019

Похоже, что ваш $body_json_converted неверен на основе вашего примера JSON.

Вы указали datasource как массив с таблицей в нем.В двух других примерах это просто таблица.parentId также выглядит как таблица.

[ordered] только облегчает сравнение.

Итак, я бы попробовал:

$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

Выводсверху:

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"
      }
    ]
  }
}

Если вы предпочитаете, вы можете просто добавить 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)"
    }]
}}
"@
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...