一 Rest名词由来概述
简述 Rest 这个名次 首先我们需要了解 Roy Tomas Fields 这个人。Fields 生于1965年是美国的计算机科学家,参与了HTTP协议规范制定,是 Apache HTTP Server 联合创始人之一,是 Representational State Transfer (REST) 规范的制定者。
二Rest 名词概述
Rest (Representational State Transfer)字面上是表现层状态转移的意思,稍微深入理解一点就是从URI获得的资源在表现层进行状态的转移。
- 资源: 就是URI(在Rest里面又可以称为 End Point) 请求获得资源。
- 表现层:就是资源的表现形式,比如说以字符串方式表现,以json或者XML方式形式表现。
- 状态转移:就是对资源操作后的状态,比如对资源进行访问,修改,添加,删除。
如果我们开发的网站符合Rest风格设计规范,那么我们统称为Rest风格网站。
三 HTTP对应Rest的行为
- GET请求对应Rest里面的访问。
- POST请求对应Rest里面的新增。
- PUT请求对应Rest里面的修改。
- PATCH请求对应Rest里面的修改,这个比较少用,是java不提倡的方式之一。
- DELETE对应Rest里面的删除。
有关HTTP其他行为在此不概述,不是本文重点。
四 Rest风格开发不合理示例
4.1 在Rest风格中URI不推荐使用动词
错误: @GetMapping("uri/get/1327")
正确: @GetMapping("uri/1327")
4.2 在Rest分格中不推荐使用版本号
在Rest风格中URI获取资源是唯一的,不存在几个版本的说法。
错误: @GetMapping("uri/v1/1327")
正确: @GetMapping("uri/1327")
4.3 经验之谈如果是复数建议使用复数形式
比如请求的用户是多数,那么使用复数形式。
不推荐: @GetMapping("uri/user/1327")
推荐: @GetMapping("uri/users/1327")
五 使用SpiingMVC开发遵循Rest规范概述
在spring4.3 之前 注解对应:
- @RequestMapping(path ="/uri/youku1327",method = RequestMethod.GET)
- @RequestMapping(path ="/uri/youku1327",method = RequestMethod.POST)
- @RequestMapping(path ="/uri/youku1327/{id}",method = RequestMethod.PUT)
- @RequestMapping(path ="/uri/youku1327/{id}",method = RequestMethod.DELETE)
在spring4.3之后对@RequestMapping注解进行了封装:
- @GetMapping("/uri/youku1327")
- @PostMapping("/uri/youku1327")
- @PutMapping("/uri/youku1327/{id}")
- @DeleteMapping("/uri/youku1327/{id}")
常用注解概述
- 在URL中的变量可以使用@PathVariable注解获得;
- 参数使用json格式,可以使用@RequestBody注解接收,将json对象转为java对象;
- 响应数据使用 @ResponseBody注解将java对象转为json响应给前端;消息的转换内部是通过HttpMessageConvert进行实现;
- 后面还提供了@RestController注解里面封装了@Controller和@ResponseBody注解,简化开发,自动响应为josn格式,默认是"application/json;chartset=UTF-8";
- PostMapping等行为注解里面有consumers表示限定该方法的请求类型;produces表示限定该方法返回的媒体类型。
- 响应的返回值可以使用ResponseEntity实体类,里面可以封装body,head,status;
- 通常的响应状态码我们可以使用HttpStatus枚举结合@ResponseStatus方式;
- 自定义异常使用@ControllerAdvice 结合 @ExceptionHandler 方式;