curl -GET et -X GET

126

Curl propose une série d'appels de méthodes http différents qui sont précédés d'un X, mais propose également les mêmes méthodes sans. J'ai essayé les deux et je n'arrive pas à comprendre la différence. Quelqu'un peut-il m'expliquer rapidement en quoi ces deux opérations diffèrent?

matsko
la source

Réponses:

263

Par défaut, vous utilisez curl sans indiquer explicitement la méthode de requête à utiliser. Si vous passez simplement une URL HTTP comme curl http://example.comelle utilisera GET. Si vous utilisez -dou -Fcurl utilisera POST, -Iprovoquera un HEAD et -Ten fera un PUT.

Si, pour une raison quelconque, vous n'êtes pas satisfait de ces choix par défaut que curl fait pour vous, vous pouvez remplacer ces méthodes de requête en spécifiant -X [WHATEVER]. De cette façon, vous pouvez par exemple envoyer un DELETE en faisant curl -X DELETE [URL].

Il est donc inutile de faire curl -X GET [URL]comme GET serait de toute façon utilisé. Dans la même veine, il est inutile de le faire curl -X POST -d data [URL]...Mais vous pouvez faire une requête amusante et quelque peu rare qui envoie un corps de requête dans une requête GET avec quelque chose comme curl -X GET -d data [URL].

Creuser plus profond

curl -GET(en utilisant un seul tiret) est tout simplement faux à cette fin. C'est l'équivalent de spécifier les options -G, -Eet -Tet cela fera quelque chose de complètement différent.

Il existe également une option curl appelée --getpour ne pas confondre les choses avec l'un ou l'autre. C'est la forme longue de -G, qui est utilisée pour convertir les données spécifiées avec -den une requête GET au lieu d'un POST.

(J'ai ensuite utilisé ma propre réponse ici pour remplir la FAQ curl pour couvrir cela .)

Avertissements

Les versions modernes de curl informeront les utilisateurs de cette utilisation inutile et potentiellement nuisible de -X lorsque le mode verbeux est activé ( -v) - pour informer les utilisateurs. Plus expliqué et motivé dans ce billet de blog .

-G convertit un corps POST + en requête GET +

Vous pouvez demander à curl de convertir un ensemble d' -doptions et au lieu de les envoyer dans le corps de la requête avec POST, placez-les à la fin de la chaîne de requête de l'URL et émettez un GET, avec l'utilisation de `-G. Comme ça:

curl -d name=daniel -d grumpy=yes -G https://example.com/
Daniel Stenberg
la source
5
-XGET peut être no-op, mais cela le rend explicite.
mtyson le
"Par défaut, vous utilisez curl sans indiquer explicitement la méthode de requête à utiliser. Si vous passez simplement une URL HTTP comme curl example.com, il utilisera GET. Si vous utilisez -d ou -F curl utilisera POST, -I provoquera un HEAD et -T en feront un PUT. " Tout ce que tu as besoin de savoir.
Donato
4
L'explicite vaut mieux que l'implicite chaque fois que vous en avez l'option. Échouer tôt, échouer rapidement, réduire les accidents, réduire le temps de débogage. La seule fois où vous avez une excuse pour l'ignorer, c'est lors de la saisie dans la ligne de commande. Tout script doit spécifier -XGET même lorsqu'il est strictement inutile.
Backgammon
1
@Backgammon s'ils le font, ils le font mal. Mais bien sûr, ils peuvent.
Daniel Stenberg
2

-X [votre méthode]
X vous permet de remplacer la valeur par défaut «Get»

** minuscules corrigées xen majusculesX

hoogw
la source
2
Cela n'essaie même pas de répondre à la question «en quoi ces deux opérations diffèrent».
Melebius
1

L'utilisation de -X [WHATEVER]modifie simplement la chaîne de méthode de la requête utilisée dans la requête HTTP. Ceci est plus facile à comprendre avec deux exemples - un avec -X [WHATEVER]et un sans - et les en-têtes de requête HTTP associés pour chacun:

# curl -XPANTS -o nul -v http://neverssl.com/
* Connected to neverssl.com (13.224.86.126) port 80 (#0)
> PANTS / HTTP/1.1
> Host: neverssl.com
> User-Agent: curl/7.42.0
> Accept: */*

# curl -o nul -v http://neverssl.com/
* Connected to neverssl.com (13.33.50.167) port 80 (#0)
> GET / HTTP/1.1
> Host: neverssl.com
> User-Agent: curl/7.42.0
> Accept: */*
Jimadine
la source