前言
开发工程中,Rest风格是相对来说对请求路由做出了比较大的优化,那么什么是Rest风格呢?
What is Rest
举个例子,比如我们过去用SpringMVC的Controller去接请求,假设就是单纯的一个根据id查对象,那么我们会这么写
@GetMapping("/queryOne")
@ResponseBody
public Student queryOne(int id){
return service.queryOne(id);
}
没毛病吧,那么我们前端的请求地址就会是这样
http://xxx.x.x.x:8080/queryOne?id=x
我现在不想让用户看见我的请求内容,同时我还向用这一个请求地址对应多个拦截方法
比如:我向这个地址发Put请求,后台自动去调update方法,同一个请求地址前台发Get请求,后台则会自动调queryOne方法,这个逻辑就是RestFul风格的代码格式
Why Rest?
- 各个资源虽然可能有关联,但依旧是能够简单地切掉这些关联导致相互独立的,所以不会有非常乱的耦合性
- 对资源的操作就这么几种,所以很容易设计一致的URL
- 我们明白对资源的读操作是无副作用的,所以能玩缓存
而现在互联网99%的人都在说,我这个是用Rest风格书写的,其实就是用了用Put和Post请求,美化了一下url,其实根本没有触碰到核心的东西,关于Rest如果没有思考过下面两个问题,那么基本就是走走过场
- 对于用户登录和用户退出这两个业务需求,REST指导下的架构和设计如何满足
- 批量的删除、修改、新增如何满足
How Rest?
到这个点我们需要一个例子,就拿上面那个例子吧,这次前台请求的url我们就是规定好是/stu, ok下面看一下怎么实现
/**
* REST请求 <BR>
* 请求地址: http://ip:port/path/user/1 <BR>
*/
@GetMapping("/{id}")
@ResponseBody
public Student getStuById(@PathVariable("id") int id) {
return studentService.queryById(id);
}
Spring针对Rest设计了专门的注解@PathVariable,它可以拿到url中的参数,那么我们的url请求就变成了
http://ip:port/path/stu/1
只要是这个url并且是get请求就自动的进入这个方法,拿到id=1的请求参数,然后后台再执行操作,那么同理put
@PutMapping("/{id}")
@ResponseBody
public String updateStudent(@PathVariable int id, @RequestBody Student student) {
student.setId(id);
studentService.updateStudent(student);
// 重定向到update页面
return "success";
}
没错 同一个url
http://ip:port/path/stu/1 +Json对象
只要是put请求就进入了updateStudent这个方法,进行业务逻辑处理
进阶
进阶一点就要提到@ReqeustParam和@PathVariable的区别了
@RequstParam
- 它是一个可以接url?id=x,它能接到x,自动的给方法参数
//请求中包含username参数(如/user?userName=zhang),则自动传入。
@GetMapping("/user")
@ResponseBody
public String queryUserName(@RequestParam String userName){
...
}
- 发送的key和后台接的参数,名称不一样
http://ip:port/path/user?user=张三
@GetMapping("/user")
@ResponseBody
public String queryUserName(@RequestParam("user") String userName){
...
}
- 多个参数同名:
但是在传递参数的时候如果是url?userName=zhangsan&userName=wangwu时,即两个同名参数,前台传递了两个一样的参数,可用如下方式:
public User queryOne(@RequestParam(value="userName") String [] userNames)
//或者是
public User queryOne(@RequestParam(value="list") List<String> list)
@PathVaribale
而它翻译过来是路径变量,顾名思义它接参数需要变量在url上占位,多个参数就要这么写
@GetMapping("/{pageNum}/{pageSize}")
@ResponseBody
public List<User> querySome(@PathVaribale int pageNum,@PathSize int pageSize){
...
}
两者结合
那么问题来了,两者能不能结合起来?当然可以,比如条件查询,我们看看name为张三的用户顺便分页
http://ip:port/path/user/1/3?name=张三
@GetMapping(/{pageNum}/{pageSize})
@ResponseBody
public List<User> querySome(@PathVariable int pageNum,@PathVariable int pageSize,@RequestParam String name){
...
}
总结
至于 上面针对Rest的思考
- 对于用户登录和用户退出这两个业务需求,REST指导下的架构和设计如何满足
- 批量的删除、修改、新增如何满足
留个小尾巴吧,我会抽个时间带大家剖析一下,今天关于Rest就这么多吧