使用-X,您可以更改curl 选择的方法关键字,但不会修改curl 的行为,这是什么意思?

使用-X,您可以更改curl 选择的方法关键字,但不会修改curl 的行为,这是什么意思?

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一样思考和行动,因此它不会发送任何请求正文等。

  1. “curl 根据要请求的操作选择自己使用的方法”中的“操作”是什么意思?
  2. “如果您使用 --request / -X 选项”是什么意思

    • “您可以更改关键字curl选择的方法”,

    • “但你不会修改curl的行为”?

    重要的不是服务器如何处理请求吗?这不是只取决于请求消息中写入的内容,因此取决于“curl 选择的方法关键字”吗?

    什么是“curl 的行为”?这有什么关系呢?这是否会修改请求消息(特别是请求消息中的 HTTP 方法)?

  3. 这是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--datausingPOST--data --getusing GET。请注意,引用的文本明确引用了-I-d,位于粗体部分之后。

最后一对很重要,GET数据与 URL 一起发送,即...?data_herePOST它作为 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 GETcurl仍然认为它正在执行 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  

相关内容