SpringBoot-Web开发-07-内容协商——多端内容适配
·
上一篇:SpringBoot3-Web开发-06-路径匹配规则
下一篇:SpringBoot-Web开发-08-内容协商原理-HttpMessageConverter(上)
多端内容适配
一套系统适配多端数据返回。
假设:
- 主体:写好一个接口
GET /person。 - 部署:部署到服务器,暴露给外界访问。
- 外界:
1. 一个移动端应用:希望接口返回一个JSON文件;
2. 一个第三方应用:希望接口返回一个XML文件;
3. 一个IoT(物联网设备):希望接口返回一个自定义协议数据文件。
提问:
- 以以上假设为例,如何让一个接口做到多端的数据反馈?
思考:
- 一,可以写三个请求路径,分别为
/person.json、/person.xml、/person.diy(应用指定后缀),这三个不同应用分别访问指定的请求路径:- 缺点:这种方法只能用在内部接口少的情况下。如果,内部接口很多,那么每个接口都得拆分成三个接口,对应三个外部应用。若需要返回更多种类型数据文件,这个数量还得上升。
- 二,
SpringBoot可以解决这个问题,详细看接下来的内容。
默认规则
a.主要内容
内容协商功能是SpringMVC自带的功能,SpringBoot对其进行了整合,快速实现一套系统适配多端数据返回。
SpringBoot多端内容适配
- 基于请求头内容协商(默认开启)
- 客户端 向 服务端 发送请求时,携带HTTP标准的Accept请求头。
- 客户端:外界应用
- 服务端:接口
accept:是http协议里规定的一个标准
- 在 客户端 向 服务端 发送请求时,带上Accept,让 服务端 知道该返回什么类型的数据,SpringBoot 就把数据自动格式化成对应类型,再返回。
- 举例:
- Accept:
application/json - Accept:
text\xml - Accept:
text\yaml
- Accept:
- 举例:
- 基于请求参数内容协商(需要手动开启)
- 举例:
?format=json:- 发送请求:
GET /projects/spring-boot?format=json - 匹配:匹配到
GetMapping("/projects/spring-boot") - 返回:根据参数协商,优先返回
json类型数据
- 发送请求:
- 同理,发送请求
GET /projects/spring-boot?format=xml,则优先返回xml类型数据
b.演示验证
- 创建一个接口,其内容如下:
- 先绑定地址:
@GetMapping("/person") - 再定义一个 Person类。
- 创建的接口代码如下:
package com.atwyb.web.controller; import com.atwyb.web.bean.Person; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class HelloController { @GetMapping("/person") public Person person(){ Person person = new Person(); person.setId("1"); person.setUserName("zhangsan"); return person; } } - person的javabean如下:
package com.atwyb.web.bean; public class Person { private String id; private String userName; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } }
- 先绑定地址:
点进
@RestController,发现标注了@ResponseBody。说明@RestController返回的数据都标注了@ResponseBody,而所有标注了@ResponseBody的对象,都会以json传输。
-
启动项目,在浏览器中验证:
- 浏览器中访问:
http://localhost:8080/person - 发现数据的类型为
json,如下图所示:
- 浏览器中访问:
-
思考:要想让数据适配xml,该怎么做?
- SpringBoot默认支持把对象写为json。因为默认web场景导入了jackson处理json的包:jackson-core。
- jackson是一个库,也支持把数据写为xml,但要导入xml相关依赖:
- 引入支持xml内容依赖:
<dependency> <groupId>com.fasterxml.jackson.dataformat</groupId> <artifactId>jackson-dataformat-xml</artifactId> </dependency> - 标注xml注解:在Person这个JavaBean下标注xml注解
@JacksonXmlRootElement public class person{(省略……)}
- 引入支持xml内容依赖:
- 开启基于请求参数的内容协商(默认关闭)
- 开启基于请求参数的内容协商功能,默认参数名为format
spring.mvc.contentnegotiation.favor-parameter=true - 指定内容协商时使用的参数名,默认为format
- 在application.propertise中添加以下内容:

- 开启基于请求参数的内容协商功能,默认参数名为format
-
验证:
- 在浏览器中访问
http://localhost:8080/person?format=xml
- 在浏览器中访问
http://localhost:8080/person?type=json
- 在浏览器中访问
上一篇:SpringBoot3-Web开发-06-路径匹配规则
下一篇:SpringBoot-Web开发-08-内容协商原理-HttpMessageConverter(上)
更多推荐



所有评论(0)