透视HTTP协议
罗剑锋(Chrono)
奇虎360技术专家,Nginx/OpenResty开源项目贡献者
立即订阅
6077 人已学习
课程目录
已完结 44 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词|To Be a HTTP Hero
免费
破冰篇 (7讲)
01 | 时势与英雄:HTTP的前世今生
02 | HTTP是什么?HTTP又不是什么?
03 | HTTP世界全览(上):与HTTP相关的各种概念
04 | HTTP世界全览(下):与HTTP相关的各种协议
05 | 常说的“四层”和“七层”到底是什么?“五层”“六层”哪去了?
06 | 域名里有哪些门道?
07 | 自己动手,搭建HTTP实验环境
基础篇 (7讲)
08 | 键入网址再按下回车,后面究竟发生了什么?
09 | HTTP报文是什么样子的?
10 | 应该如何理解请求方法?
11 | 你能写出正确的网址吗?
12 | 响应状态码该怎么用?
13 | HTTP有哪些特点?
14 | HTTP有哪些优点?又有哪些缺点?
进阶篇 (8讲)
15 | 海纳百川:HTTP的实体数据
16 | 把大象装进冰箱:HTTP传输大文件的方法
17 | 排队也要讲效率:HTTP的连接管理
18 | 四通八达:HTTP的重定向和跳转
19 | 让我知道你是谁:HTTP的Cookie机制
20 | 生鲜速递:HTTP的缓存控制
21 | 良心中间商:HTTP的代理服务
22 | 冷链周转:HTTP的缓存代理
安全篇 (7讲)
23 | HTTPS是什么?SSL/TLS又是什么?
24 | 固若金汤的根本(上):对称加密与非对称加密
25 | 固若金汤的根本(下):数字签名与证书
26 | 信任始于握手:TLS1.2连接过程解析
27 | 更好更快的握手:TLS1.3特性解析
28 | 连接太慢该怎么办:HTTPS的优化
29 | 我应该迁移到HTTPS吗?
飞翔篇 (4讲)
30 | 时代之风(上):HTTP/2特性概览
31 | 时代之风(下):HTTP/2内核剖析
32 | 未来之路:HTTP/3展望
33 | 我应该迁移到HTTP/2吗?
探索篇 (5讲)
34 | Nginx:高性能的Web服务器
35 | OpenResty:更灵活的Web服务器
36 | WAF:保护我们的网络服务
37 | CDN:加速我们的网络服务
38 | WebSocket:沙盒里的TCP
总结篇 (2讲)
39 | HTTP性能优化面面观(上)
40 | HTTP性能优化面面观(下)
答疑篇 (2讲)
41 | Linux/Mac实验环境搭建与URI查询参数
42 | DHE/ECDHE算法的原理
结束语 (1讲)
结束语 | 做兴趣使然的Hero
透视HTTP协议
登录|注册

10 | 应该如何理解请求方法?

Chrono 2019-06-19
上一讲我介绍了 HTTP 的报文结构,它是由 header+body 构成,请求头里有请求方法和请求目标,响应头里有状态码和原因短语,今天要说的就是请求头里的请求方法。

标准请求方法

HTTP 协议里为什么要有“请求方法”这个东西呢?
这就要从 HTTP 协议设计时的定位说起了。还记得吗?蒂姆·伯纳斯 - 李最初设想的是要用 HTTP 协议构建一个超链接文档系统,使用 URI 来定位这些文档,也就是资源。那么,该怎么在协议里操作这些资源呢?
很显然,需要有某种“动作的指示”,告诉操作这些资源的方式。所以,就这么出现了“请求方法”。它的实际含义就是客户端发出了一个“动作指令”,要求服务器端对 URI 定位的资源执行这个动作。
目前 HTTP/1.1 规定了八种方法,单词都必须是大写的形式,我先简单地列把它们列出来,后面再详细讲解。
GET:获取资源,可以理解为读取或者下载数据;
HEAD:获取资源的元信息;
POST:向资源提交数据,相当于写入或上传数据;
PUT:类似 POST;
DELETE:删除资源;
CONNECT:建立特殊的连接隧道;
OPTIONS:列出可对资源实行的方法;
TRACE:追踪请求 - 响应的传输路径。
看看这些方法,是不是有点像对文件或数据库的“增删改查”操作,只不过这些动作操作的目标不是本地资源,而是远程服务器上的资源,所以只能由客户端“请求”或者“指示”服务器来完成。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《透视HTTP协议》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(37)

  • 一步
    OPTIONS 方法还是用的很多的,CORS跨域请求必须用到OPTIONS方法了

    作者回复: 我接触的领域里options用的比较少,可能有点孤陋寡闻了。

    2019-06-19
    2
    9
  • 壹笙☞漂泊
    答题:
    1、增:POST 删:DELETE 改:PUT 查:GET
    请求头如何设计,这个问题。。。不太明白。
    2、我认为可以,因为http协议具有很好的灵活性。具体的对资源操作是由服务器决定的。

    总结:
    Http/1.1规定了八种方法,单词必须都是大写的形式。
        1. GET:获取资源,可以理解为读取或者下载数据
        2. HEAD:获取资源的元信息;
        3. POST:向资源提交数据,相当于写入或上传数据;
        4. PUT:类似POST;
        5. DELETE:删除资源;
        6. CONNECT:建立特殊的连接隧道;
        7. OPTIONS:列出可对资源实行的方法;
        8. TRACE:追踪请求-响应的传输路径。

    GET/HEAD
        ——从服务器获取资源
        HEAD和GET类似,也是从服务器获取资源,但是不会返回请求的实体数据,只有响应头(元信息),是GET的简易版,如果不需要资源的话,可以避免传输body数据的浪费。

    POST/PUT
        ——向服务器提交数据,数据在body里
        PUT和POST作用类似,有微妙不同,通常POST标识新建,PUT标识修改

    DELETE
        ——删除资源,危险性大,很少用

    CONNECT
        ——要求服务器为客户端和另一台远程服务器建立一条特殊的链接,这时Web服务器充当代理的角色

    OPTIONS
        ——要求服务器列出可对资源实行的操作方法,在响应头Allow字段里返回。功能有限,用处不大。Nginx没支持

    TRACE
        ——用于对HTTP链路的测试或诊断,可以显示出请求 - 响应的传输路径。存在漏洞,会泄露网站的信息,所以通常也是禁止使用

    安全与幂等
        安全:在HTTP协议里,所谓的安全,是指请求方法不会对服务器上的资源造成实质的修改,so 只有GET和HEAD是安全的,因为是只读操作。
        幂等:多次执行相同的操作,结果也都是相同的。so GET和HEAD 即是安全的也是幂等的,DELETE可以多次删除同一个资源,效果都是“资源不存在”,所以也是幂等。POST是新增或提交数据,多次提交会创建多个资源,所以不是幂等的。PUT是替换或更新数据,多次更新一个资源,资源还是第一次更新的状态。所以是幂等的。
        幂等:GET、HEAD、DELETE、PUT
        非幂等:POST

    作者回复: 总结的非常好。
    问题里的“请求头如何设计”,意思是说相关的curd参数应该放在什么地方,比如用query参数或者是字段,只是一个提示,不是要必须如何如何做。

    2019-06-19
    1
    6
  • 趙衍
    关于Post和Get之间的区别,我一直很困惑,因为其实我们也可以在Get的请求体里写参数,用Get去修改资源;或者在Post的请求头上去写参数,用它去获取资源。所以他们两者之间到底有什么区别呢?希望老师可以指教一下!

    作者回复: 就是个使用的习惯和约定,就像是红绿灯,不是强制要求你必须遵守,但大家都按照这样做沟通起来顺畅。

    要理解协议的含义,要求你遵守,但不强制。

    2019-06-19
    3
  • 业余爱好者
    之前做一个网站的cms,觉得又是一套crud,毫无新意,闲得慌,于是玩了一波restful"架构"。严格按照http规范,比如,查询都用GET,新增用POST,更新用PUT,删除用DELETE,url的设计也按照rest风格设计。现在想想,tomcat支持这几种http方法也是万幸,不然的话,又得加班换成get/post了。

    这段经历我认识到,http只是一种协议,不同的服务器,还有客户端,比如浏览器都可以有自己的实现。虽然各自在实现上有所取舍,但大体上,按照协议规范来,不会差。

    协议,是个好东西。。

    作者回复: 请求方法的设计思想非常好,动词可以表示各种操作,所以非常适合RESTful。

    2019-06-19
    3
  • 彧豪
    老师,关于options请求,我有一些疑问,就是这个请求似乎是不受前端开发和服务端开发控制的是不是?get,post或者delete之前都有可能发出,那它的出现时机或机理是怎样的呢,为何会发出options请求?我发现我平时用webpack的代理来开发,代理到测试/生产环境的时候,get/post/delete请求之前没有options请求,但是部署到测试环境或者生产环境之后就会在get/post/delete请求之前会发出一个options请求,然后我司的其他前端和java工程师都说不上个所以然来,我也不懂,所以想要问下老师看看,希望老师能指点迷津

    作者回复: options请求会在allow字段里列出可以对资源实施的操作方法,比如有的资源只支持get,有的只支持post/delete。

    所以有的时候回先发一个options,来确定应该如何操作资源。

    不过这个方法用的很少,其实没太大用处,因为即使资源不支持某种方法,直接返回一个405或者其他的状态码就可以了。

    2019-07-23
    1
    2
  • 1900
    “幂等”有什么具体的落地场景么?它重要的原因在哪里呢?

    作者回复: 在RESTful设计的时候,要考虑动作对服务器内部状态的影响。

    这个比较理论,一般不太需要关心。

    2019-06-19
    2
    2
  • 大小兵
    真希望快点更新啊,看的不过瘾!

    作者回复: 慢慢来。

    2019-06-19
    2
  • 浩浩
    老师有个问题想问一下,我之前用比较旧的http工具类发请求,使用get方法时不能使用请求体,但使用软件工具能使用请求体,不同方法对请求的格式要求是不是一样,还有就是不同方法的区别是不是体现在服务器的响应上,用post请求访问一张照片会是什么样的,暂时还没试过

    作者回复: 任何请求报文都可以带请求体,与方法无关,老的工具可能对协议支持的不好。

    后面你理解的对,请求方法最终如何处理还是要依赖于服务器,如果愿意,服务器也可以用get来上传数据,用post获取数据,现在的get/post都是依据协议标准来执行,所以是get获取post上传。

    2019-06-19
    2
  • 温木
    学到新的知识点,幂等,很不错,老师辛苦了

    作者回复: 不客气。

    2019-08-06
    1
  • 一步
    老师 WebDav 这一块会详细讲嘛? 有这块的需求,或者有没有好的文档

    作者回复: 这块我基本没用过,它也不是http标准里面的,抱歉了。

    2019-06-19
    1
  • 10
    我采用POST /10-2 HTTP/1.1的指令写了10-2的内容为“POST DATA IS HERE”,然后我采用GET /10-2 HTTP/1.1的指令去读内容 返回的“200 OK”,但实体body的内容只是一个“0”,而非前面写的“POST DATA IS HERE”
    请问难道我前面的POST指令没有写成功么?

    作者回复: 测试用的URI“10-2”不支持存储数据,所以post的数据只能在当次请求生效。

    另外发现这两测试uri有小bug,已经修复,请及时git pull更新。

    2019-06-19
    1
  • 许童童
    请求头里面应该要包含 请求的目标
    也就是对应数据库里面行
    2019-06-19
    1
  • 彧豪
    老师,话说我昨天实际项目终于到一个问题:
    get请求带上查询字符串例如?name=a+b,但是打开chrome的控制台network选项卡发现请求url那是对的,是xxx?name=a+b,但是最后的查询字符串那那里是name: a b,+号变成了空格,java那边收到的也是a b……
    最后的解决方法是我这边encodeURIComponent一下,java那边URLDecoder.decode一下即可
    但是我不明白为何会如此,为何get请求的查询字符串中带+号,浏览器会将其变为空格
    在浏览器控制台network选项卡底端的query string parameters那有个"view URL encoded"按钮,点了之后name:a b变为name:a+b,这就意味着空格被转义成了+号,那是不是这个a和b之间的字符(串)实际不是空格呢?毕竟我暂时想不到什么方法能将空格转义为+号
    关于+号变空格的问题希望老师能指点迷津,感谢

    作者回复: 下一讲里面的url编码就会谈到。
    uri里面有些字符是不允许出现的,需要编码和解码,而+正好就被解码成了空格。

    你刚才也说了,会用到encodeURI这样的函数。

    2019-06-19
    1
  • 汤小高
    老师,请问:幂等性指多次执行相同的操作,获取的结果是相同的。但是,比如get获取某个服务器资源,某个时刻获取的资源和下一时刻获取的资源也可能不一样吧,比如下一时刻服务器对该资源进行了改变,再get时,客户端获取的不就不一样了吗?

    作者回复: 幂等是指客户端操作对服务器的状态没有产生改变,虽然报文内容变了,但服务器还是没有变化。

    可以再对比一下delete和post。

    2019-06-19
    1
  • -W.LI-
    老师好!我项目用得nginx好像支持options请求,put请求幂等这个是不是有待商榷啊

    作者回复: 我看Nginx源码,是不支持options的。

    put的幂等是RFC定义的,当然你要实现出非幂等的功能也是可以的。

    2019-06-19
    1
  • nora

    pwq309同学的解释,可以说是很清晰了。

    跨域资源共享标准新增了一组 HTTP 首部字段,允许服务器声明哪些源站通过浏览器有权限访问哪些资源。另外,规范要求,对那些可能对服务器数据产生副作用的 HTTP 请求方法(特别是 GET 以外的 HTTP 请求,或者搭配某些 MIME 类型的 POST 请求),浏览器必须首先使用 OPTIONS 方法发起一个预检请求(preflight request),从而获知服务端是否允许该跨域请求。服务器确认允许之后,才发起实际的 HTTP 请求。在预检请求的返回中,服务器端也可以通知客户端,是否需要携带身份凭证(包括 Cookies 和 HTTP 认证相关数据)。
    在现在前端最常用的 cors 跨域中,浏览器都是用 OPTIONS 方法发预检请求的

    作者回复: 赞!

    2019-11-26
  • 小海
    作业:
    你能把 GET/POST 等请求方法对应到数据库的“增删改查”操作吗?
    增:POST
    删:DELETE
    改:PUT
    查:GET

    作者回复: good。

    2019-11-24
  • 不知道该叫什么
    稍微友好一点,明确告诉你有这个文件,但不允许访问,返回一个 403 Forbidden;我想问一下,403是可以确定确实有这个文件吗?

    作者回复: 从标准的定义来讲,403是表示有文件但禁止访问。

    但服务器也可以不管有没有都返回403,因为服务器是个黑盒子,我们无法判断后面到底是什么情况。

    2019-10-30
  • 齐庆福
    我mac下试着发送请求, 结果 400错误, 是我哪里没有操作正确吗

     ~ clear
    ➜ ~ telnet 127.0.0.1 80
    Trying 127.0.0.1...
    Connected to localhost.
    Escape character is '^]'.
    GET /10-1 HTTP/1.1Host: www.chrono.com
    HTTP/1.1 400 Bad Request
    Server: openresty/1.15.8.2
    Date: Sat, 26 Oct 2019 04:33:51 GMT
    Content-Type: text/html
    Content-Length: 163
    Connection: close

    <html>
    <head><title>400 Bad Request</title></head>
    <body>
    <center><h1>400 Bad Request</h1></center>
    <hr><center>openresty/1.15.8.2</center>
    </body>
    </html>
    Connection closed by foreign host.

    作者回复: 可能是发送的http请求头有误,可参考一下第9讲,注意请求行后要有空行。

    2019-10-26
  • 齐庆福
    老师是用什么软件画的这些流程图呢

    作者回复: 我用的是Visio,不过也用的很一般,画的不是太好,见笑了。

    2019-10-26
收起评论
37
返回
顶部