Comment faire une requête PUT avec curl?

412

Comment tester une méthode RESTful PUT (ou DELETE) en utilisant curl?

John
la source

Réponses:

566

Utilisation du -Xdrapeau avec le verbe HTTP que vous souhaitez:

curl -X PUT -d arg=val -d arg2=val2 localhost:8080

Cet exemple utilise également l' -dindicateur pour fournir des arguments avec votre demande PUT.

theabraham
la source
17
"man curl" sur -X: "Normalement, vous n'avez pas besoin de cette option. Toutes sortes de requêtes GET, HEAD, POST et PUT sont plutôt invoquées en utilisant des options de ligne de commande dédiées." Mais je ne pouvais pas trouver d'autre moyen.
Martin C. Martin
44
Un an plus tard, j'ai trouvé un moyen! curl -T
Martin C. Martin
2
Comme la réponse de Martin C. Martin change également en GET après une redirection depuis le serveur, c'est la réponse la plus utile à mon avis.
Martin
2
Pour obtenir l' GETafter une redirection, ajoutez le paramètre--location
Martin M
1
Curl 7.47 et cela ne fonctionnerait pas pour moi. la réponse de theabraham par défaut est toujours de publier le comportement. --get (ou -G) forcera cependant les champs -d (--data) à devenir des paramètres d'url et fonctionne.
James Powell
101

Réponse rapide:

En une seule ligne, la commande curl serait:

a) Si vous envoyez des données de formulaire:

curl -X PUT -H "Content-Type: multipart/form-data;" -F "key1=val1" "YOUR_URI"

b) Si vous envoyez des données brutes au format json:

curl -X PUT -H "Content-Type: application/json" -d '{"key1":"value"}' "YOUR_URI"

c) Si vous envoyez un fichier avec une requête POST:

curl -X POST "YOUR_URI" -F 'file=@/file-path.csv'

Solution alternative:

Vous pouvez utiliser l' application POSTMAN du Chrome Store pour obtenir la demande cURL équivalente. Ceci est particulièrement utile lors de l'écriture de demandes plus compliquées.

Pour la demande avec d'autres formats ou pour différents clients comme Java, PHP, vous pouvez consulter POSTMAN / commentaire ci-dessous.

POSTMAN pour obtenir le code de demande

Prateek
la source
4
Aucune idée pourquoi cela a été rétrogradé ... J'ai copié ici l'idée comment passer le corps JSON pour curl PUT. Postman est également un outil assez génial pour obtenir du code curl pour des requêtes plus compliquées :)
Mikael Lepistö
2
Merci !! Même moi, je n'ai aucune idée pourquoi sur les downvotes. Peut-être la réticence des utilisateurs à l'adopter. J'ai créé un respo de tous mes apis REST pour mobile dans POSTMAN et c'est la meilleure astuce de productivité que je puisse suggérer à toute personne travaillant avec REST.
Prateek
Exemple du monde réel où je passe des données et des paramètres json au point final; curl -X PUT -H "Content-Type: application / json" -d '{"amount": "999", "type": "car", "parent_id": "12345"}' localhost: 8080 / transactionservice / transaction / 2222
vikramvi
1
Devoir installer un navigateur complet (si l'on n'a pas Chrome) et une extension pour cela pourrait être une exagération pour certaines personnes à mon humble avis. Au moins, vous auriez pu fournir une alternative à un autre navigateur Web plus courant (installation par défaut) comme Firefox, où le HttpRequester fait un travail similaire.
rbaleksandar
5
Il pourrait être rejeté parce que la question concerne la boucle.
tuxayo
28

Un exemple PUT suivant le commentaire de Martin C. Martin:

curl -T filename.txt http://www.example.com/dir/

Avec -T(identique à --upload-file) curl utilisera PUT pour HTTP.

Tor Klingberg
la source
8
Malheureusement, le -Tn'est pas un substitut -X PUTsi vous souhaitez spécifier des paramètres avec -dou -F. -Tenvoie le contenu d'un fichier via PUT. Pour obtenir l' GETafter une redirection, ajoutez le paramètre--location
Martin M
que faire si filename.txt est dans le serveur distant?
bosari
7
curl -X PUT -d 'new_value' URL_PATH/key

où,

X - option à utiliser pour la commande de requête

d - option à utiliser pour mettre des données sur une URL distante

URL_PATH - URL distante

new_value - valeur que nous voulons mettre à la clé du serveur

kalyani chaudhari
la source
5

Je suis en retard sur ce sujet, mais j'avais moi aussi une exigence similaire. Puisque mon script construisait la demande de curl dynamiquement, je voulais une structure similaire de la commande à travers GET, POST et PUT.

Voici ce qui fonctionne pour moi

Pour une demande PUT :

curl --request PUT --url http://localhost:8080/put --header 'content-type: application/x-www-form-urlencoded' --data 'bar=baz&foo=foo1'

Pour une demande POST :

curl --request POST --url http://localhost:8080/post --header 'content-type: application/x-www-form-urlencoded' --data 'bar=baz&foo=foo1'

Pour une demande GET :

curl --request GET --url 'http://localhost:8080/get?foo=bar&foz=baz'
sunitkatkar
la source