1.引言

作为一个有一点Web基础的程序员,时常听身边的大牛说构建什么RESTful风格的网站之类,说实话,一头雾水,直到我看到了这篇博文 https://blog.csdn.net/qq_21383435/article/details/80032375,文章不似其他的我看到的大部分介绍RESTful的文章那样千篇一律,高深莫测(可能是我水平不够),博主以一种通俗易懂的语言介绍了RESTful风格,至少我这个菜鸟是能够看的懂得。下面这篇文章是根据参考文章总结而成,其实就是抄了一遍,非我原创,文章不在传道解惑,旨在方便日后复习查阅,文中若有纰漏,请留言指出,不必留情哦!

2.传统的API接口

HTTP协议作为目前互联网上使用最多的协议,但在过去的10几年来,一直在被错误的使用,怎么说呢?如果说你要删除一个数据,以往的做法通常是 delete/{id};如果你要更新一个数据,可能是Post数据放Body,然后方法是 update/{id}, 或者是artichle/{id}?method=update。这种做法让Roy Fielding很暴燥,他觉得这个世界不该这样的,所有的人都在误解而且在严重错误的误解Http的设计初衷,好比是发明了火药却只用它来做烟花爆竹。 那么正确的使用方式是什么呢?如果你要看Rest各种特性,你恐怕真的很难理解Rest,但是如果你看错误的使用http的人倒底儿了哪些错,什么是Rest就特别容易理解了。

2.1 使用混乱

一万个人心里有一万个Url的命名规则,Url是统一资源定位符,重点是资源。而很多人却把它当成了万金油,每一个独立的虚拟的网页都可以随意使用,各种操作都能够迭加,这是混乱的来源之一。

https://localhost:8080/myweb/getUserById?id=1
https://localhost:8080/myweb/user/getById?id=1
https://localhost:8080/myweb/x/y?id=1
2.2 使用混乱

有状态和无状态全部混在一起。特别是在购物车或者是登录的应用中,经常刷新就丢失带来的用户体验简直棒棒哒。每一个请求并不能单独的响应一些功能,很多的功能混杂在一起里。这是人性贪婪的本质,也是各种Hack的起源,只要能够把问题解决掉,总会有人用他认为最方便的方式去解决问题,比如说汽车门把手坏掉了直接系根绳子当把手,emmmm这样确实很棒啊

2.3 返回结果随意

返回的结果往往是很随意,各种错误信息本来就是用Http的状态码构成的,可是很多人还是喜欢把错误信息返回在返回值中。最常见的就是Code和Message,当然对于这一点,我个人是保留疑问的,我的观点是,Http本身的错误和服务器的内部错误还是需要在不断层面分开的,不能混在一起。可是在大神眼里并非如此。

3.问题的解决

强迫症患者的福音就是先颁规则,第一个规则就是明确Url是什么,该怎么用。就是所有的Url本质来讲,都应该是一种资源。一个独立的Url地址,就是对应一个独一无二的资源。怎么样?这种感觉是不是棒棒哒?一个冰淇淋,一个老师,一间房子,在Url上对应的都是一个资源,不会有多余的Url跟他对应,也不会表示有多个Url地址。注意,这里点的是Url地址,并不是单独的参数,他就是一个/room/{room_id}这样的东西,举个栗子/room/3242 这就表示3242号房间。这是一个清爽的世界啊,你想想,之前的Url是什么都要,我开房,可能是/open/room/3242 我要退房可能是/exit/3242/room,我要打理房间,可能是room/3242?method=clean.够了!这些乱七八糟的东西全够了,让世界回归清爽的本质,一间房,就是/room/3242,没有别的Url地址了。在过去的混乱世界里,经常用的就是Get和Post。如果不是因为Get不支持大数据传输,我想连Post都不会有人使用。(想像一下Roy Fielding在愤怒的对着电脑屏幕喊,Http的Method一共有八个,你们为毛只逮着Get一只羊的毛薅薅薅薅薅)。

而对资源最常见的操作是什么?CRUD,对不对,就是创建,读,更新,删除。再看Http的Method?是不是非常完美?其实也怪Fielding老爷子一开始命名不准确,如果刚开始就是把Get方法叫做Read,Put方法叫做Update,Post叫做Create这该多好。你用一个Get,大家又发现没什么限制没什么所谓,又很难理解Put和Post的差别,法无禁止即可为啊,呃,老爷子不要瞪我,我瞎说的。总之,这四种方法够不够你浪?你有本身找出来更多的对资源的操作来啊,我还有4个Method没用过呢。如果这4个真的不够了,有什么问题,大不了我再重新更改http协议啊。其实简单说,对于Rest理解到这里就够了。后续的东西,都是在这一条基础上空想出来的,比强迫症更强迫症,当然,无状态我是百分百支持的。以上的各种表述可能不太准确,也纯属是我的意淫和各种小道资料,并未考据,但是凭良心讲,我是早就看不惯黑暗年代里的Url命名风格了,所以当时最早接触到Rest的时候,瞬间就找到了真爱,我靠,这不就是我一直想要的答案吗?但是我一直想的仅仅是命名规范,从来没有把自己的思考角度放在一个url就是一个资源,所有的操作都是对资源的更改而言的角度上啊。所以你能理解到的程度,更多的就是在于你要弄清楚你要解决的什么问题,如果你的问题只是理解Rest,恐怕你很难理解,如果你的问题是怎么解决Url混乱的问题,你反而很快能弄懂了。

https://localhost:8080/myweb/getDogs --> GET /rest/api/dogs  获取
https://localhost:8080/myweb/addDogs --> POST /rest/api/dogs  添加
https://localhost:8080/myweb/updateDogs/:dog_id --> PUT /rest/api/dogs/:dog_id  修改
https://localhost:8080/myweb/deleteDogs/:dog_id --> DELETE /rest/api/dogs/:dog_id  删除
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: xxx{"url" : "/api/categories/1","label" : "Food","items_url" : "/api/items?category=1","brands" : [{"label" : "友臣","brand_key" : "32073","url" : "/api/brands/32073"}, {"label" : "乐事","brand_key" : "56632","url" : "/api/brands/56632"}...]
}

格式固定,第一行永远是操作失败或者成功的状态码,第二行是返回的类型,第三行内容的长度,第五行开始是内容。这样我只需写一个程序解析返回的信息就可以了,可以重用,但是我们上面传统的不仅仅要协商,还有有不同的解析程序,稍微改变,就不能正常使用了,所以rest的明显更加通用。

4.概念

REST 是面向资源的,这个概念非常重要,而资源是通过 URI 进行暴露。 URI 的设计只要负责把资源通过合理方式暴露出来就可以了。对资源的操作与它无关,操作是通过 HTTP动词来体现,所以REST 通过 URI 暴露资源时,会强调不要在 URI 中出现动词。

REST很好地利用了HTTP本身就有的一些特征,如HTTP动词、HTTP状态码、HTTP报头等等 REST API 是基于 HTTP的,所以你的API应该去使用 HTTP的一些标准。这样所有的HTTP客户端(如浏览器)才能够直接理解你的API(当然还有其他好处,如利于缓存等等)。REST 实际上也非常强调应该利用好 HTTP本来就有的特征,而不是只把 HTTP当成一个传输层这么简单了。

REST系统特征

  1. 客户-服务器(Client-Server),提供服务的服务器和使用服务的客户需要被隔离对待。
  2. 无状态(Stateless),来自客户的每一个请求必须包含服务器处理该请求所需的所有信息。换句话说,服务器端不能存储来自某个客户的某个请求中的信息,并在该客户的其他请求中使用。
  3. 可缓存(Cachable),服务器必须让客户知道请求是否可以被缓存。(Ross:更详细解释请参考 理解本真的REST架构风格 以及 StackOverflow 的这个问题 中对缓存的解释)
  4. 分层系统(Layered System),服务器和客户之间的通信必须被这样标准化:允许服务器和客户之间的中间层(Ross:代理,网关等)可以代替服务器对客户的请求进行回应,而且这些对客户来说不需要特别支持。
  5. 统一接口(Uniform Interface),客户和服务器之间通信的方法必须是统一化的。(Ross:GET,POST,PUT.DELETE, etc)
  6. 支持按需代码(Code-On-Demand,可选),服务器可以提供一些代码或者脚本(Ross:Javascrpt,flash,etc)并在客户的运行环境中执行。这条准则是这些准则中唯一不必必须满足的一条。(Ross:比如客户可以在客户端下载脚本生成密码访问服务器)

5.优缺点

优点是因为他对uri进行了限制,只用于定义资源。这样看起来比较容易理解。尤其是对简单的对象的增删改查,很好理解。

缺点是因为这种限制,导致设计uri变得复杂了。尤其是复杂的关系,操作,资源集合,硬性套用rest原则设计非常困难。在rest基础上的HATEOAS,返回的json里增加了相应的关系和url。这也同样带来问题。好处是对简单的关系,的确可以通过url进一步处理。但对复杂的关系和操作,HATEOAS并不能胜任描述。反而在单纯的数据中增加了一堆垃圾信息。

RESTful的理解相关推荐

  1. Restful的理解,Restful 优缺点

    写一下我对restful的理解,最近换工作面试的时候有问到我restful api的东西,工作中以前很多项目也是webapi + js前台控件的形式构建系统.实际上感觉restful太"理想 ...

  2. RESTful再理解

    目录 目录 前言 RESTful的目的 REST的含义 表现层 状态转化 无状态协议HTTP 最后 前言 这是在经过一段时间的积累后,对RESTFul框架的再一次更深入的理解.希望能够将零散的知识点连 ...

  3. RESTful三理解

    目录 目录 前言 Web应用的会话状态 Cookie 资源的表现形式 HATEOAS RESTful 资源 URI 前言 最近看了一篇很赞的RESTful博客,传送门:http://www.cnblo ...

  4. 什么是restful?说说你对restful的理解

    目录 什么是restful?说说你理解的restful APIview里如何获取http里的数据? 为什么APIview里获取的数据可以直接当做字典操作? 什么是restful?说说你理解的restf ...

  5. 对Restful的理解

    什么是Restful? Restful是Roy Thomas Fielding这位大神在他的博士论文文中提出来.由于其超前的思想,在当时并未引起过多的注意. 直到近几年来,大概08年以后开始慢慢流行起 ...

  6. restful 简单理解

    越来越多的人开始意识到,网站即软件,而且是一种新型的软件. 这种"互联网软件"采用客户端/服务器模式,建立在分布式体系上,通过互联网通信,具有高延时(high latency).高 ...

  7. restful RESTful的理解

    REST(Representational State Transfer ),有中文翻译为"具象状态传输"(也有:"代表性状态传输").是由 Roy Thoma ...

  8. RPC和Restful深入理解

    一.RPC RPC 即远程过程调用(Remote Procedure Call Protocol,简称RPC),像调用本地服务(方法)一样调用服务器的服务(方法).通常的实现有 XML-RPC , J ...

  9. RESTful 个人理解总结

    一.什么是RESTful 面向资源 简单的说:RESTful是一种架构的规范与约束.原则,符合这种规范的架构就是RESTful架构. 先看REST是什么意思,英文Representational st ...

最新文章

  1. java实现指数分布_Nim 语言编程实现指数分布的随机数
  2. import javax.servlet 出错(真的很管用)
  3. 数据类型 类型检测
  4. 客户端与服务器端地址的区别
  5. 用python计算绩点的代码_【Python】计算GPA
  6. 面试官系统精讲Java源码及大厂真题 - 41 突破难点:如何看 Lambda 源码
  7. 【BZOJ1563】【NOI2009】—诗人小G(决策二分栈优化dp)
  8. 职位越高的人,越容易犯5个错
  9. 蓝桥杯 ADV-119 算法提高 6-9删除数组中的0元素
  10. 哪种耳机对耳朵听力伤害较小?不妨试试骨传导耳机
  11. 回收站清空的文件能恢复吗?
  12. 苹果手机话筒声音小怎么办_苹果8通话声音小,苹果8听筒声音小怎么办
  13. 微信公众号运营新手要掌握的排版技巧
  14. 月薪40K起,什么是Python全栈工程师?全栈工程师薪资为何这么高?
  15. 安装方式B--使用ClouderaManager的Parcels包进行安装
  16. Final Cut Pro V10.6.5 MAC 专属视频后期工具
  17. Android 进阶之路:ASM 修改字节码,这样学就对了!
  18. 3D Slicer简单三维重建
  19. G16、G24、G32、G36、G60
  20. 运营入门——全栈市场人

热门文章

  1. linux操作系统的基本认识
  2. 无线充电宝靠谱吗?比较靠谱的无线充电宝推荐
  3. 超40所大学公布暑假、秋季开学时间:最短20天,有的增设暑假小学期
  4. 为 Java 程序员准备的 Go 入门 PPT
  5. ipv4访问ipv6
  6. 智慧城市-十问十答(二)
  7. 青岛大学计算机学院几号放假,2021-2021年青岛大学寒假放假时间安排及校历开学时间...
  8. qt开发的网络视频播放器
  9. Dcloud离线打包-android-AndroidStudio
  10. 七夕听雨nbsp;想你