Betrachten Sie den folgenden Curl-Befehl. Ist es möglich, Newline in JSON (ohne Minify) zuzulassen und direkt in Bash (Mac / Ubuntu) auszuführen?
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 obigen Befehl ausführe, scheint ein Fehler beim second {
Beheben des obigen Befehls aufgetreten zu sein .
Aktualisiert : Eigentlich konnte ich den Befehl zuvor ohne Probleme ausführen, nicht sicher, warum das Problem kürzlich aufgetreten ist.
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
ist der richtige Medientyp für JSON-Daten - siehe RFC4627Antworten:
Ich erinnerte mich an eine andere Möglichkeit, dies mit einem "Hier-Dokument" zu tun, wie in der Bash-Manpage beschrieben und hier detailliert beschrieben . Das
@-
bedeutet, den Body aus STDIN zu lesen, während der Skriptinhalt<< EOF
bis "EOF" als STDIN zum Einrollen weitergeleitet wird. 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: application/json; charset=utf-8' \ --data-binary @- << EOF { "field1": "test", "field2": { "foo": "bar" } } EOF
HINWEIS: Verwenden Sie die
--trace <outfile>
Curl-Option, um genau aufzuzeichnen , was über den Draht geht. Aus irgendeinem Grund werden bei diesem Here Document-Ansatz Zeilenumbrüche entfernt. (Update: Zeilenumbrüche wurden mit der Option curl -d entfernt. Korrigiert!)quelle
-d @- << EOF | wc
curl -d
Option: curl.haxx.se/docs/manpage.html#-d . Verwenden Sie--data-binary
diese Option, um Zeilenumbruch- und Wagenrücklaufzeichen beizubehalten.In Anlehnung an Martins Vorschlag, den JSON in eine Variable einzufügen, können Sie den JSON auch in eine separate Datei einfügen und dann den Dateinamen für die
-d
Verwendung der @ -Syntax von curl angeben: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 mehr Dateien, in denen Sie früher eine hatten). Auf der positiven Seite könnte Ihr Skript jedoch einen Dateinamen oder ein Verzeichnisargument akzeptieren, und Sie müssten es nie bearbeiten, sondern nur auf verschiedenen JSON-Dateien ausführen. Ob dies nützlich ist, hängt davon ab, was Sie erreichen möchten.
quelle
Sie sollten äußere doppelte Anführungszeichen verwenden und alle inneren Anführungszeichen wie folgt maskieren:
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\" } }"
quelle
Sie können Ihren JSON einer Variablen zuweisen:
json=' { "field1": "test", "field2": { "foo": "bar" } }'
Jetzt können Sie dies an Curl weiterleiten, indem Sie
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 @-
quelle
${username}
im JSON keine Variablen (z. B. ) verwenden.@ eric-bolinger Der Grund, warum der Heredoc Zeilenumbrüche entfernt, ist, dass Sie Ihrem Heredoc mitteilen müssen, dass er Zeilenumbrüche beibehalten soll, indem Sie den EOF zitieren:
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
Beachten Sie die einzelnen Häkchen, die EOF beim ersten Definieren umgeben, aber nicht beim zweiten.
quelle