首页 > 其他分享 >SpringBoot - 内容协商机制

SpringBoot - 内容协商机制

时间:2022-12-29 17:23:17浏览次数:34  
标签:xml SpringBoot 自定义 协商 MediaType Override 机制 public

1.内容协商机制

根据客户端接收能力不同,SpringBoot 返回不同媒体类型的数据

比如: 客户端 Http 请求 Accept: application/xml 则返回 xml 数据,客户端 Http 请求 Accept: application/json 则返回 json 数据

SpringBoot 默认支持返回Json数据,默认不支持返回xml数据,所以需要导入jackson-dataformat-xml 让SpringBoot支持返回xml数据

        <!-- 引入支持返回 xml 数据格式 -->
        <dependency>
            <groupId>com.fasterxml.jackson.dataformat</groupId>
            <artifactId>jackson-dataformat-xml</artifactId>
        </dependency>

如果客户端请求头的 Accept为application/xml 则返回 xml 数据,客户端 Http 请求 Accept为application/json 则返回 json 数据

@RestController
public class HmcController {
    @RequestMapping("param")
    public ReUser param(){
        return new ReUser("Levi 张三",18);
    }
}

 

2.基于请求参数的内容协商

为什么会出现基于请求参数的内容协商,因为游览器无法更改请求头中的Accept参数,所以我们可以通过设置请求参数

来获取我们想要服务器返回的参数类型

spring:
  mvc:
    contentnegotiation:
      favor-parameter: true #开启请求参数内容协商模式 

获取Json格式数据:http://localhost:8082/param?format=json

获取Xml格式数据:http://localhost:8082/param?format=xml

 

3.自定义内容协商

自定义协商器

public class MyHttpMessageConverter implements HttpMessageConverter<ReUser> {
    //默认字符
    private static final Charset DEFAULT_CHARSET=Charset.forName("UTF-8");

    //是否可读
    @Override
    public boolean canRead(Class<?> clazz, MediaType mediaType) {
        return false;
    }

    //是否可写
    @Override
    public boolean canWrite(Class<?> clazz, MediaType mediaType) {
        return clazz.isAssignableFrom(ReUser.class);
    }

    //支持的类型
    @Override
    public List<MediaType> getSupportedMediaTypes() {
        return MediaType.parseMediaTypes("application/type-x");
    }

    //读 处理
    @Override
    public ReUser read(Class<? extends ReUser> clazz, HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException {
        return null;
    }

    //写 处理
    @Override
    public void write(ReUser reUser, MediaType contentType, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException {
        //设置为自定义格式
        String data=reUser.getName()+"-"+reUser.getAge();
        //写出去
        StreamUtils.copy(data,DEFAULT_CHARSET,outputMessage.getBody());
    }
}

配置自定义协商器

@Configuration
public class MyConfiguration implements WebMvcConfigurer {
    @Override
    public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
        //设置支持返回的类型
        Map<String, MediaType> mediaTypes = new HashMap<>();
        mediaTypes.put("json",MediaType.APPLICATION_JSON);
        mediaTypes.put("xml",MediaType.APPLICATION_XML);
        mediaTypes.put("type-x",MediaType.parseMediaType("application/type-x"));
        //指定支持解析哪些参数对应的哪些媒体类型
        ParameterContentNegotiationStrategy parameterStrategy = new ParameterContentNegotiationStrategy(mediaTypes);
        HeaderContentNegotiationStrategy headerStrategy = new HeaderContentNegotiationStrategy();
        configurer.strategies(Arrays.asList(parameterStrategy,headerStrategy));
    }

    @Override
    public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
        //添加自定义的内容协商
        converters.add(new MyHttpMessageConverter());
        //添加自定义的内容协商 设置优先级
        //converters.add(0,new MyHttpMessageConverter());
    }
}

 

标签:xml,SpringBoot,自定义,协商,MediaType,Override,机制,public
From: https://www.cnblogs.com/ErenYeager/p/17013042.html

相关文章

  • SpringBoot 的属性配置文件
    0、概述本文内容会解答下面几个问题:1、SpringBoot默认配置文件的名称是什么?配置文件默认存放位置是什么?2、如何指定配置文件名称?如何指定配置文件存放位置?3、如何使用pro......
  • Q1 SpringBoot启动类如何作为配置类注册进Spring容器的?(ok)
    @SpringBootApplicationpublicclassHelloSpringBoot{publicstaticvoidmain(String[]args){SpringApplication.run(HelloSpringBoot.class,args);}}......
  • SpringBoot+MongoDB实现一个物流订单系统
    码字不易,点赞收藏,养成习惯!原创作者公众号:​​bigsai​​​,回复bigsai领取5G的PDF学习资源!共同进步。更多精彩期待与您分享!项目收录在​​​github​​​的​​MongoDB案例......
  • 类加载机制与反射
    类的加载、连接和初始化系统可能在第一次使用某个类时加载该类,也可能采用预加载机制来加载某个类.1JVM和类当调用java程序运行某个java程序时,该命令将会启动一......
  • springboot mail 发送163邮件基础配置操作
    #发送邮件配置spring.mail.protocol=smtps#配置smtp服务器地址spring.mail.host=smtp.163.com#服务器的端口spring.mail.port=465#配置邮箱用户名spring.mail......
  • Attention:何为注意力机制?
    ​ 本文来自公众号“AI大道理” 人类利用有限的注意力资源从大量信息中快速筛选出高价值信息,这是人类在长期进化中形成的一种生存机制,人类视觉注意力机制极大地提高了......
  • Springboot解锁部分跨域安全机制
    目录跨域定义为什么出现跨域流程解决方法方法一未解决办法全局配置过滤器拦截器使用环境跨域定义跨域是指在域名,端口,协议,三种任意一种不同,都会算作不同域,当想要访问的时......
  • springboot学习笔记整理
    springboot学习笔记整理目录​​1.1、SpringBoot简介​​​​1.2、系统要求:​​​​二、快速入门​​​​2.1、创建一个Maven工程​​​​2.2、pom文件引入依赖​​​​2.3......
  • SpringBoot系列之数据库初始化-datasource配置方式
    【DB系列】数据库初始化-datasource配置方式|一灰灰Blog在我们的日常业务开发过程中,如果有db的相关操作,通常我们是直接建立好对应的库表结构,并初始化对应的数据,即更......
  • springboot整合Jackson
    springboot整合JacksonJackson简介Jackson是一套适合java的数据处理工具,用于JSON格式数据的解析与生成,支持多种类型,是SpringMVC内置解析器。除了Jackson,常用的JSON解......