• 【springboot】12、内容协商


    基本介绍

    根据客户端接收能力不同,SpringBoot 返回不同媒体类型的数据。
    例如: 客户端 Http 请求头 Accept: 为application/xml 则返回 xml 数据,客户端 Http 请求头为Accept: application/json 则返回 json 数据

    应用实例

    环境准备

    我们先创建一个简单的springboot架子,引入关于xml的依赖,后面会用到

            <dependency>
                <groupId>com.fasterxml.jackson.dataformatgroupId>
                <artifactId>jackson-dataformat-xmlartifactId>
            dependency>
    
    • 1
    • 2
    • 3
    • 4

    然后创建一个People类

    	@Data
    	@NoArgsConstructor
    	@AllArgsConstructor
    	public class People {
    	    private Integer id;
    	    private String name;
    	    private String gender;
    	}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    然后创建一个Controller

    	@RestController
    	public class ContentController {
    	
    	    @RequestMapping("/test")
    	    public People people() {
    	        return new People(1, "千束", "女");
    	    }
    	}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    可以看见,上面的/test请求就会返回一个people,我们来请求一下

    postman请求

    我们使用postman请求该地址,返回的是json数据
    在这里插入图片描述

    网页请求

    我们使用网页请求,返回的是xml的数据
    在这里插入图片描述

    原因

    对于上面相同的请求返回结果不同,原因就是他们的Accept不同
    在这里插入图片描述
    在这里插入图片描述

    可以发现,postman的Accept是*/,也就是支持所有的相应格式,而游览器是text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,/;q=0.8,application/signed-exchange;v=b3;q=0.9,这个是有优先级的,q代表权重,可以发现xml在前面,所以我们的springboot就会优先返回xml的格式数据。
    我们Debug下源码,在AbstractJackson2HttpMessageConverter类中的writeInternal方法中,可以通过Accept的不同,设置相应的Content-Type
    在这里插入图片描述
    我们通过postman请求,Accept是
    /*,对应的Content-Type就是application/json

    在这里插入图片描述

    我们通过游览器请求,Accept是text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,/;q=0.8,application/signed-exchange;v=b3;q=0.9,对应的Content-Type就是application/xhtml+xml
    在这里插入图片描述

    开启基于请求参数的内容协商功能

    我们知道了可以通过控制请求的Accept来改变返回的格式,但是在poatman中可以设置Accept,在网页中却不能设置,这该怎么办呢?
    很简单,我们只需要在配置文件中开启基于请求参数的内容协商功能
    在这里插入图片描述
    这样开启后,我们只需要在请求时带上format参数即可,format就是我们想要的返回格式,下面我们使用网页来进行测试,我们知道默认是返回xml,我们使用format指定json,看是否有效
    在这里插入图片描述
    可以发现,已经可以实现指定返回格式了。我们还可以自定义参数的名称,也就是不通过format指定,而是自己指定一个名称,例如我想叫做type,我们通过配置文件进行设置即可

    在这里插入图片描述

    再次请求,format已经失效了

    在这里插入图片描述

    使用type进行指定,没有问题

    在这里插入图片描述

  • 相关阅读:
    java基于springboot智能停车场车位管理系统附源码风格
    教教大家Win10怎么看处理器是几核
    自动驾驶与人工驾驶并存,自动驾驶取代人工驾驶
    CentOS 6.6系统怎么安装?CentOS Linux系统安装配置图解教程
    计控实验(三)——最少拍控制器
    VUE3照本宣科——响应式与生命周期钩子
    三防加固平板电脑能在恶劣的工业环境中依然正常运作
    Spark系列之Spark概述
    MySQL 5.7限制general_log日志大小
    深入OpenCV Android应用开发
  • 原文地址:https://blog.csdn.net/m0_51545690/article/details/127686532