web-dev-qa-db-fra.com

Comment passer la charge via un fichier JSON pour curl?

Je peux créer un lieu avec succès via curl en exé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 renvoie 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"]
}

Donc, je modifie la commande pour qu'elle soit exécutée comme ceci:

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

Cela échoue en renvoyant HTTP/1.1 401 Unauthorized. Pourquoi?

174
JJD

curl envoie POST demandes avec le type de contenu par défaut application/x-www-form-urlencoded. Si vous souhaitez envoyer une demande JSON, vous devrez spécifier le bon en-tête de type de contenu:

$ 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. Le .json à la fin de l'URL peut uniquement indiquer que le sortie est json, cela ne signifie pas nécessairement qu'il gérera également json entrée. La documentation de l'API devrait vous indiquer si c'est le cas ou non.

La raison pour laquelle vous obtenez un 401 et non une autre erreur est probablement due au fait que le serveur ne peut pas extraire le auth_token de votre demande.

283
mata