前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >你有REST Style吗

你有REST Style吗

作者头像
愿天堂没有BUG
发布2022-10-28 11:10:59
1.5K0
发布2022-10-28 11:10:59
举报
文章被收录于专栏:愿天堂没有BUG(公众号同名)

通过标题你应该已经知道了,我们接下来要学习一下如何使用Spring MVC构建RESTful接口。不过,在学习RESTful接口之前,我们需要先了解一些关于HTTP的知识。

你应该懂一点HTTP

我们都知道,HTTP就是HyperText Transfer Protocol(超文本传输协议)的缩写。它是一种关于“传输”的协议,既然是传输,那么至少要在两个对象之间进行,在HTTP中对应的就是客户端和服务端。客户端和服务端对应两个动作——请求和响应。客户端向服务端发送请求,而服务端则根据客户端的请求做出相应的响应。

客户端能够发出请求,服务端能够做出响应,这样才能形成一个完整的HTTP通信过程。假如只有客户端没有服务端,则发出请求后收不到响应,岂不是白白浪费时间?而如果没有任何请求,那么服务端无从响应,也不知道响应给谁。这两种情况都不太好,只有一个人喊一句:有船吗?另一个人回应:船来啦!这样才圆满。

报文

如果你接触过HTTP,那么对“报文”肯定有所耳闻。HTTP的报文有两种——请求报文和响应报文。

请求报文

开 头 的 GET 表 示 请 求 的 类 型 , 称 为 HTTP 的 方 法 ( Method ) 。之 后的/v3/api-docs表示请求的路径。HTTP/1.1表示本次请求使用的HTTP协议的版本。接下来的Host和Accept都属于首部(Header)字段,属于可选字段。空行下面的…代表实体的主体(Entity Body)部分,同样是可选内容。

这段请求内容的意思是:以GET方式基于HTTP协议的1.1版本请求访问localhost:8080服务器(这里是我们自己的计算机)上的/v3/api-docs资源。

响应报文

开头的HTTP/1.1与请求报文的意义相同。之后的200 OK表示响应的状态码(Status Code)和原因短语(Reason-Phrase),接下来的Date、ContentType等都属于首部字段。接着以空行分隔,最后的…与请求报文一样是资源实体的主体。

报文结构

根据上面请求报文和响应报文的例子,我们可以知道报文由3部分组成。

· 起始行(请求行、响应行)

报文的第一行,请求行(请求报文中的起始行)用来说明要做什么,响应行(响应报文中的起始行)用来说明结果如何。

· 首部

起始行后面有零到多个首部字段,首部字段由key:value的方式构成,类似于Java中的Map结构。首部以一个空行结束。

· 主体(部分请求方法没有主体)

空行之后是报文主体,请求主体包含了客户端发送给服务端的数据;响应主体则是服务端要返回给客户端的内容。起始行和首部都是文本格式,且其结构都是相对固定的。而主体则不一样,主体中可以包含任何格式的数据(如文本、图片、音频、视频、其他文件)。

报文结构如图5-1所示。

首部和主体之间有一个空行。

状态码

状态码与原因短语用来描述请求的处理结果。HTTP状态码共有五大类,如表5-1所示。

目前,1xx的状态码并不常见,原因是对于这类状态码,人们还存在很多争议,对其应用非常少。常见状态码包括200、304、403、404、500等。

安全性与幂等性

安全性与幂等性指的都是HTTP方法的特性。安全性指的是不会对服务端造成影响,也就是说,如果一个方法是安全的,那么无论如何请求,服务端都不会因为这个请求而发生变化,简而言之就是只读。幂等性指的是多次请求对服务器造成的影响与第一次请求完全一样。例如,调用一个PUT方法将ID为1的用户年龄值设置为18,那么无论调用多少次这个方法,对服务端的影响都是将ID为1的用户年龄值设置为18。

表5-2展示了常用HTTP方法的安全性和幂等性。

安全性与幂等性依赖于服务端实现,这种方式是一种契约,并不是说将一个删除操作的接口设置为GET请求(它依然具备安全性),而是说对应类型的请求在实现的时候要符合它们的安全性、幂等性约定。

协议版本

在前面介绍报文的时候,你可能已经发现了,不管是请求还是响应,里面都有一个值——HTTP/1.1。这个值主要用来说明当前请求/响应使用的是HTTP的哪个版本。HTTP发展至今,经历了几个版本的更迭,一直在进化,在成长。

前面示例中用的是目前最为流行的HTTP/1.1。除了这个版本,在这个版本之前还有HTTP/0.9、HTTP/1.0,之后还有HTTP/2.0。接下来我们来看看它们之间的异同。

HTTP/0.9

这个版本只能算作一个原型版本,诞生于1991年。它非常简陋,并且存在严重的设计缺陷。它只支持GET请求,没有Header(也就是我们上面说的首部),其设计初衷就是为了从服务器中获取简单的HTML对象。好在后面很快就被HTTP/1.0取代了。

HTTP/1.0

HTTP/1.0算是真正意义上的正式版本。这个版本设计已经非常良好与完善了,后面也得到了广泛的应用。HTTP/1.0在之前版本的基础上增加了Header、状态码的支持,并且支持更多的HTTP方法,还加入了对多媒体格式和缓存的支持。

HTTP/1.1

HTTP/1.1是目前应用最广泛的版本,在HTTP/1.0的基础上进行了进一步的完善。该版本最大的变化是引入了持久连接,使得建立一次连接可以发送多次HTTP请求,提高了资源利用率。同时,增加的PUT、PATCH、DELETE方法对后来RESTful的发展也有一定的促进作用。另外,Header中还增加了Host字段,使得同一主机可以提供多个服务。

HTTP/2.0

HTTP/2.0目前还没有得到广泛的应用,但这只是时间问题而已。这个版本主要在性能方面进行了优化,将所有数据都改为二进制格式进行传输(之前基106本上都是字符串),并且对首部内容进行了压缩传输。此外,还增加了双工模式,使得客户端可以在一个HTTP连接中同时发送多个请求,服务端也可以同时处理多个请求。HTTP/2.0还增加了一个新特性——服务器推送(ServerPush),即由服务器主动发起的操作,这一特性很适合静态资源(如CSS、JS等)的加载。

说起HTTP,有这样一个现象:前端工作人员认为HTTP应该是后端工作人员掌握的知识,后端工作人员认为HTTP应该是前端工作人员掌握的知识。对此,HTTP表示“我招谁惹谁了?”那么,HTTP究竟是谁应该掌握的呢?我认为,每个程序员都应该了解HTTP。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-10-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 愿天堂没有BUG 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档