2016-01-18 12 views
37

den curl Befehl unten betrachten, ist es möglich, Newline in JSON zu ermöglichen (ohne minify) und führen direkt in bash (Mac/Ubuntu)Locken mit mehrzeiligen von JSON

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" 
    } 
}' 

Wenn ich den Befehl über laufen , scheint Fehler aufgetreten bei second { Wie der obige Befehl zu beheben?

Aktualisiert: eigentlich konnte ich den Befehl ohne Problem zuvor ausführen, nicht sicher, warum Problem in letzter Zeit passieren.

+0

Können Sie uns mehr über den Fehler erzählen? Ihr Beispiel funktioniert "wie es ist" auf meinem System. 'mymac> bash - Version GNU bash, Version 3.2.57 (1) -release (x86_64-apple-darwin15) Copyright (C) 2007 Freie Software-Grundlage, Inc.' –

+0

Yup, funktioniert für mich auch : 'GNU bash, Version 4.3.42 (1) -release' – miken32

+1

Überprüfen Sie auch [ANSI C-ähnliche String-Syntax] (http: //wiki.bash-hackers.org/syntax/quoting): 'echo $ 'hier ist ein Zeilenumbruch: \ nund hier ist ein Tab: \ t'' – miken32

Antwort

10

Sie sollten äußere doppelte Anführungszeichen verwenden, und die Flucht alle inneren Anführungszeichen wie folgt aus:

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\" 
    } 
}" 
9

Sie Ihre json zu einem var zuweisen könnte:

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

Jetzt können Sie diese vorwärts zu rollen stdin mit:

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

Wenn Sie den Block in Anführungszeichen setzen, können Sie * keine Variablen verwenden (zB' $ {username} ') im JSON. – Air

+0

Yup, aber doppelte Anführungszeichen bedeutet, dass Sie $ Zeichen in Ihren Daten nicht verwenden können. Wählen Sie, welches für Sie das Richtige ist. –

15

Nach dem Vorbild von Martins Vorschlag des JSON in einer var setzen iable, könnten Sie auch die JSON setzen in einer separaten Datei, und dann den Dateinamen -d liefern mit Curls @ Syntax:

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

Der Nachteil liegt auf der Hand (. 2 oder mehrere Dateien, in denen Sie verwendet eine haben), aber Auf der positiven Seite könnte Ihr Skript einen Dateinamen oder ein Verzeichnis-Argument akzeptieren, und Sie würden es nie bearbeiten müssen, führen Sie es einfach auf verschiedenen JSON-Dateien aus. Ob das nützlich ist, hängt davon ab, was Sie erreichen möchten.

+0

Hinweis: Stellen Sie sicher, dass Sie über https://jsonlint.com/ gültige JSON-Inhalte haben. – vikramvi

+0

Dieser Ansatz ist im Vergleich zu anderen sauber und einfach zu debuggen. – vikramvi

40

Ich erinnerte mich an eine andere Möglichkeit, dies mit einem "Here Document" zu tun, wie in der Bash man page und detailed here beschrieben. Die @- bedeutet, den Körper von STDIN zu lesen, während << EOF bedeutet, den Skriptinhalt bis "EOF" als STDIN zu curlen. Dieses Layout ist möglicherweise einfacher zu lesen als die Verwendung separater Dateien oder der Ansatz "echo a variable".

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 

HINWEIS: Verwenden Sie die --trace <outfile> curl Option aufzeichnen genau was über die Leitung geht. Aus irgendeinem Grund entfernt dieser Here Document-Ansatz Zeilenumbrüche?!?

+2

Das ist sauber, keine zusätzlichen Zitate, kein Entkommen und es funktioniert sehr gut. Vielen Dank. – Seth

+0

Können wir Rohre mit einer solchen Syntax verwenden? –

2

Aus irgendeinem Grund, dies hier Streifen Dokument Ansatz newlines

@ eric-bolinger der Grund der Heredoc Streifen newlines ist, weil Sie Ihre Heredoc sagen, müssen neue Zeilen zu erhalten, indem Sie die EOF zitieren:

Beachten Sie die einzelnen Ticks um EOF das erste Mal definiert ist, aber nicht die zweite.