Рассмотрим команду 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 {
Как исправить указанную выше команду?
Обновлено : на самом деле я смог запустить команду без проблем ранее, не знаю, почему проблема возникла недавно.
mymac > bash --version GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin15) Copyright (C) 2007 Free Software Foundation, Inc.
GNU bash, version 4.3.42(1)-release
echo $'here is a newline:\nand here is a tab:\t'
application/json
правильный тип носителя для данных JSON - см. RFC4627Ответы:
Я вспомнил другой способ сделать это с помощью «Здесь документа», как описано на странице руководства Bash и подробно описано здесь . В
@-
средстве для чтения тела из STDIN, в то время как<< EOF
средства на трубу содержания сценария до «EOF» , как STDIN свернуться. Этот макет может быть проще для чтения, чем использование отдельных файлов или подхода «эхо переменной».curl -0 -v -X POST http://www.example.com/api/users \ -H "Expect:" \ -H 'Content-Type: application/json; charset=utf-8' \ --data-binary @- << EOF { "field1": "test", "field2": { "foo": "bar" } } EOF
ПРИМЕЧАНИЕ. Используйте параметр
--trace <outfile>
curl, чтобы точно записать , что проходит по проволоке. По какой-то причине этот подход Here Document удаляет новые строки. (Обновление: новые строки были удалены с помощью опции curl -d. Исправлено!)источник
-d @- << EOF | wc
curl -d
: curl.haxx.se/docs/manpage.html#-d . Используется--data-binary
для сохранения символов новой строки и возврата каретки.Наряду с предложением Мартина поместить 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 или более файла вместо одного). Но с другой стороны, ваш сценарий может принимать аргумент имени файла или каталога, и вам никогда не придется его редактировать, просто запустите его в разных файлах JSON. Насколько это полезно, зависит от того, чего вы пытаетесь достичь.
источник
@ 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 в первый раз, когда он определяется, но не во второй.
источник
Вы должны использовать внешние двойные кавычки и избегать всех внутренних кавычек следующим образом:
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\" } }"
источник
Вы можете присвоить свой json переменной var:
json=' { "field1": "test", "field2": { "foo": "bar" } }'
Теперь вы можете переслать это в curl, используя
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 @-
источник
${username}
) в JSON.