cURL в PowerShell - Двойная хеш-таблица в --data? - PullRequest
0 голосов
/ 22 ноября 2018

Я пытался (и терпел неудачу в течение нескольких часов) преобразовать этот сценарий cURL в PowerShell:

curl -X POST \
  https://example.net \
  -H 'Authorization: Bearer 1234567890' \
  -H 'Content-Type: application/json' \
  -H 'cache-control: no-cache' \
  -d '{
    "data": {
        "MID": 33,
        "DID": "66666666",
        "CID": 10002,
        "status": "ACTIVE",
        "HID": "11"
    }
}'

Мой сценарий PowerShell выглядит следующим образом - я подозреваю, что это как-то связано с таблицей двойного хеширования.я создал в $ Body, но я действительно в растерянности.:

.. скрипт для простоты

$Body =   @{
    'data'= @{
      'MID'= 33;
      'DID'= "66666666";
      'CID'=10002;
      'status'="ACTIVE";
      'HID'= "11"
    }
}
$CurlArgument = '-X', 'POST',
                'https://example.net',
                '-H', 'Authorization: Bearer 1234567890',
                '-H', 'Content-Type: application/json',
                '-d', 
                $Body
$CURLEXE = 'C:\Windows\System32\curl.exe'
& $CURLEXE @CurlArgument

При выполнении я получаю следующее сообщение об ошибке:

..."message":"Access not allowed","details":{"5011":"A JSONObject text must begin with '{' at 1 [character 2 line 1]"}}]}

Я экспериментировал с добавлением после $ Body:

| ConvertTo-Json

, но тогда я получаю такую ​​ошибку:

Unexpected character ('d' (code 100)): was expecting double-quote to start field name

Моя переменная $ CurlArgument выглядит следующим образом (которая выглядит кактак же, как первый сценарий cURL):

-X
POST
https://example.net
-H
Authorization: Bearer 1234567890
-H
Content-Type: application/json
-d
{
    "data":  {
                 "CID":  10002,
                 "MID":  33,
                 "HID":  "11",
                 "DID":  "66666666",
                 "status":  "ACTIVE"
             }
}

Как всегда, помощь будет принята с благодарностью.

1 Ответ

0 голосов
/ 22 ноября 2018
  • Ваша переменная $Body содержит хеш-таблицу (@{ ... }) , поэтому вы должны явно преобразовать ее в JSON с помощью ConvertTo-Json.

  • Кроме того, поскольку вы вызываете внешнюю программу , вы должны экранировать символы ".в строке JSON как \" [1] :

$CurlArgument = '-X', 'POST',
                'https://example.net',
                '-H', 'Authorization: Bearer 1234567890',
                '-H', 'Content-Type: application/json',
                '-d', 
                (($Body | ConvertTo-Json) -replace '"', '\"')

[1] Это дополнительное требование экранирования крайне неудачно,но на сегодняшний день он хранится ради обратной совместимости. Этот выпуск документации по GitHub рассказывает всю историю.

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