Quelle est la syntaxe de ligne de commande cURL pour effectuer une demande POST?

2188

Comment faire une demande POST avec l' outil de ligne de commande cURL ?

mic84
la source
curl -d "param1=value1&param2=value2" -X POST http://localhost:3000/data
svikramjeet le

Réponses:

2543

Avec des champs:

curl --data "param1=value1&param2=value2" https://example.com/resource.cgi

Avec des champs spécifiés individuellement:

curl --data "param1=value1" --data "param2=value2" https://example.com/resource.cgi

Multipart:

curl --form "[email protected]" https://example.com/resource.cgi

Multipart avec des champs et un nom de fichier:

curl --form "[email protected];filename=desired-filename.txt" --form param1=value1 --form param2=value2 https://example.com/resource.cgi

Sans données:

curl --data '' https://example.com/resource.cgi

curl -X POST https://example.com/resource.cgi

curl --request POST https://example.com/resource.cgi

Pour plus d'informations, voir le manuel cURL . Le didacticiel cURL sur l’émulation d’un navigateur Web est utile.

Avec libcurl, utilisez la curl_formadd()fonction pour construire votre formulaire avant de le soumettre de la manière habituelle. Consultez la documentation de libcurl pour plus d'informations.

Pour les fichiers volumineux, pensez à ajouter des paramètres pour afficher la progression du téléchargement:

curl --tr-encoding -X POST -v -# -o output -T filename.dat \
  http://example.com/resource.cgi

Le -o outputest requis, sinon aucune barre de progression n'apparaîtra.

Stephen Deken
la source
7
@LauriRanta --data-urlencode(pas de tiret), dans les versions récentes au moins
waitinforatrain
4
Fonctionne
3
J'ai du mal à comprendre ... quand le ferais-je With Fields, quand Multipartet quand Without Data?
CodyBugstein
7
Au lieu de --datavous pouvez utiliser -d.
user35538
J'ai un tableau de champs. Comment puis-je faire ceci?
ARUNBALAN NV
507

Pour un POST HTTP RESTful contenant du XML:

curl -X POST -d @filename.txt http://example.com/path/to/resource --header "Content-Type:text/xml"

ou pour JSON, utilisez ceci:

curl -X POST -d @filename.txt http://example.com/path/to/resource --header "Content-Type:application/json"

Cela lira le contenu du fichier nommé filename.txtet l'enverra en tant que demande de publication.

soundmonster
la source
13
@ tom-wijsman explication: curl -X POSTimplique une demande HTTP POST, le -dparamètre (version longue :) --dataindique à curl que ce qui suit sera un paramètre POST et @filenamedésigne le contenu du fichier filenamecomme paramètre. Cette approche fonctionne mieux avec les API HTTP RESTful que l'on trouve sur Twitter, Facebook, divers autres services Web, notamment Ruby on Rails, ainsi que les API HTTP de bases de données telles que CouchDB. REST est synonyme de transfert d'état représentationnel
soundmonster
1
Comment pouvons-nous voir la réponse XML non pas sur une ligne mais formatée?
Vitaly Zdanevich
6
Je pense que vous pouvez laisser de côté -X POSTpuisque cela est impliqué par -d.
benjifisher
Comment donner plusieurs en-têtes?
keya
Entêtes multiples: curl -H "header2: 1" -H "header2: 2" ...
Tomáš Kratochvíla
131

Données de stdin avec -d @-

Exemple:

echo '{"text": "Hello **world**!"}' | curl -d @- https://api.github.com/markdown

Sortie:

<p>Hello <strong>world</strong>!</p>
Ciro Santilli 改造 心心
la source
6
Parfait si vous avez déjà un objet JSON dans le presse
Luca Steeb
encore mieux: echo "$ message" | curl -H "Type de contenu: application / json" -d @ - "$ url"
rzr
66
curl -d "name=Rafael%20Sagula&phone=3320780" http://www.where.com/guest.cgi 

est l'exemple trouvé dans le manuel d'exemple Curl .

Utilisez% 26 pour les esperluettes si cela ne fonctionne pas:

curl -d "name=Rafael%20Sagula%26phone=3320780" http://www.where.com/guest.cgi 
Patrick Desjardins
la source
61

Si vous souhaitez vous connecter à un site, procédez comme suit:

curl -d "username=admin&password=admin&submit=Login" --dump-header headers http://localhost/Login
curl -L -b headers http://localhost/

La première demande enregistre le cookie de session (fourni lors d'une connexion réussie) dans le fichier "en-têtes". À partir de maintenant, vous pouvez utiliser ce cookie pour vous authentifier auprès de toute partie du site Web à laquelle vous accédez habituellement après votre connexion à l'aide d'un navigateur.

Martin Konecny
la source
6
une note de la page de manuel de curl: 'L'option -c, --cookie-jar est toutefois un meilleur moyen de stocker des cookies.'
maxschlepzig
32
curl -v --data-ascii var=value http://example.com

et il y a beaucoup plus d'options, vérifiez curl --helppour plus d'informations.

Vinko Vrsalovic
la source
27

Si vous êtes paresseux, vous pouvez demander à Google Chrome de faire tout le travail à votre place.

  1. Cliquez avec le bouton droit sur le formulaire que vous souhaitez soumettre et sélectionnez Inspecter . Cela ouvrira le panneau DevTools.
  2. Sélectionnez l' onglet Réseau dans devtools et cochez la case Conserver le journal .
  3. Soumettez le formulaire et localisez l'entrée avec la méthode POST (cliquez avec le bouton droit de la souris sur l'en-tête d'une colonne et assurez-vous que la méthode est cochée).
  4. Cliquez avec le bouton droit sur la ligne avec POST, puis sélectionnez Copier > Copier en tant que cURL .

chrome devtools: copier comme cURL

Chrome copiera toutes les données de la demande dans la syntaxe cURL.

Chrome utilise --data 'param1=hello&param2=world'ce que vous pouvez rendre plus lisible en utilisant un seul paramètre -dou -Fpar paramètre, en fonction du type de demande POST que vous souhaitez envoyer, qui peut être indifféremment application/x-www-form-urlencodedou multipart/form-datacorrectement.

Ce sera POST-ed comme application/x-www-form-urlencoded( utilisé pour la majorité des formulaires qui ne contiennent pas de fichiers téléchargés ):

curl http://httpbin.org/post \
    -H "User-Agent: Mozilla/2.2" \
    -d param1=hello \
    -d name=dinsdale

Pour une multipart/form-datautilisation POST -F( généralement utilisée avec des formulaires contenant des téléchargements de fichiers ou pour lesquels l'ordre des champs est important, ou lorsque plusieurs champs du même nom sont obligatoires ):

curl http://httpbin.org/post \
    -H "User-Agent: Mozilla/2.2" \
    -F param1=hello \
    -F name=dinsdale \
    -F name=piranha

L'en- User-Agenttête n'est normalement pas nécessaire, mais je l'ai jeté au cas où. Vous pouvez éviter de définir l'agent utilisateur à chaque requête en créant le ~/.curlrcfichier contenant par exempleUser-Agent: "Mozilla/2.2"

ccpizza
la source