Curl -GET und -X GET

126

Curl bietet eine Reihe verschiedener http-Methodenaufrufe an, denen ein X vorangestellt ist, bietet jedoch auch dieselben Methoden ohne an. Ich habe beides versucht und kann den Unterschied nicht herausfinden. Kann mir jemand schnell erklären, wie sich diese beiden Operationen unterscheiden?

Matsko
quelle

Antworten:

263

Standardmäßig verwenden Sie curl, ohne explizit anzugeben, welche Anforderungsmethode verwendet werden soll. Wenn Sie nur eine HTTP-URL wie curl http://example.comdiese übergeben, wird GET verwendet. Wenn Sie verwenden -doder -Flocken, wird POST verwendet, -Iverursacht einen KOPF und -Tmacht es zu einem PUT.

Wenn Sie aus irgendeinem Grund mit diesen Standardoptionen, die Curl für Sie ausführt, nicht zufrieden sind, können Sie diese Anforderungsmethoden durch Angabe überschreiben -X [WHATEVER]. Auf diese Weise können Sie beispielsweise ein DELETE senden, indem Sie dies tun curl -X DELETE [URL].

Es ist daher sinnlos zu tun, curl -X GET [URL]da GET sowieso verwendet werden würde. In der gleichen Weise ist es sinnlos, dies zu tun. curl -X POST -d data [URL]...Sie können jedoch eine lustige und etwas seltene Anfrage stellen, die einen Anfragetext in einer GET-Anfrage mit so etwas wie sendet curl -X GET -d data [URL].

Tiefer Graben

curl -GET(mit einem einzigen Strich) ist für diesen Zweck einfach falsch. Das entspricht die Angabe von -G, -Eund -TOptionen , und das wird etwas ganz anderes tun.

Es gibt auch eine Curl-Option, --getmit der die Dinge nicht verwechselt werden können. Dies ist die Langform von -G, mit der die angegebenen Daten -din eine GET-Anforderung anstelle eines POST konvertiert werden .

(Ich habe anschließend hier meine eigene Antwort verwendet, um die häufig gestellten Fragen zu Curl zu füllen .)

Warnungen

Moderne Versionen von curl informieren Benutzer über diese unnötige und möglicherweise schädliche Verwendung von -X, wenn der ausführliche Modus aktiviert ist ( -v) -, um Benutzer darauf aufmerksam zu machen. Weiter erklärt und motiviert in diesem Blogbeitrag .

-G konvertiert einen POST + -Körper in eine GET + -Abfrage

Sie können curl bitten, eine Reihe von -dOptionen zu konvertieren , und anstatt sie mit POST im Anforderungshauptteil zu senden, setzen Sie sie an das Ende der Abfragezeichenfolge der URL und geben Sie ein GET mit der Verwendung von `-G aus. So was:

curl -d name=daniel -d grumpy=yes -G https://example.com/
Daniel Stenberg
quelle
5
-XGET ist möglicherweise no-op, macht es jedoch explizit.
Mtyson
"Standardmäßig verwenden Sie curl, ohne explizit anzugeben, welche Anforderungsmethode verwendet werden soll. Wenn Sie nur eine HTTP-URL wie curl example.com übergeben , wird GET verwendet. Wenn Sie -d oder -F verwenden, verwendet curl POST, -I verursacht ein HEAD und -T machen es zu einem PUT. " Alles, was Sie wissen müssen.
Donato
4
Explizit ist besser als implizit, wenn Sie die Option haben. Früh ausfallen, schnell ausfallen, Unfälle reduzieren, Debug-Zeit reduzieren. Das einzige Mal, wenn Sie eine Entschuldigung für das Überspringen haben, ist das Eingeben in die Befehlszeile. Jedes Skript sollte -XGET angeben, auch wenn dies unbedingt erforderlich ist.
Backgammon
1
@Backgammon wenn sie es tun, machen sie es falsch. Aber sicher können sie.
Daniel Stenberg
2

-X [Ihre Methode] Mit
X können Sie die Standardeinstellung 'Get' überschreiben.

** Kleinbuchstaben xin Großbuchstaben korrigiertX

hoogw
quelle
2
Dies versucht nicht einmal, die Frage zu beantworten, wie sich diese beiden Operationen unterscheiden.
Melebius
1

Durch die Verwendung von wird -X [WHATEVER]lediglich die in der HTTP-Anforderung verwendete Methodenzeichenfolge der Anforderung geändert . Dies ist mit zwei Beispielen - eines mit -X [WHATEVER]und eines ohne - und den zugehörigen HTTP-Anforderungsheadern für jedes Beispiel leichter zu verstehen :

# 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
quelle