CURL в PowerShell - хеш-таблица

Итак, после публикации моего предыдущего вопроса 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

ваше тело в 1-м разделе имеет массив JSON в скобках. второй НЕ является массивом, насколько я понимаю JSON - это хеш-таблица. это то, что вы определили в версии PoSh с @{} вместо @().

Lee_Dailey 25.11.2018 04:35
Как сделать HTTP-запрос в Javascript?
Как сделать HTTP-запрос в Javascript?
В JavaScript вы можете сделать HTTP-запрос, используя объект XMLHttpRequest или более новый API fetch. Вот пример для обоих методов:
2
1
239
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ли Дэйли предоставил решающий указатель:

Ваш формат 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 26.11.2018 01:18

Рад это слышать, @Simon. В PowerShell есть разделы справки не только по конкретным командлетам (например, Get-Help ConvertTo-Json), но и по множеству концептуальных тем: Get-Help about_Hash_Tables, Get-Help about_Splatting. Хотя есть Get-Help about_Quoting_Rules, он не покрывает дополнительных требований для вызова внешние программы; вы можете узнать о них здесь.

mklement0 26.11.2018 03:11

Другие вопросы по теме