上一篇: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多端内容适配
  1. 基于请求头内容协商(默认开启)
  • 客户端服务端 发送请求时,携带HTTP标准的Accept请求头。
    • 客户端:外界应用
    • 服务端:接口
    • accept:是http协议里规定的一个标准
  • 客户端服务端 发送请求时,带上Accept,让 服务端 知道该返回什么类型的数据,SpringBoot 就把数据自动格式化成对应类型,再返回。
    • 举例
      • Accept:application/json
      • Accept:text\xml
      • Accept:text\yaml
  1. 基于请求参数内容协商(需要手动开启)
  • 举例
    • ?format=json:
      • 发送请求: GET /projects/spring-boot?format=json
      • 匹配:匹配到 GetMapping("/projects/spring-boot")
      • 返回:根据参数协商,优先返回json类型数据
    • 同理,发送请求 GET /projects/spring-boot?format=xml,则优先返回xml类型数据

b.演示验证

  1. 创建一个接口,其内容如下:
    • 先绑定地址:@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传输。
在这里插入图片描述

  1. 启动项目,在浏览器中验证:

    • 浏览器中访问:http://localhost:8080/person
    • 发现数据的类型为json,如下图所示:在这里插入图片描述
  2. 思考:要想让数据适配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{(省略……)}
        
    • 开启基于请求参数的内容协商(默认关闭)
      • 开启基于请求参数的内容协商功能,默认参数名为format
        spring.mvc.contentnegotiation.favor-parameter=true
        
      • 指定内容协商时使用的参数名,默认为format
      • 在application.propertise中添加以下内容:
        在这里插入图片描述
  3. 验证:

    • 在浏览器中访问http://localhost:8080/person?format=xml
      在这里插入图片描述
    • 在浏览器中访问http://localhost:8080/person?type=json在这里插入图片描述

上一篇:SpringBoot3-Web开发-06-路径匹配规则
下一篇:SpringBoot-Web开发-08-内容协商原理-HttpMessageConverter(上)

更多推荐