透视 HTTP 协议
罗剑锋(Chrono)
前奇虎 360 技术专家,Nginx/OpenResty 开源项目贡献者
63943 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 48 讲
开篇词 (1讲)
透视 HTTP 协议
15
15
1.0x
00:00/00:00
登录|注册

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

TRACE/OPTIONS/CONNECT方法的间接实现
请求方法与数据库操作的对应
请求方法的属性
常用请求方法
请求方法的指示性质
请求方法的作用
幂等性定义
安全性定义
实际应用的请求方法
HTTP协议的扩展性
TRACE
OPTIONS
CONNECT
DELETE
区别与应用场景
向资源提交数据
获取资源的元信息
获取资源
TRACE
OPTIONS
CONNECT
DELETE
PUT
POST
HEAD
GET
操作资源的方式
超链接文档系统
课下作业
小结
安全与幂等
扩展方法
其他方法
POST/PUT
GET/HEAD
标准请求方法
HTTP协议设计定位
HTTP请求方法

该思维导图由 AI 生成,仅供参考

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

标准请求方法

HTTP 协议里为什么要有“请求方法”这个东西呢?
这就要从 HTTP 协议设计时的定位说起了。还记得吗?蒂姆·伯纳斯 - 李最初设想的是要用 HTTP 协议构建一个超链接文档系统,使用 URI 来定位这些文档,也就是资源。那么,该怎么在协议里操作这些资源呢?
很显然,需要有某种“动作的指示”,告诉操作这些资源的方式。所以,就这么出现了“请求方法”。它的实际含义就是客户端发出了一个“动作指令”,要求服务器端对 URI 定位的资源执行这个动作。
目前 HTTP/1.1 规定了八种方法,单词都必须是大写的形式我先简单地列把它们列出来,后面再详细讲解。
GET:获取资源,可以理解为读取或者下载数据;
HEAD:获取资源的元信息;
POST:向资源提交数据,相当于写入或上传数据;
PUT:类似 POST;
DELETE:删除资源;
CONNECT:建立特殊的连接隧道;
OPTIONS:列出可对资源实行的方法;
TRACE:追踪请求 - 响应的传输路径。
看看这些方法,是不是有点像对文件或数据库的“增删改查”操作,只不过这些动作操作的目标不是本地资源,而是远程服务器上的资源,所以只能由客户端“请求”或者“指示”服务器来完成。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

HTTP协议中的请求方法是客户端对服务器端资源执行特定动作的指示,共定义了八种标准请求方法。常用的GET和HEAD方法用于获取资源及其元信息,而POST和PUT方法用于向服务器提交数据,区别在于POST表示“新建”或“create”,而PUT表示“修改”或“update”。除了这四种常用方法外,还有DELETE、CONNECT、OPTIONS和TRACE等方法,它们的应用相对较少。HTTP协议具有良好的扩展性,允许根据实际需求自定义新的请求方法。在HTTP协议中,安全与幂等是描述请求方法的两个重要属性,具有理论指导意义,可以帮助我们设计系统。GET和HEAD是“安全”且“幂等”的,而POST和PUT的幂等性质略有不同。请求方法的选择由客户端发起,但服务器拥有绝对的决策权,可以执行、拒绝或改变动作的含义。HTTP协议的请求方法相关知识对于设计系统和理解网络通信具有重要意义。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《透视 HTTP 协议》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(67)

  • 最新
  • 精选
  • GitHubGanKai
    老师,这是我第三次刷这个专栏了,面试的时候,有个问题,想请教您一下,还希望你能解答一下:请求行 + 头部信息 + 空白行 + body ,有被问到说空白行的意义,我一直以为就是纯粹来标识 headers 的结束,但是面试官说不止这个功能,我后面看了HTTP 权威指南 也没有找到,Stack Overflow 也没找到。。。希望老师可以跟我说一下。

    作者回复: 按照http协议,空白行就是为了分隔header和body,因为http是纯文本的协议。 不知道面试官还能有什么新的解释,也许是故弄玄虚。 遇到这样的人可以及时请教,不能让他话只说一半。

    2020-01-07
    7
    90
  • OPTIONS 方法还是用的很多的,CORS跨域请求必须用到OPTIONS方法了

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

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

    作者回复: 赞!

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

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

    2019-06-19
    4
    24
  • 壹笙☞漂泊
    答题: 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
    3
    11
  • 潇潇雨歇
    1、 GET:查 POST:增 PUT:改 DELETE:删 请求行按 请求方法 请求资源 http版本号 GET参数直接放在URI里,其他的放body 2、应该可以

    作者回复: 对。

    2020-06-12
    6
  • 彧豪
    老师,关于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
    3
    6
  • 大小兵
    真希望快点更新啊,看的不过瘾!

    作者回复: 慢慢来。

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

    作者回复: 任何请求报文都可以带请求体,与方法无关,老的工具可能对协议支持的不好。 后面你理解的对,请求方法最终如何处理还是要依赖于服务器,如果愿意,服务器也可以用get来上传数据,用post获取数据,现在的get/post都是依据协议标准来执行,所以是get获取post上传。

    2019-06-19
    4
  • 业余爱好者
    之前做一个网站的cms,觉得又是一套crud,毫无新意,闲得慌,于是玩了一波restful"架构"。严格按照http规范,比如,查询都用GET,新增用POST,更新用PUT,删除用DELETE,url的设计也按照rest风格设计。现在想想,tomcat支持这几种http方法也是万幸,不然的话,又得加班换成get/post了。 这段经历我认识到,http只是一种协议,不同的服务器,还有客户端,比如浏览器都可以有自己的实现。虽然各自在实现上有所取舍,但大体上,按照协议规范来,不会差。 协议,是个好东西。。

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

    2019-06-19
    2
    3
收起评论
显示
设置
留言
67
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部