Rozważ poniższe polecenie curl, czy możliwe jest zezwolenie na nową linię w JSON (bez minify) i wykonanie bezpośrednio w 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"
}
}'
Po uruchomieniu powyższego polecenia wydaje się, że wystąpił błąd w second {
Jak naprawić powyższe polecenie?
Zaktualizowano : faktycznie udało mi się uruchomić polecenie bez problemu wcześniej, nie jestem pewien, dlaczego problem pojawił się ostatnio.
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
jest prawidłowym typem nośnika dla danych JSON - zobacz RFC4627Odpowiedzi:
Przypomniałem sobie inny sposób zrobienia tego z "Here Document", jak opisano na stronie podręcznika Bash i wyszczególniono tutaj . Te
@-
środki do zapoznania się z korpusu ze standardowego wejścia, a<< EOF
środkiem do rury treść skryptu aż „EOF” jako standardowego wejścia zwijają. Ten układ może być łatwiejszy do odczytania niż używanie oddzielnych plików lub podejście „echo a variable”.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
UWAGA: Użyj
--trace <outfile>
opcji zwijania, aby dokładnie zarejestrować , co przechodzi przez drut. Z jakiegoś powodu, podejście Here Document usuwa znaki nowej linii. (Aktualizacja: znaki nowej linii zostały usunięte przez opcję curl -d. Poprawione!)źródło
-d @- << EOF | wc
curl -d
opcja: curl.haxx.se/docs/manpage.html#-d . Służy--data-binary
do zachowania znaków nowej linii i powrotu karetki.Zgodnie z sugestią Martina dotyczącą umieszczenia JSON w zmiennej, możesz również umieścić JSON w oddzielnym pliku, a następnie podać nazwę pliku,
-d
używając składni @ 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
Wada jest oczywista (2 lub więcej plików tam, gdzie byłeś). Ale z drugiej strony, twój skrypt może zaakceptować nazwę pliku lub argument katalogu i nigdy nie będziesz musiał go edytować, po prostu uruchom go na różnych plikach JSON. To, czy jest to przydatne, zależy od tego, co próbujesz osiągnąć.
źródło
@ eric-bolinger powodem, dla którego Heredoc usuwa nowe linie, jest to, że musisz powiedzieć swojemu Heredocowi, aby zachował nowe linie, cytując 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
Zwróć uwagę na pojedyncze tiki otaczające EOF przy pierwszym zdefiniowaniu, ale nie za drugim.
źródło
Powinieneś użyć zewnętrznych podwójnych cudzysłowów i uciec przed wszystkimi wewnętrznymi cudzysłowami w ten sposób:
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\" } }"
źródło
Możesz przypisać swój json do zmiennej:
json=' { "field1": "test", "field2": { "foo": "bar" } }'
Teraz możesz przekazać to do zwijania za pomocą
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 @-
źródło
${username}
) W JSON.