Итак, после публикации моего предыдущего вопроса cURL в хеш-таблице PowerShell (который был решен), я столкнулся с новой проблемой, преобразовав cURL в PowerShell на этот раз с 3 хэш-таблицами в данных (?) (Или, что более вероятно, мои навыки PowerShell ). На этот раз мой скрипт через PowerShell возвращает:
...General Error java.util.LinkedHashMap cannot be cast to java.util.List
Вот cURL, который отлично работает через Postman:
curl -X PATCH \
https://example.com/apis/v1.1/parameters \
-H 'Authorization: Bearer 1234567890' \
-H 'Content-Type: application/json' \
-H 'cache-control: no-cache' \
-d '{
"data": [
{
"DUID": 3299,
"AID": 551,
"CID": 10002,
"Parameters": [
{
"name": "Customer.1/AddressLine1",
"value": "SOMEWHERE ROAD"
}
]
}
]
}'
Вот сценарий PowerShell, который я построил с использованием рекомендаций, приведенных в моем предыдущем вопросе здесь:
cURL в PowerShell - двойная хеш-таблица в --data?
$CURLEXE = 'C:\Windows\System32\curl.exe'
$URL1 = "https://example.com/apis/v1.1/parameters"
$Body = @{
'data'= @{
'DUID'= 3299;
'AID'= 551;
'CID'= 10002;
'Parameters'=
@{'name'= "Customer.1/AddressLine1";
'value'= "SOMEWHERE ROAD"}
}
}
$CurlArgument = '-X', 'PATCH',
$URL1,
'-H',
$AuthBearer,
'-H', 'Content-Type: application/json',
'-H', 'cache-control: no-cache',
'-d',
(($Body | ConvertTo-Json) -replace '"', '\"')
& $CURLEXE @CurlArgument
Мой $ CurlArgument выглядит так:
-X
PATCH
https://example.com/apis/v1.1/parameters
-H
Authorization: Bearer 1234567890
-H
Content-Type: application/json
-H
cache-control: no-cache
-d
{
\"data\": {
\"CID\": 10002,
\"DUID\": 3299,
\"AID\": 551,
\"Parameters\": {
\"value\": \"SOMEWHERE ROAD\",
\"name\": \"Customer.1/AddressLine1\"
}
}
}
Что возвращает эту ошибку:
{"status":"FAILURE","errors":[{"code":"5004","name":"General Error","severity":"3","message":"Error Occured During the operation","details":{"5004":"General Error java.util.LinkedHashMap cannot be cast to java.util.List"}}]}
Может быть, это косая черта в поле «Customer.1 / AddressLine1»? Я попробовал вторую замену на них, но все равно получил ту же ошибку:
(($Body | ConvertTo-Json) -replace '"', '\"' -replace '/', '/')
(($Body | ConvertTo-Json) -replace '"', '\"' -replace '/', '\2f')
(($Body | ConvertTo-Json) -replace '"', '\"' -replace '/', '\%2f')
Может быть, это отсутствие квадратных скобок в хеш-таблице данных? Они есть в cURL, но не в PowerShell, однако в моем предыдущем скрипте у меня не было квадратных скобок, к тому же PowerShell, похоже, они не нравятся.
Может быть, PowerShell изменил порядок «значения» и «имени»?
Будем очень благодарны любой помощи.
Обновлять Благодаря столь далекой помощи от @ mklement0, я отредактировал свой PowerShell следующим образом, что решило эту проблему!
$Body = @{
data = , @{
DUID = 3299
AID = 551
CID = 10002
Parameters = , @{
name = "Customer.1/AddressLine1"
value = "SOMEWHERE ROAD"
}
}
}
$CurlArgument = '-X', 'PATCH',
'https://example.com/apis/v1.1/parameters',
'-H',
$AuthBearer,
'-H', 'Content-Type: application/json',
'-H', 'cache-control: no-cache',
'-d',
(($Body | ConvertTo-Json -Depth 4) -replace '"', '\"')
& $CURLEXE @CurlArgument

Ли Дэйли предоставил решающий указатель:
Ваш формат JSON требует множество подобъектов ([...]) как значение свойств data и data.Parameters, тогда как кажущиеся эквивалентными хэш-таблицы, которые вы создали в $Body, имеют только один скалярный подобъект.
Требуются две настройки вашего кода:
Убедитесь, что data и data.Parameters содержат массивы:
, <object> для создания одноэлементного массива, содержащего <object>; ConvertTo-Json автоматически преобразует массивы в нотацию JSON [ ... ].Используйте -Depth 4 с ConvertTo-Json, чтобы гарантировать, что все подобъекты в иерархии объектов представлены полностью.
$CURLEXE = 'C:\Windows\System32\curl.exe'
$URL1 = "https://example.com/apis/v1.1/parameters"
$Body = @{
data = , @{ # Note the "," to construct an *array*
DUID = 3299
AID = 551
CID = 10002
Parameters = , @{ # Note the "," to construct an *array*
name = "Customer.1/AddressLine1"
value = "SOMEWHERE ROAD"
}
}
}
# Note the -Depth 4 in the ConvertTo-Json call.
$CurlArgument = '-X', 'PATCH',
$URL1,
'-H',
$AuthBearer,
'-H', 'Content-Type: application/json',
'-H', 'cache-control: no-cache',
'-d',
(($Body | ConvertTo-Json -Depth 4) -replace '"', '\"')
& $CURLEXE @CurlArgument
Большое спасибо @ mklement0 - у меня была одна пропущенная запятая после моего URL, что означало, что мой $ AuthBearer не отправлялся, однако предложенные вами выше поправки устранили мою проблему! Ради интереса, где все это задокументировано, чтобы я мог читать / учиться?
Рад это слышать, @Simon. В PowerShell есть разделы справки не только по конкретным командлетам (например, Get-Help ConvertTo-Json), но и по множеству концептуальных тем: Get-Help about_Hash_Tables, Get-Help about_Splatting. Хотя есть Get-Help about_Quoting_Rules, он не покрывает дополнительных требований для вызова внешние программы; вы можете узнать о них здесь.
ваше тело в 1-м разделе имеет массив JSON в скобках. второй НЕ является массивом, насколько я понимаю JSON - это хеш-таблица. это то, что вы определили в версии PoSh с
@{}вместо@().