curl -GET и -X GET

126

Curl предлагает серию различных вызовов HTTP-методов с префиксом X, но также предлагает те же методы без. Я пробовал оба, и, кажется, не могу понять разницу. Может ли кто-нибудь быстро объяснить мне, чем отличаются эти две операции?

Мацко
источник

Ответы:

263

По умолчанию вы используете curl, не указывая явно, какой метод запроса использовать. Если вы просто передадите URL-адрес HTTP, curl http://example.comон будет использовать GET. Если вы используете -dили -Fcurl будет использовать POST, -Iвызовет HEAD и -Tсделает его PUT.

Если по какой-либо причине вас не устраивают варианты по умолчанию, которые делает curl за вас, вы можете переопределить эти методы запроса, указав -X [WHATEVER]. Таким образом, вы можете, например, отправить DELETE, выполнив curl -X DELETE [URL].

Таким образом, бессмысленно делать, curl -X GET [URL]поскольку GET все равно будет использоваться. В том же духе это делать бессмысленно. curl -X POST -d data [URL]...Но вы можете сделать забавный и несколько редкий запрос, который отправляет тело запроса в запросе GET с чем-то вроде curl -X GET -d data [URL].

Копать глубже

curl -GET(использование одного тире) просто неправильно для этой цели. Это эквивалентно указав -G, -Eи -Tварианты , и что будет делать что - то совершенно другое.

Также есть опция завивки, призванная --getне путать ни с чем. Это длинная форма -G, которая используется для преобразования данных, указанных с, -dв запрос GET вместо POST.

(Впоследствии я использовал свой собственный ответ здесь, чтобы заполнить FAQ по curl, чтобы охватить это .)

Предупреждения

Современные версии curl будут информировать пользователей об этом ненужном и потенциально опасном использовании -X, когда включен подробный режим ( -v) -, чтобы пользователи знали. Дальнейшее объяснение и мотивация в этом сообщении блога .

-G преобразует тело POST + в запрос GET +

Вы можете попросить curl преобразовать набор -dпараметров и вместо того, чтобы отправлять их в теле запроса с помощью POST, поместить их в конец строки запроса URL-адреса и выполнить GET с использованием `-G. Как это:

curl -d name=daniel -d grumpy=yes -G https://example.com/
Даниэль Стенберг
источник
5
-XGET может не работать, но он делает это явным.
mtyson
"По умолчанию вы используете curl, не указывая явно, какой метод запроса использовать. Если вы просто передадите URL-адрес HTTP, например curl example.com, он будет использовать GET. Если вы используете -d или -F curl будет использовать POST, -I вызовет HEAD и -T превратят его в PUT. " Все, что Вам нужно знать.
Donato
4
Явный лучше, чем неявный, когда у вас есть возможность. Сбой рано, быстрый сбой, снижает количество аварий, сокращает время отладки. Единственный раз, когда у вас есть повод пропустить его, - это ввести его в командную строку. В любом скрипте следует указывать -XGET, даже если это совершенно не нужно.
Нарды
1
@Backgammon, если они это сделают, они делают это неправильно. Но конечно могут.
Даниэль Стенберг
2

-X [ваш метод]
X позволяет вам переопределить значение по умолчанию Get

** нижний xрегистр исправлен на верхнийX

hoogw
источник
2
Это даже не пытается ответить на вопрос «чем отличаются эти две операции».
Melebius
1

Использование -X [WHATEVER]просто изменяет строку метода запроса, используемую в HTTP-запросе. Это легче понять с помощью двух примеров - одного с -X [WHATEVER]и другого без - и соответствующих заголовков HTTP-запроса для каждого из них:

# 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
источник