一 概述
一种软件架构风格、设计风格,而不是标准,只是提供了一组设计原则和约束条件。
REST(Representational State Transfer),翻译过来叫“表述性状态转移”,它首次出现在 2000 年 Roy Fielding 的博士论文中,Roy Fielding是 HTTP 规范的主要编写者之一。
REST指的是一组架构约束条件和原则。满足这些约束条件和原则的应用程序或设计就是RESTful。
总的来说,这更像是一种思想、理念,REST本身并没有增添新的技术,利用Web现有的特征和能力,更好地使用现有Web标准中的一些准则和约束。
二 数据字典
1.HTTP请求方法
根据HTTP标准,HTTP请求可以使用多种请求方法。
HTTP1.0定义了三种请求方法:GET,POST和HEAD方法。
HTTP1.1新增了五种请求方法:OPTIONS,PUT,DELETE,TRACE和CONNECT。
序号 | 方法 | 描述 |
---|---|---|
1 | GET | 请求指定的页面信息,并返回实体主体。 |
2 | HEAD | 类似于get请求,只不过返回的响应中没有具体的内容,用于获取报头 |
3 | POST | 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。 |
4 | PUT | 从客户端向服务器传送的数据取代指定的文档的内容。 |
5 | DELETE | 请求服务器删除指定的页面。 |
6 | CONNECT | HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。 |
7 | OPTIONS | 允许客户端查看服务器的性能。 |
8 | TRACE | 回显服务器收到的请求,主要用于测试或诊断。 |
在SpringMVC中有对应的注解标明映射极其方法:@GetMapping、@PostMapping、@DeleteMapping、@PutMapping
2. 资源
REST 表述性状态转移,这里是指资源的表述。资源可以是实体,也可以只是一个抽象概念。
教务系统中教师(teachers)、学生(students)、教务(admins)、教务对象教师的管理(adminTeacher),
博客系统中文章(articles)、评论(comments),这些都是代表的资源。下面列举网上找到的 一些例子:
- 某用户的手机号码
- 某用户的个人信息
- 最多用户订购的GPRS套餐
- 两个产品之间的依赖关系
- 某用户可以办理的优惠套餐
- 某手机号码的潜在价值
3. 动作
对资源所要进行的操作,常见的有更新(update)、删除(delete)、查询(select/get)、添加(get/add)
三 案例分析
假设现在有一个项目example(某教务系统),其中有一个模块是教务模块,其中教师管理页面删除教师请求的服务端API地址:
http://example/adminTeacher/delete
以往我们设计后端请求url映射路径时,会将动作指示(即我们要进行的操作)写入,但是RESTful是面向资源的架构,所有其URL应该是一个资源,而且不包含任何动作,而动作的体现即对资源的具体操作类型应该由HTTP请求方法表示,动作不应该存在于URL中,delete是一个动作,因此不符合该特点,所有删除教师对应的RESTful API应该是:
对应的http请求是DELETE。
四 设计原则
URI:
- URL中尽量不用大写;
- URI中不应该出现动词,动词应该使用HTTP方法表示但是如果如果无法表示,也可以使用动词,例如:search没有对应的HTTP方法,可以在路径中使用search,更加直观。
- URI中的名词表示资源集合,使用复数形式;
- URI可以包含queryString(过滤参数),避免层级过深。
服务端数据返回:
- 最后是返回的JSON格式数据,即在SpringMVC中控制层可以利用@RestController或者@ResponseBody
版本控制:
- 规范的API接口应该包含版本信息,在RESTful API中,简单的就是将版本信息放在url中,如:
[GET] http://example.com/v1/articles?page=1&rows=10
[PUT] http://example.com/v1/articles/12
- 或者是使用HTTP header中的accept来传递版本信息
参考博客:http://www.cnblogs.com/han-1034683568/p/7196345.html
五 设计技巧
设计技巧大家可以参考GitHub网站:
- https://github.com/git
- https://github.com/git/git
- https://github.com/git/git/blob/master/block-sha1/sha1.h
- https://github.com/git/git/commit/e3af72cdafab5993d18fae056f87e1d675913d08
- https://github.com/git/git/pulls
- https://github.com/git/git/pulls?state=closed
- https://github.com/git/git/compare/master…next
下面让我们来看看URI设计上的一些技巧:
- 使用_或-来让URI可读性更好
曾经Web上的URI都是冰冷的数字或者无意义的字符串,但现在越来越多的网站使用_或-来分隔一些单词,让URI看上去更为人性化。 例如国内比较出名的开源中国社区,它上面的新闻地址就采用这种风格, 如http://www.oschina.net/news/38119/oschina-translate-reward-plan。
- 使用/来表示资源的层级关系
例如上述/git/git/commit/e3af72cdafab5993d18fae056f87e1d675913d08就表示了一个多级的资源, 指的是git用户的git项目的某次提交记录,又例如/orders/2012/10可以用来表示2012年10月的订单记录。
- 使用?用来过滤资源
很多人只是把?简单的当做是参数的传递,很容易造成URI过于复杂、难以理解。可以把?用于对资源的过滤, 例如/git/git/pulls用来表示git项目的所有推入请求,而/pulls?state=closed用来表示git项目中已经关闭的推入请求, 这种URL通常对应的是一些特定条件的查询结果或算法运算结果。
- ,或;可以用来表示同级资源的关系
有时候我们需要表示同级资源的关系时,可以使用,或;来进行分割。例如哪天github可以比较某个文件在随意两次提交记录之间的差异,或许可以使用/git/git /block-sha1/sha1.h/compare/e3af72cdafab5993d18fae056f87e1d675913d08;bd63e61bdf38e872d5215c07b264dcc16e4febca作为URI。 不过,现在github是使用…来做这个事情的,例如/git/git/compare/master…next。
参考博客:https://www.runoob.com/w3cnote/restful-architecture.html
养成良好的编码习惯,受益终生!!!