Wie kann ich Nutzdaten über eine JSON-Datei für Curl übergeben?

199

Ich kann erfolgreich einen Ort erstellen, curlindem ich den folgenden Befehl ausführe:

$ curl -vX POST https://server/api/v1/places.json -d "
  auth_token=B8dsbz4HExMskqUa6Qhn& \
  place[name]=Fuelstation Central& \
  place[city]=Grossbeeren& \
  place[address]=Buschweg 1& \
  place[latitude]=52.3601& \
  place[longitude]=13.3332& \
  place[washing]=true& \
  place[founded_at_year]=2000& \
  place[products][]=diesel& \
  place[products][]=benzin \
"

Der Server kehrt zurück HTTP/1.1 201 Created.
Jetzt möchte ich die Nutzdaten in einer JSON-Datei speichern, die folgendermaßen aussieht:

// testplace.json
{
  "auth_token" : "B8dsbz4HExMskqUa6Qhn",
  "name" : "Fuelstation Central",
  "city" : "Grossbeeren",
  "address" : "Buschweg 1",
  "latitude" : 52.3601,
  "longitude" : 13.3332,
  "washing" : true,
  "founded_at_year" : 2000,
  "products" : ["diesel","benzin"]
}

Also ändere ich den auszuführenden Befehl wie folgt:

$ curl -vX POST http://server/api/v1/places.json -d @testplace.json

Dies kann nicht zurückgegeben werden HTTP/1.1 401 Unauthorized. Warum?

JJD
quelle
1
Denken Sie auch daran, dass Sie beim Hochladen von Binärdateien verwenden sollten --data-binary.
AhmetB - Google

Antworten:

328

curlsendet POST-Anfragen mit dem Standardinhaltstyp application/x-www-form-urlencoded. Wenn Sie eine JSON-Anfrage senden möchten, müssen Sie den richtigen Inhaltstyp-Header angeben:

$ curl -vX POST http://server/api/v1/places.json -d @testplace.json \
--header "Content-Type: application/json"

Dies funktioniert jedoch nur, wenn der Server JSON-Eingaben akzeptiert. Das .jsonam Ende der URL kann nur anzeigen, dass die Ausgabe json ist. Dies bedeutet nicht unbedingt, dass auch die json- Eingabe verarbeitet wird . Die API-Dokumentation sollte Ihnen einen Hinweis geben, ob dies der Fall ist oder nicht.

Der Grund, warum Sie einen 401und keinen anderen Fehler erhalten, liegt wahrscheinlich darin, dass der Server den Fehler nicht auth_tokenaus Ihrer Anfrage extrahieren kann .

mata
quelle
8
Ich habe versucht, cat file.jsonnach dem zu verwenden -dund hatte Probleme damit, bis ich aus dieser Antwort gelernt habe, dass ich verwenden kann @file.json. Danke :)
Shadi
1
Beachten Sie, dass Sie, wenn Sie mehrere Header benötigen, -H/ --headermehrfach angeben müssen , zumindest wenn Sie in Bash unter Ubuntu getestet wurden.
Chaim Eliyah