从https://curl.haxx.se/docs/httpscripting.html#More_on_changed_methods
应当指出的是curl 根据要请求的操作自行选择使用哪些方法。 -d 将执行 POST,-I 将执行 HEAD 等。如果使用--request / -X选项,您可以更改curl选择的方法关键字,但不会修改curl的行为。 这意味着,例如,如果您使用 -d“data” 执行 POST,则可以使用 -X 将该方法修改为 PROPFIND,并且curl 仍会认为它发送 POST。您只需在命令行中添加 -X POST 即可将普通 GET 更改为 POST 方法,如下所示:
curl -X POST http://example.org/
...但是curl仍然会像发送GET一样思考和行动,因此它不会发送任何请求正文等。
- “curl 根据要请求的操作选择自己使用的方法”中的“操作”是什么意思?
“如果您使用 --request / -X 选项”是什么意思
“您可以更改关键字curl选择的方法”,
“但你不会修改curl的行为”?
重要的不是服务器如何处理请求吗?这不是只取决于请求消息中写入的内容,因此取决于“curl 选择的方法关键字”吗?
什么是“curl 的行为”?这有什么关系呢?这是否会修改请求消息(特别是请求消息中的 HTTP 方法)?
这是curl的设计错误吗?允许指定 HTTP 方法不一致的目的是什么?
如果我们可以通过action隐式指定HTTP方法,为什么还需要通过-X显式指定HTTP方法呢?
例如,引用中的命令将检索 HTML 文档,这正是 GET 的作用吗?
$ curl --trace-ascii dump -X POST http://example.org/
<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>411 - Length Required</title>
</head>
<body>
<h1>411 - Length Required</h1>
</body>
</html>
该命令发送的请求如下。 HTTP方法是POST,被服务器看到:
== Info: Trying 93.184.216.34...
== Info: TCP_NODELAY set
== Info: Connected to example.org (93.184.216.34) port 80 (#0)
=> Send header, 76 bytes (0x4c)
0000: POST / HTTP/1.1
0011: Host: example.org
0024: User-Agent: curl/7.58.0
003d: Accept: */*
004a:
<= Recv header, 30 bytes (0x1e)
0000: HTTP/1.1 411 Length Required
<= Recv header, 25 bytes (0x19)
0000: Content-Type: text/html
<= Recv header, 21 bytes (0x15)
0000: Content-Length: 357
<= Recv header, 19 bytes (0x13)
0000: Connection: close
<= Recv header, 37 bytes (0x25)
0000: Date: Mon, 10 Feb 2020 12:23:42 GMT
<= Recv header, 25 bytes (0x19)
0000: Server: ECSF (nyb/1D33)
<= Recv header, 2 bytes (0x2)
0000:
<= Recv data, 357 bytes (0x165)
0000: <?xml version="1.0" encoding="iso-8859-1"?>.<!DOCTYPE html PUBLI
0040: C "-//W3C//DTD XHTML 1.0 Transitional//EN". "http://www.
0080: w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">.<html xmlns="http
00c0: ://www.w3.org/1999/xhtml" xml:lang="en" lang="en">..<head>...<ti
0100: tle>411 - Length Required</title>..</head>..<body>...<h1>411 - L
0140: ength Required</h1>..</body>.</html>.
== Info: Closing connection 0
谢谢。
答案1
“curl 根据要请求的操作选择自己使用的方法”中的“操作”是什么意思?
看HTTP 协议部分,它“定义”了该术语:
HTTP 是客户端发送到服务器以请求特定操作的纯 ASCII 文本行,然后服务器在将实际请求的内容发送到客户端之前回复几行文本。
该操作是 HTTP 服务器所请求的任何内容:检索数据(对应于方法GET
)、添加资源(PUT
方法)、将数据发送到现有资源(POST
方法)等。
重要的不是服务器如何处理请求吗?这不是只取决于请求消息中写入的内容,因此取决于“curl 选择的方法关键字”吗?
是的,但是发送的整体消息必须符合所选方法设置的期望。您的示例说明了这一点:curl
为该GET
方法构造了一条有效消息,但您重写该消息以指定一个POST
方法,并且构造的消息对于 无效POST
,这会导致服务器响应错误。
该-X
选项会覆盖该方法,而不更改任何周围的行为。
答案2
“curl 根据要请求的操作选择自己使用的方法”中的“操作”是什么意思?
我认为它指的是修改curl 功能的各种选项。看起来它们在手册页中并没有被明确称为“操作”,但如果他们说“使用方法 FOO 请求 X”,那么它似乎适用。-I
/--head
仅要求标头,因此它使用HEAD
、--data
usingPOST
和--data --get
using GET
。请注意,引用的文本明确引用了-I
和-d
,位于粗体部分之后。
最后一对很重要,GET
数据与 URL 一起发送,即...?data_here
,POST
它作为 HTTP 请求的内容发送
随着curl --data foo=bar http://host/path/to/foo.pl
我们得到
POST /path/to/foo.pl HTTP/1.1
Content-Length: 7
Content-Type: application/x-www-form-urlencoded
foo=bar
与curl --data foo=bar --get http://host/path/to/foo.pl
GET /path/to/foo.pl?foo=bar HTTP/1.1
“如果使用--request / -X选项”是什么意思,您可以更改curl选择的方法关键字,但不会修改curl的行为。
使用-X GET
不会改变数据的去向(或其编码方式)。使用 时--data foo=bar -X GET
,curl
仍然认为它正在执行 a POST
,因此它将数据发布到请求正文中,只需重命名该方法(如下)。这可能在这里不起作用,但-X XYZ
如果XYZ
是一种期望请求正文中的数据(如 )的方法,则可以使用POST
。
GET /path/to/foo.pl HTTP/1.1
Content-Length: 7
Content-Type: application/x-www-form-urlencoded
foo=bar