Керл с многострочным 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 {
Как исправить указанную выше команду?
Обновлено: на самом деле я смог запустить команду без проблем ранее, не знаю, почему проблема произошла в последнее время.
Ответы
Ответ 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 при первом определении, но не на втором.