目录
1.Reful风格介绍
1.1 概念
- Reful风格是一种软件架构风格,其核心是面向 资源的一种设计。
- 通俗讲就是每个资源都有一个 url 地 址,而不是不同的操作有不同的 url 地址,比如我们对用户信息的增删改查,用户就是资源,增 删改查是操作,以前我们是一个操作一个 url 地址,现在按照 Restful 的说法,url 地址只能有一 个。
以前我们来实现对用户的增删该查的时候是以操作为基础来声明 URL 地址的:
新增用户 : http://localhost:8080/userAdd?uid=1&uname=zhangsan&age=12
修改用户 : http://localhost:8080/userUpdate?uid=1&uname=zhangsan
删除用户 : http://localhost:8080/userDelete?uid=1
查询用户 :http://localhost:8080/userSel?uid=1
而按照 Restful 的格式对用户的操作应当只有一个 url 地址 :
操作用户 : http://localhost:8080/user
Restful 要求在当前的 url 地址中直接嵌套请求数据。
新增用户 : http://localhost:8080/user/1/zhangsan/12
修改用户 : http://localhost:8080/user/1/zhangsan
删除用户 : http://localhost:8080/user/1
查询用户 :http://localhost:8080/user/1
传统方式不仅书写麻烦,而且具有安全隐患,会程序的人读取你的url就知道你要干什么,但是再看resultful风格的url,书写简单,一般无法通过url知道我要干什么。
但是这样又出现了新的问题,就是如何区分不同的操作调用不同的功能方法处理呢?比如上面 的删除和查询的 url 地址就是一样的怎么区分不同的操作呢 ?
因此,restful 中要求使用不同的请求方式来标记对 资源的操作方式,达到调用不同的后台功能方法来处理请求的目的,但请求数据被嵌套在了请求地址中,需要结合 @PathVariable 注解来获取。
1.2 @PathVariable 注解
上面的请求URL的单元方法书写如下
总结:Restful风格的请求
- 格式:
http://ip:端口号/单元方法路径/请求数据/请求数据/...
该格式在前端的页面中声明
- 后端写法:
@XXXMapping("/访问路径/{占位符}/{占位符}/....")
public 返回值类型 单元方法名称(@PathVariable("占位符的名称")形参类型 形参名,形参类型 形参名,....){
//方法体
}
- 注意:
(1)如果单元方法的形参前没有使用@PathVariable注解,则还是按照以前的请求数据为键值对方式携带的方案来获取请求数据!
(2)不要直接使用@RequestMapping来声明单元方法的访问路径了,而是不同的请求方式使用对应的注解
查询: @GetMapping
新增: @PostMapping
修改: @PutMapping
删除: @DeleteMapping
(3)如果占位符的名称和形参名一致,不需要在@PathVariable注解中额外说明了
2.@ResponseBody 注解的使用
2.1 介绍
- @ResponseBody 注解是类或方法级注解。
以前单元方法处理请求后的响应方式有请求转发和重定向,单元方法的返回值类型必须是String类型,使用return关键结合“forward”和“redirect”关键字,直接返回要跳转的资源路径,但现在前端绝大部分的请求都是Ajax类型的请求,需要直接响应数据给前端。
- 当方法上添加@ResponseBody 注解后,控制单元方法返回值将不再被视图解析器进行解析。 而是把返回值放入到响应流中进行响应。
- 【一句话,当加上这个注解后,响应的是数据值而不是资源路径了】
2.2 简单使用
如上图,访问时,浏览器中会直接显示“wollo”,而不是资源跳转。但是如果直接返回中文,浏览器中会出现乱码,这时候通过设置produces 属性的值为text/html;charset=utf-8 中。
2.3 自动转换为 JSON 字符串【记】
@ResponseBody 注解可以把控制单元返回值自动转换为 JSON 字符串。主要完成下面几个事 情 :
- (1)判断返回值是否为 JavaBean、JavaBean 数组、List、Map 等满足 键值对的类型。
- (2)如果满足键值对类型,会使用 Jackson 把对象转换为 JSON 字符串,设置到响应流中。 同时会设置响应内容类型(Content-Type)为 application/json;charset=utf-8
使用中需要导入jackson的依赖
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.17.1</version>
</dependency>
(1)实体对象存储返回json
访问后返回如下json数据
(2)使用集合存储返回json
访问后返回如下json数据
(3)使用Lisht集合存储返回数据
List集合中为基本类型时
访问后返回如下数据
List结合中为对象时
访问后返回如下数据
2.4 转换为 XML 文件
在 Spring MVC 中也支持把返回值转换为 XML 文件,用法和上面一样,只是导入的依赖有所区别,这里不过多阐述。
导入依赖为
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-xml</artifactId>
<version>2.17.1</version>
</dependency>
3.@RestController 注解的使用
- 对于页面中使用前端框架时的项目,客户端向服务端发送的请求都是异步 Ajax(或类似 Ajax 的异步请求),对于这样 的项目,控制器中所有的方法都包含@ResponseBody 注解。可以使用@RestController 进行简化。
- @RestController = @Controller + @ResponseBody。
- 一旦类上使用了@RestController,所有控制单元返回都是 XML 或 JSON 数据。而无法 实现页面跳转功能了。所以:只要类中有一个方法是希望实现页面跳转功能,类上就不能使用 @RestController。
4.@RequestBody 注解的使用
- @RequestBody 注解底层依赖的依然是 Jackson 工具包,其作用是把客户端传递过来的请求体中 JSON 或 XML 数据转换为 Map、类、List< 类 >、List 等类型。相当于是@ResponseBody 注解的逆操作。
- 不能是 GET 类型请求(GET 没有请求体),多用在 POST 类 型的请求中。
请求内容类型详解
在客户端中无论使用的是 表单,还是 Ajax 请求,默认的请求时内容类型都是 application/x-www-form-urlencoded,表单普通表单参数。普通表单参数接收方式我们不陌生。
(1)普通表单类型是数据被接收
对于普通表单参数就和参数接收方式相同,使用同名参数或 JavaBean 接收都可以(前面学过)。
表单数据
接受的单元方法
(2)Ajax 请求参数
使用 Ajax 请求时,默认的参数类型也是普通表单参数(Form Data)
修改请求内容类型
如果希望修改默认的请求内容类型,可以使用 HTML 的 中 enctype 属性或使用 Ajax 中 contentType 属性进行设置。但是 的 enctype 属性一般只有在文件上传时才会修改, 所以希望传递特定类型请求参数内容时,都是通过 Ajax 进行请求。
如下,发出请求数据时,修改内容类型为JSON。
【上图中ajax请求参数设置说明】
(1)contentType:必须设置。常见取值“application/json”或"application/xml"。如果没有设置这个属性,取值默认是 application/x-www-form-urlencoded,表示普通表单参数。 当设置为"application/json"时,会把 data 取值设置到请求体中,这时服务端接收参数时就不能按照普通表单参数进行接收,要加上@RequestBody 注解了。
(2)data: 请求参数。
(3)type: 请求类型不能是 get 类型,因为 get 类型没有请求体。常用就是 post 类型。