247 votes

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

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

Je modifie donc la commande pour qu'elle soit exécutée comme ceci :

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

Cela ne donne pas de résultat HTTP/1.1 401 Unauthorized . Pourquoi ?

415voto

mata Points 22446

curl envoie des requêtes POST avec le type de contenu par défaut de application/x-www-form-urlencoded . Si vous souhaitez envoyer une requête 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 les entrées json. Le site .json à la fin de l'url ne peut qu'indiquer que les sortie est json, cela ne signifie pas nécessairement qu'il traitera aussi json entrée . La documentation de l'API devrait vous permettre de savoir si c'est le cas ou non.

La raison pour laquelle vous obtenez un 401 et non une autre erreur, c'est probablement parce que le serveur ne peut pas extraire la auth_token de votre demande.

7voto

Chris Halcrow Points 907

Pour clarifier la façon de spécifier un fichier qui contient le JSON à poster, notez que c'est avec la balise @ comme indiqué dans l'OP

Par exemple, un message typique vers une API .NET Core locale :

curl -X POST https://localhost:5001/api -H "Content-Type: application/json" -d @/some/directory/some.json

2voto

Vous pouvez cat le contenu d'un json pour curl via le --data-raw paramètre

curl 'https://api.com/route' -H 'Content-Type: application/json' --data-raw "$(cat ~/.json/payload-2022-03-03.json | grep -v '^\s*//')"

Remarque : les commentaires dans le fichier json sont filtrés par l'intermédiaire de la fonction grep -v '^\s*//'

Vous pouvez également passer les données à curl via stdin en utilisant grep o cat

grep -v '^\s*//' ~/.json/payload-2022-03-03.json | curl 'https://api.com/route' -H 'Content-Type: application/json' -d @-

cat ~/.json/payload-2022-03-03.json | grep -v '^\s*//' | curl 'https://api.com/route' -H 'Content-Type: application/json' -d @-

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X