如题,能否通俗解释一下,及其应用场景,优点,为何使用RESTful?
翔逼
今年6岁
只认识数字
几个汉字(四条腿,两条腿,飞,游泳,爬行)
放假啦,`宝哥`带`翔逼`去动物园。
动物园 - No RESTful翔逼
:宝哥
~老虎在哪呀?宝哥
:在第10086
号笼子。翔逼
:啊咧咧?动物园怎么大,我找不到?宝哥
:用脚找呗~翔逼
:啊咧咧?欺负人
~
动物园 - RESTful翔逼
:宝哥~老虎在哪呀?宝哥
:到门上写爬行
的入口。翔逼
:啊咧咧?然后呢?宝哥
:进去后,到门上写着四条腿
的入口。翔逼
:啊咧咧?我到了,现在呢?宝哥
:到笼子编号是2
号的笼子,就能看到了。翔逼
:啊咧咧?找到了,老虎好帅啊~~~
把每一个uri都抽象成一个资源
通过http的方法(get/put/delete/post)来实现资源的增删改查,通过http的response code来定义资源操作状态
如果有兴趣的话,去看RESTful发明者最初的论文,会发现RESTful本质上是一种架构。一言两语是解释不清的,建议通读一本书,比如RESTful Web Services
简单来说, rest把系统想象为很多资源的集合,然后通过统一的接口去操作这些资源。 这里说的统一的接口的
意思是你提供给外部(客户端)去操作任何一个资源的方式(方法)应该是一样的, 这应该就是rest的核心,
当然他还有其他细致的规范,比方说无状态。
落实到http协议上, 服务器上面的资源,通过http get,post,delete,put 请求去操作这些资源。
也就是说我们平时使用过的http res只是rest其中一种方式
就是这么回事。
题主所说的RESTFul,其中的REST实际上应该是ReST:Representational State Transfer的缩写,具体解释起来应该是:
Representational的意思是表现形式
State Transfer的意思是状态转换
所以RESTful的含义是资源通过状态转换的一种表现形式。具体一点说,资源通过URL来定位,通过POST,GET,PUT,PATCH,DELETE等方法来操作,完成操作后通过HTTP的状态码2xx/4xx来完成状态的转换
先来说URL
其中资源指的就是URL。1楼答案表达的意思差不多,URL是用来定位资源的,但是1楼给出的方法也不是RESTful的方法。RESTful规范中的URL,通俗一点可以理解为与关系数据库中的表结构一一对应。也就是说URL中只包含名词+资源id,还是借用1楼的例子,如果老虎的id是10086,那么表示老虎的URL就应该是:
对于访问URL的客户端或浏览器来说,不存在“动物园这么大,我找不到”的情况:既然知道id是10086,就可以拼接出完整的URL。如果需要表现资源之间的层级关系,比如一个动物园分成了4个区域,每个区域有自己的id,老虎在第
3
区,就应该这么表示:Query用作资源的筛选
但是如果客户端不知道老虎的id是10086,想搜索老虎怎么办呢?刚才说了RESTful通俗一点可以理解为与关系数据库中的表结构一一对应,那么我们如果访问
/animals
应该获得的是数据库中animals
这个表的所有记录,这么多记录里面找老虎确实不方便,但我们知道老虎类型为爬行,腿的数目为4,就可以这么筛选:这里的query:
?type=crawl&leg_num=4
就起到了筛选作用,我们就可以得到一个数据库中animals
表的子集,其中包含了id为10086
的老虎。HTTP方法
同样的,HTTP方法不表示对页面或者代码的操作,而是对资源的操作。GET方法表示获取URL对应的资源,POST/PUT方法表示新建1条资源,PATCH方法表示对URL对应资源的部分内容进行修改,DELETE表示删除URL对应的资源。
优点和应用场景
综合上面所说的,RESTful的优点:
不需要解释即明白某个接口设计的意图
接口和资源一一对应,方便写代码,甚至有一些工具(例如sandman)能根据数据库的表结构生成对应的RESTful代码
方便做权限控制,例如只允许用户访问自己上传的文件(假设这个文件的URL是
/users/123/files/456
),此时URL里面已经包含了这个用户的id,不必再通过其他方式反查为前端提供足够的灵活性
在API升级过程中URL的改动较少,减少版本管理的工作量
因此需要访问RESTful API的场景:
需要对数据进行灵活管理的Web页面
手机客户端的开发
参考
理解RESTful架构
RESTful API 设计最佳实践