Подтвердить что ты не робот

Керл с многострочным JSON

Рассмотрим приведенную ниже команду curl, можно ли разрешить новую строку в JSON (без minify) и выполнить непосредственно в bash (Mac/Ubuntu)

curl -0 -v -X POST http://www.example.com/api/users \
-H "Expect:" \
-H 'Content-Type: text/json; charset=utf-8' \
-d \
'
{
    "field1": "test",
    "field2": {
        "foo": "bar"
    }
}'

Когда я запускаю приведенную выше команду, кажется, что ошибка произошла в second { Как исправить указанную выше команду?

Обновлено: на самом деле я смог запустить команду без проблем ранее, не знаю, почему проблема произошла в последнее время.

4b9b3361

Ответ 1

Я вспомнил еще один способ сделать это с помощью "Здесь документа", как описано в man Bash и подробнее здесь. @- означает считывание тела из STDIN, а << EOF означает, что канал script до тех пор, пока "EOF" не будет зависеть от STDIN. Этот макет может быть легче читать, чем использовать отдельные файлы или подход "эхо-переменная".

curl -0 -v -X POST http://www.example.com/api/users \
-H "Expect:" \
-H 'Content-Type: text/json; charset=utf-8' \
-d @- << EOF

{
    "field1": "test",
    "field2": {
        "foo": "bar"
    }
}
EOF

ПРИМЕЧАНИЕ. Используйте параметр --trace <outfile> curl, чтобы точно записывать, что происходит по проводу. По какой-то причине этот подход Document Document разделяет строки новой строки?!?

Ответ 2

В соответствии с предложением Мартина о включении JSON в переменную, вы также можете поместить JSON в отдельный файл, а затем указать имя файла -d с помощью синтаксиса curl @:

curl -0 -v -X POST http://www.example.com/api/users \
  -H "Expect:" \
  -H 'Content-Type: text/json; charset=utf-8' \
  -d @myfile.json

Недостаток очевидный (2 или более файлов, в которых вы его использовали). Но с положительной стороны ваш script мог бы принять аргумент файла или каталога, и вам никогда не понадобится его редактировать, просто запустите его на разных JSON файлах. Насколько это полезно, зависит от того, что вы пытаетесь выполнить.

Ответ 3

Вы должны использовать внешние двойные кавычки и избежать всех внутренних котировок, подобных этому:

curl -0 -v -X POST http://www.example.com/api/users \
-H "Expect:" \
-H 'Content-Type: text/json; charset=utf-8' \
-d \
"
{
    \"field1\": \"test\",
    \"field2\": {
        \"foo\": \"bar\"
    }
}"

Ответ 4

Вы можете назначить json для var:

json='
{
    "field1": "test",
    "field2": {
        "foo": "bar"
    }
}'

Теперь вы можете переслать это с помощью stdin:

echo $json | curl -0 -v -X POST http://www.example.com/api/users \
-H "Expect:" \
-H 'Content-Type: text/json; charset=utf-8' \
-d @-

Ответ 5

По какой-то причине подход This Document Document разделяет строки новой строки

@eric-bolinger - причина, по которой Heredoc разделяет символы новой строки, потому что вам нужно сообщить вашему Heredoc о сохранении строк новой строки, указав EOF:

curl -0 -v -X POST http://www.example.com/api/users \
-H "Expect:" \
-H 'Content-Type: text/json; charset=utf-8' \
-d @- <<'EOF'

{
    "field1": "test",
    "field2": {
        "foo": "bar"
    }
}
EOF

Обратите внимание на одноцелевые окружающие EOF при первом определении, но не на втором.