Comment passer la charge utile via le fichier JSON pour curl?

201

Je peux créer un lieu avec succès en curlexécutant la commande suivante:

$ 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 \
"

Le serveur revient HTTP/1.1 201 Created.
Maintenant, je veux stocker la charge utile dans un fichier JSON qui ressemble à ceci:

// 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"]
}

Je modifie donc la commande à exécuter comme ceci:

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

Cela ne revient pas HTTP/1.1 401 Unauthorized. Pourquoi?

JJD
la source
1
Gardez également à l'esprit que si vous téléchargez des fichiers binaires, vous devez utiliser --data-binary.
AhmetB - Google

Réponses:

329

curlenvoie des requêtes POST avec le type de contenu par défaut de application/x-www-form-urlencoded. Si vous souhaitez envoyer une demande JSON, vous devrez spécifier l'en-tête de type de contenu correct:

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

Mais cela ne fonctionnera que si le serveur accepte l'entrée json. La .jsonfin de l'URL peut seulement indiquer que la sortie est json, cela ne signifie pas nécessairement qu'elle gérera également l' entrée json . La documentation de l'API devrait vous donner une indication sur le fait qu'elle le fasse ou non.

La raison pour laquelle vous obtenez une 401erreur et non une autre est probablement parce que le serveur ne peut pas extraire le auth_tokende votre demande.

mata
la source
8
J'essayais d'utiliser cat file.jsonaprès le -det avais du mal avec, jusqu'à ce que j'apprenne de cette réponse que je peux utiliser @file.json. Merci :)
shadi
1
notez que si vous avez besoin de plusieurs en-têtes, vous devez spécifier -H/ --headerplusieurs fois, au moins lors des tests en bash sur Ubuntu.
Chaim Eliyah