Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

请求方法 #29

Open
18888628835 opened this issue May 22, 2021 · 0 comments
Open

请求方法 #29

18888628835 opened this issue May 22, 2021 · 0 comments

Comments

@18888628835
Copy link
Owner

请求方法

在 Request Header 中,有请求方法和请求的目标,目前 HTTP1.1一共有8种请求方法:

1.GET:获取资源,可以理解为读取或者下载数据

2.HEAD:获取资源的元信息

3.POST:提交数据,相当于写入数据

4.PUT:修改数据等

5.DELETE:删除 资源

6.CONNECT:建立特殊的连接隧道

7.OPTIONS:列出对资源实行的方法

8.TRACE:追踪请求-相应的传输路径

这些方法基本都是大写。

GET/HEAD

GET 是 HTTP 中最古老的请求方法,也是用得最多的方法。

它的语义是从服务器中获取资源,这个资源可以是静态的文本、页面、视频等等,一般来说,GET 请求如果有参数,那么它的参数需要增加查询字符串在 URI 中。

HEAD 跟 GET 请求方法类似,也是从服务器获取资源,但是服务器不会返回请求的实体数据,而是传回响应头,也就是资源的元信息。

HEAD 方法可以看成是 GET 方法的简化版或者说是轻量版。它可以用于不需要用到资源的场合,避免传输数据的浪费。

比如说,检查一个文件是否存在,就只要发 HEAD 请求就可以了。

POST/PUT

这两个方法非常相似,都是指定向服务器发送数据,数据一般放到 body 里面。

例如,我们向服务器发送加入购物车请求,那么你喜欢的商品就会作为 body 中的数据发送给服务器。

PUT 也是一样,向服务器提交数据,但是从语义上来看,PUT 更像是 update,而 POST 更像是 create。

非常用方法

DELETE:方法指示服务器删除资源,因为这个动作危险性太大,所以通常服务器不会执行真正的删除操作,而是对资源做一个删除标记。

CONNECT是一个比较特殊的方法,要求服务器为客户端和另一台远程服务器建立一条特殊的连接隧道,这时 Web 服务器在中间充当了代理的角色。

OPTIONS方法要求服务器列出可对资源实行的操作方法,在响应头的 Allow 字段里返回。它的功能很有限,用处也不大,有的服务器(例如 Nginx)干脆就没有实现对它的支
持。

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

安全与幂等

在实际面试中,有两个重要的概念,安全和幂等。

所以安全,就是不会对服务器资源造成修改的风险,这里只有 GET 请求和 HEAD 请求是安全的,因为它们都是只读操作。

所谓幂等是一种数学概念,意思就是不管操作多少次,结果都是相同的。也就是幂次数结果相等。

很显然,GET 和 HEAD 是幂等的,而 POST 是不幂等的,原因是它的语义就代表着创建,既然创建了,当然会新增结果。PUT 比较特殊,虽然它也会修改数据,但是它的语义是修改而非新增或减少,不管做多少次,它都只更新一个资源,所以它也是幂等的。

我们可以认为这里的结果指的是数据的数量。多次 post 会增加数据量,而多次修改不会增加数据量,这就是幂等跟非幂等的通俗含义。

小结

请求是客户端发出的,要求服务器执行的、对资源的一种操作。

请求只是指示,具体要怎么做,需要跟服务端协商。

常用的请求方法是 GET 和 POST。分别是获取数据和发送数据。

HEAD 是轻量级 GET,每次只获取元信息,也就是响应头。

PUT 基本上与POST 相同,多用于更新数据,PUT 是幂等的,POST 是非幂等的。

安全和幂等是描述请求方法的两个重要属性。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant