Отправить PSCustomObject в качестве параметра тела в Invoke-RestMethod - PullRequest
0 голосов
/ 20 марта 2020

У меня есть JSON, содержащий массив объектов URL + body.

> $categories[0]

url       body
---       ----
https:XXX @{custom_field_value_id=12345}

Когда я звоню

Invoke-RestMethod -Headers $headers -Method POST -Uri url  -Body ($categories[0].body|ConvertTo-Json)

, я получаю HTTP 500 с сервера.

Когда я звоню

Invoke-RestMethod -Headers $headers -Method POST -Uri "https://XXX"  -Body @{custom_field_value_id=12345}

, это работает.

Есть подсказки? Я предполагаю, что это ошибка типа / опечатки. Есть предложения?

1 Ответ

1 голос
/ 20 марта 2020

Ваш $categories[0] объект содержит свойство body со строковым значением @{custom_field_value_id=12345}. Когда вы передаете @{custom_field_value_id=12345} непосредственно в -Body параметр Invoke-RestMethod , он обрабатывается как [HashTable]. Чтобы ваш первый пример кода обрабатывал значение -Body так же, как и второе, вам необходимо преобразовать строку в таблицу ha sh.

$body = $categories[0].body -replace '^@{|}$' | ConvertFrom-Stringdata
Invoke-RestMethod -Headers $headers -Method POST -Uri $categories[0].url  -Body $body

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

^@{ соответствует началу строки (^) и буквальным символам @{. | - это чередование (OR). } является буквальным } символом. $ соответствует концу строки.

Цель состоит в том, чтобы удалить все лишние символы, оставляя после себя синтаксис key=value. Этот синтаксис может быть передан в ConvertFrom-Stringdata , который преобразует данные в таблицу ha sh.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...