So setzen Sie ein JSON-Objekt mit einem Array mithilfe von Curl

94

Ich muss eine Reihe von Daten in die Datenbank eingeben. Die Benutzeroberfläche zur Eingabe der Daten ist nicht für die Masseneingabe geeignet, daher versuche ich, ein Befehlszeilenäquivalent zu formulieren. Wenn ich die Netzwerkanforderung der Benutzeroberfläche in Chrome untersuche, wird eine PUT-Anforderung eines JSON-Objekts angezeigt. Wenn ich versuche, die Anfrage zu replizieren

curl -H 'Accept: application/json' -X PUT '{"tags":["tag1","tag2"],"question":"Which band?","answers":[{"id":"a0","answer":"Answer1"},{"id":"a1","answer":"answer2"}]}' http://example.com/service`

Ich bekomme eine Fehlermeldung

Curl: (3) [Globbing] verschachtelte Klammern werden an Position X nicht unterstützt

Wobei X die Zeichenposition des ersten "[" ist.

Wie kann ich ein JSON-Objekt mit einem Array platzieren?

Miles Libbey
quelle

Antworten:

147

In Ihrer Befehlszeile sollten -d / - Daten vor der Zeichenfolge eingefügt sein, die Sie im PUT senden möchten, und Sie möchten den Inhaltstyp festlegen und nicht Akzeptieren.

curl -H 'Content-Type: application/json' -X PUT -d '[JSON]' http://example.com/service

Unter Verwendung der genauen JSON-Daten aus der Frage würde die vollständige Befehlszeile wie folgt lauten:

curl -H 'Content-Type: application/json' -X PUT \
-d '{"tags":["tag1","tag2"],"question":"Which band?","answers":[{"id":"a0","answer":"Answer1"},{"id":"a1","answer":"answer2"}]}' \
http://example.com/service
Daniel Stenberg
quelle
4
-1, da Content-Type (anstelle von Accept) der Header ist, der in diesem Fall festgelegt werden soll.
Goran
3
Für diejenigen, die sich fragen, ist [JSON] einfach ein Platzhalter für die JSON-Zeichenfolge. Fügen Sie Ihrer JSON-Zeichenfolge keine zusätzlichen eckigen Klammern hinzu.
Mihai Todor
89

Obwohl der ursprüngliche Beitrag andere Probleme hatte (dh das fehlende "-d"), ist die Fehlermeldung allgemeiner.

Curl: (3) [Globbing] verschachtelte Klammern werden an Position X nicht unterstützt

Dies liegt daran, dass geschweifte Klammern {} und eckige Klammern [] spezielle Globbing-Zeichen in Curl sind. Verwenden Sie die Option " -g ", um dieses Globbing auszuschalten .

Beispielsweise schlägt die folgende Solr-Facettenabfrage fehl, ohne dass "-g" das Curl-Globbing deaktiviert : curl -g 'http://localhost:8983/solr/query?json.facet={x:{terms:"myfield"}}'

Yonik
quelle
3
Dies war die richtige Lösung für mich, mit -gwie erwartet gearbeitet. Danke @Yonik
Arjones
2
Meine Güte, ich habe nach einer Lösung für mein GraphQL-Curl-Problem gesucht und dies hat mir geholfen. Großartige Soße.
NetOperator Wibby
39

Es sollte erwähnt werden, dass der AcceptHeader dem Server etwas darüber sagt, was wir zurücknehmen, während der relevante Header in diesem Zusammenhang istContent-Type

Es ist oft ratsam anzugeben, Content-Typewie application/jsonbeim Senden von JSON. Für Curl lautet die Syntax:

-H 'Content-Type: application/json'

Der vollständige Curl-Befehl lautet also:

curl -H 'Content-Type: application/json' -H 'Accept: application/json' -X PUT -d '{"tags":["tag1","tag2"],"question":"Which band?","answers":[{"id":"a0","answer":"Answer1"},{"id":"a1","answer":"answer2"}]}' http://example.com/service`
Mogul
quelle
2

Versuchen Sie, ein einfaches Anführungszeichen anstelle von doppelten Anführungszeichen zusammen mit -g zu verwenden

Das folgende Szenario hat bei mir funktioniert

curl -g -d '{"collection":[{"NumberOfParcels":1,"Weight":1,"Length":1,"Width":1,"Height":1}]}" -H "Accept: application/json" -H "Content-Type: application/json" --user [email protected]:123456 -X POST  https://yoururl.com

MIT

curl -g -d "{'collection':[{'NumberOfParcels':1,'Weight':1,'Length':1,'Width':1,'Height':1}]}" -H "Accept: application/json" -H "Content-Type: application/json" --user test@testmail.com:123456 -X POST  https://yoururl.com

Dies hat insbesondere meinen Fehler beim Curl-Befehl behoben : Ein falscher URL-Doppelpunkt ist das erste Zeichen

vibs2006
quelle