🗒️request line

request 报文的 start line

简要地描述了客户端想要如何操作服务器端的资源,比如 GET / HTTP/1.1

组成部分
说明

method

请求方法

是一个动词,表示对资源的操作,如 GET/POST

URI

资源 path

标记了请求方法要操作的资源位置

version

版本号

表示报文使用的 HTTP 协议版本

以上三个部分通常使用 space 来分隔,最后要用 CRLF 换行表示结束。

# server 你好
#   我想获取网站根目录下的默认文件
#   我用的协议版本号是 1.1,请不要用 1.0 或 2.0 回复我
GET / HTTP/1.1

request method

请求方法,就是客户端发出的一个动作指令,要求服务器端对 URI 定位的资源执行该动作。

HTTP/1.1 规定了八种方法,字母都必须大写。

最常用的
用途
说明

GET

从服务器获取资源

资源可以是静态的文本、页面、图片、视频,也可以是由 PHP、Java 动态生成的页面或者其它格式的数据

HEAD

获取资源的元信息

GET 方法类似,只是服务器不会返回请求的 entity body 数据,只会传回响应头

可以看做是 GET 的轻量版。比如当要检查某个文件是否存在、是否有最新版本时,就可以发个 HEAD 请求,从而避免传输 body 数据的浪费

POST

向指定资源提交数据

相当于写入数据或上传数据

不常用

PUT

POST 类似 但也存在微妙的区别

POST 表示 create 的含义 而 PUT 表示 update 的含义

OPTIONS

列出可以对资源实行的操作方法

通常会在响应头的 Allow 字段里返回

CONNECT

要求服务器为客户端和另一台远程服务器建立一条特殊的连接隧道,此时 web 服务器在中间充当了代理的角色

DELETE

指示服务器删除资源

由于该动作危险性太大,所以通常服务器不会执行真正的删除操作,而是对资源做一个删除标记。当然,更多时候服务器就直接不处理 DELETE 请求

TRACE

追踪请求

通常会显示响应的传输路径。多用于对 HTTP 链路的测试或诊断,其本意是好的,但存在漏洞,会泄漏网站的信息,所以 web 服务器通常也是禁止使用该方法的

此外,我们还可以任意添加请求动作,只要请求方和响应方都能理解就行。比如著名的愚人节玩笑 RFC2324 定义了协议 HTCPCP,还有已经得到了实际应用的请求方法(WebDAV)如 MKCOL, COPY, MOVE, LOCK, UNLOCK, PATCH 等。

安全与幂等

在 HTTP 协议里,“安全”是指请求方法不会破坏服务器上的资源,即不会对服务器上的资源造成实质的修改。“幂等”是指多次执行相同的操作,结果都相同,即多次“幂”后结果“相等”,它实际上是一个数学用语,被借用到了 HTTP 协议里。

请求方法
安全
幂等

GET HEAD

✔️

✔️

POST

PUT DELETE

✔️

关于幂等的说明:

  • POST 可以理解成 SQL 里的 insert,多次 insert 会添加多条记录

  • PUT 可以理解成 SQL 里的 update,多次 update “只操作一条记录”

  • DELETE 可以多次删除同一个资源,效果都是“资源不存在”

Last updated