前言:
本文基于java平台,数据交换默认采用JSON。本文需要一定的前后端交互的知识储备以及对spring相关框架的了解才能顺利阅读。
本文会根据实际开发经验以及技术的迭代更新同步保持更新。
本文相关定义有借鉴或者引用相关书籍的部分,如有侵权,本文会删除侵权部分。
什么是REST?
「REST」是一种「风格」而不是一种规则。其全称是Representational State Transfer(状态转换)。在实际应用中,并不一定要使用这种风格(相对而言,各种微服务api大都采用这种风格),它的优点在于可以使得软件设计更加简洁,更有层次,简言之,它能够将http行为和资源进行分离,对版本的管理也更加友好。其缺点也是显而易见的,REST风格对后端开发者的要求较高,对同样一个业务,普通api一次请求可能就能完成,但是REST风格架构可能需要多次请求。
REST的特点
- 资源:REST的主要关注点在「资源(文本、音视频、图片等)」,按照面向对象的思想来说,资源就是存在于互联网上的一个对象。这个对象可以通过一个URI进行精确定位。
- 表现层:资源可以通过各种形式进行展现,这取决于用户需求(开发者始终都是为甲方所服务的)。在大多数情况下,我们的资源都是以JSON格式展现的。
- 状态转换:和现实中的资源一样,网络资源也是一个变化的过程,这个过程在http请求中分别对应创建(POST请求)、访问(GET请求)、修改(PUT请求)、部分修改(PATCH请求)和删除(DELETE请求)的过程。由于HTTP协议是无状态的,所以状态转换即资源的状态转换。
RESTFUL风格的设计
RESTFUL风格设计说简单也简单,说难也难,新手初学时,需要记得在规则中URI中不允许出现动词。因为请求方式已经包含了动作的信息。
很多新兴网站的URI都能看到RESTFUL风格的影子。
注意:本小节所有的正确错误都是以RESTFUL风格的规则为基准。
// 不规则的URI设计:出现了动词
// 获取用户信息,GET请求
ip/users/getUser/{userId}
// 不推荐的设计
// 下面的URI冗长并且不直观
ip/users?userId=1&userName=test&sex=1&age=23&phone=123
以下是规则的设计:
// 获取用户信息,GET请求
ip/users/{userId}
// 获取用户列表 ,GET请求
ip/users/
// 更新部分用户信息, PATCH请求(与PUT请求的功能部分重叠)
ip/users/{userId}/{userName}
// 更新用户全部信息,PUT请求
ip/users/{userId}/{userName}/{sex}/{age}/{phone}/
URI中的参数在后台代码中通过
@PathVariable
注解获取。如果URI包含版本信息,应该将版本信息放在请求头中。
- 后台小例子
/**
* 创建用户.
**/
@PostMapping("/user")
@ResponseBody
public Map<String, Object> createUser(@RequestBody User user) {
// do something
}
后台接收参数的方式有很多,
@RequestBody
注解只是其中一种比较方便的写法,正常情况下,只要前端参数名和后台参数实体对象的属性名相同,spring就会自动进行映射。
开发经验
- 一般建议参数数量在五个以内才采用
@PathVariable
注解来接收。超过五个的应采用JSON格式传递参数。 - RESTFUL风格在前后端分离的系统中比较流行。
- 前端在发出请求时可以指定相应的请求类型(本文只举例ajax请求)
// POST、GET请求
$.ajax({
url : "你的url地址",
// type : "get",
type : "post",
dataType : "json",
cache : false,
data:{
key1: value1,
key2: value2,
keyN: valueN
},
success: (data) => {
// do something
}
// PUT、PATCH、DELETE请求,此处只举例DELETE请求,其他大同小异
$.ajax({
url : "你的url地址",
type : "delete",
dataType : "json",
cache : false,
data:{
key1: value1,
key2: value2,
keyN: valueN,
_method : "delete"
},
success: (data) => {
// do something
}
- 在Class上使用
@RestController
,在方法上使用@PostMapping
@GetMapping
@PutMapping
@PatchMapping
@DeleteMapping
注解,再辅助以规范的REST风格的URI设计,可以快速地上手RESTFUL风格架构。
@RestController
注解会将本类的所有方法的返回值转化为JSON格式的数据。
- 在前后端没有约定好参数名的情况下,甚至遇到某些奇葩的前端开发者,可以使用
@RequestBody Map<K,V>
来接收参数,以不变应万变。
网友评论