Расширение переменной в объекте JSON для использования с Invoke-RestMethod - PullRequest
0 голосов
/ 16 мая 2019

В последние несколько дней я искал документацию по расширению переменных в объектах JSON. Я перепробовал много рекомендаций и исправлений, но ни одна из них не работает так, как ожидалось. Мне остается задуматься, есть ли лучший способ, чем я реализовал. Во всяком случае, на мой случай использования.

Вариант использования У меня есть массив целых чисел, которые представляют объекты в веб-приложении. Эти объекты могут устанавливать отношения между ними, отправляя запрос POST к конечной точке API.

Этот массив целых чисел называется $combined.

PS C:\> $combined

        i_id       m_id
------------ ----------
       75419       6403
       75420       6403
       75421       6403
       75410       6403

Чтобы настроить параметры, используемые для моего запроса POST, я создал еще один массив с именем $associationParams.

    $associationParams = @{
        ContentType = "application/json"
        Body = '{"id": '+$($thing).m_id+'}'
        Method = "POST"
        URI = "https://application/api/in/$($thing.i_id)/endpoint"
        Headers = $headers
    }

Переменная $headers, указанная выше, является токеном авторизации.

Итак, мое первоначальное намерение - перебрать массив целых чисел ($combined) и вызвать Invoke-RestMethod следующим образом:

    Foreach ($thing in $combined) {
        Invoke-RestMethod @iocAssociationParams
    }

Задача Таким образом, у меня на самом деле нет проблемы как таковой ... Кажется, что в моем тестировании есть некоторая несогласованность, когда окончательный ForEach, кажется, не проходит через все элементы в массиве $combined ... Но Мне интересно, есть ли лучший способ. Я попытался отформатировать строку JSON-объекта в параметре Body в $associationParams, но это определенно не сработало. Я также пробовал разные формы цитирования, но они тоже не работали. Является ли попытка указать параметры для Invoke-RestMethod лучшим способом? Должен ли я просто перечислить все параметры для Invoke-RestMethod в цикле ForEach?

Ответы [ 2 ]

1 голос
/ 16 мая 2019

Используйте оператор формата -f для вставки $thing.m_id внутри foreach в $AssociationParams.
Вы должны убрать буквальные фигурные скобки, удвоив их.

Foreach ($thing in $combined) {
    $AssociationParams = @{
        ContentType = "application/json"
        Body        = '{{"id": {0}}}' -f $thing.m_id
        Method      = "POST"
        URI         = "https://application/api/in/$($thing.i_id)/endpoint"
        Headers     = $headers
    }
    Invoke-RestMethod @AssociationParams
}
0 голосов
/ 24 мая 2019

Вот мое решение, как оно реализовано.

Foreach ($thing in $combined) {
    # Now we create the body of the request as a Powershell object with the intent to convert it to JSON later
    $AssociationBodyObj = [PSCustomObject]@{
        id = $($thing.id)
    }

    # ...and then we convert it to JSON
    $AssociationBodyObj = $AssociationBodyObj | ConvertTo-Json

    $iocAssociationParams = @{
        ContentType = "application/json"
        Body        = $AssociationBodyObj
        Method      = "POST"
        URI         = "https://application/api/in/$($thing.i_id)/endpoint"
        Headers     = $headers
    }
    Invoke-RestMethod @AssociationParams
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...