关于springboot:Spring-ContentNegotiation内容协商之使用篇一

2 篇文章 0 订阅
1 篇文章 0 订阅
原文转载
https://lequ7.com/guan-yu-springbootspringcontentnegotiation-nei-rong-xie-shang-zhi-shi-yong-pian-yi.html

背景

随着业务零碎的成熟,如果你的我的项目正好是公司的中台策略之一,然而上游零碎的接管形式不对立,这一种状况在一些老的公司零碎架构总经常出现,如果上游零碎不不便兼容,那么就须要中台零碎对外提供各种不同格局返回报文

内容协商

简略说就是服务提供方依据客户端所反对的格局来返回对应的报文,在 Spring 中,REST API 基本上都是以 json 格局进行返回,而如果须要一个接口即反对 json,又反对其余格局,开发和保护多套代码显然是不合理的,而 Spring 又恰好提供了该性能,那便是ContentNegotiation

在 Spring 中,决定一个数据是以 json、xml 还是 html 的形式返回有三种形式,别离如下:

1:favorPathExtension 后缀模式,例如:xxx.json,xxx.xml
2:favorParameter format模式,例如:xxx?format=json,xxx?format=xml,
3:通过申请的 Accept 来决定返回的值

在这三种模式中,后面两种模式都是敞开,如果须要关上,能够通过以下形式来开启

  • 1:重写 WebMvcConfigurer(Spring5.X当前举荐的实现类) 的 configureContentNegotiation 来设置为 true 即可
  • 2:设置 spring.mvc.contentnegotiation.favor-path-extension=true 或者 pring.mvc.contentnegotiation.favor-parameter=true
tips:如果是应用 Spring2.X以上的版本,不要开启 @EnableWebMvc 注解,否则会导致你的配置有效,如果须要开启该注解,则只能应用办法一重写 WebMvcConfigurer 了

三种模式

1:favorPathExtension 后缀模式

server:
  port: 8081
spring:
  mvc:
    contentnegotiation:
      favor-path-extension: true
      media-types:
        json: application/json

favor-path-extension 示意是否开启后缀匹配,media-types 示意后缀以何种形式进行解析,在这里须要留神一下肯定是须要有对应的 HttpMessageConvert 能力解析,否则是会提醒 406 Could not find acceptable representation

在 Spring 中曾经默认含有json解析的 HttpMessageConvert,所以是能够间接解析的,如果须要反对解析 xml,能够引入 xml 包
<dependency>
    <groupId>com.fasterxml.jackson.dataformat</groupId>
    <artifactId>jackson-dataformat-xml</artifactId>
</dependency>

当开启了后缀模式当前,返回的文本类型会依据你的入参做不同的解决,.json 会返回 json 格局的数据,.xml 会返回 xml 格局的数据,当然也能够自定义一个 HttpMessageConverter 来自定义的返回文本格式

GET localhost:8081/controller/advice/decrypt.json

{
    "name": "a",
    "age": 1,
    "date": null
}

GET localhost:8081/controller/advice/decrypt.xml

<Advice>
    <name>a</name>
    <age>1</age>
    <date/>
</Advice>

2:favorParameter

这种模式下是通过在 url 中通过一个参数来辨别如何解析的,spring中曾经默认这个关键字是 format

批改配置文件如下:

server:
  port: 8081
spring:
  mvc:
    contentnegotiation:
      favor-parameter: true
GET localhost:8081/controller/advice/decrypt?format=json

{
    "name": "a",
    "age": 1,
    "date": null
}

GET localhost:8081/controller/advice/decrypt?format=xml

<Advice>
    <name>a</name>
    <age>1</age>
    <date/>
</Advice>

当然也能够本人批改 parameter 的关键字,只须要在配置文件中调整下即可

parameter-name: meida_type

此时再次申请的时候 parameter 就须要调整为 meida_type,否则就会以默认的形式去解析返回的文本信息

Accept解析

这种就是默认的一种解析形式,无需进行任何配置,Spring 就是默认以这种模式进行解析的
GET申请

XML申请

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值