SpringMVC——响应处理(2)之内容协商

1 内容协商概念

根据客户端接收能力的不同,服务端返回不同的媒体类型的数据。这是由HTTP协议定的。

Accept 首部字段可通知服务器,用户代理能够处理的媒体类型及媒体类型的相对优先级。可使用 type/subtype 这种形式,一次指定多种媒体类型。

如文本文件 text/html,支持text和html两种内容格式

若想要给显示的媒体类型增加优先级,则使用 q= 来额外表示权重值1,用分号(;)进行分隔。权重值 q 的范围是 0~1(可精确到小数点
后 3 位),且 1 为最大值。不指定权重 q 值时,默认权重为 q=1.0。
在这里插入图片描述

当服务器提供多种内容时,将会首先返回权重值最高的媒体类型。

所以不同的客户端向服务器发送不同的请求头信息,那么返回的内容也不一样。

在Http协议中最常用Accept首部字段的请求值不同来决定客户端返回的媒体内容类型

2 SpringMVC中的内容协商原理

  • 判断客户端支持的内容媒体类型
    • 关键组件ContentNegotiationManager 内容协商管理器,根据支持的协议方法来获得客户端支持的媒体类型
    • 默认采用的HeaderContentNegotiationStrategy 基于请求头的策略,获取客户端中的Accept请求头中的信息
  • 获得服务器端支持的媒体类型
    • 遍历当前系统的所有消息转换器HttpMessageConverter,找到支持处理返回结果Class类型的消息处理器,将这些消息转换器支持的媒体类型加总
  • 进行内容协商的最佳媒体类型的匹配(客户端支持的媒体类型和服务端支持的媒体内容进行匹配)
  • 再次遍历所有的消息转换器,根据响应的最合适的媒体类型MediaType获得合适的消息转换器
  • 消息转换器向Response中输出数据

3 内容协商策略

策略名字策略原理实现类示例
请求头策略获得客户端发送请求中的Accept请求字段信息(默认使用的)HeaderContentNegotiationStrategyAccept:application/xml
固定参数策略读取固定参数format中的内容(默认是关闭的,可以配置spring.mvc.contentnegotiation.parameter-name=true)ParameterContentNegotiationStrategylocalhost:8080/getUser?format=json
扩展名策略开启拓展名的内容协商策略spring.mvc.contentnegotiation.favor-path-extension=true,根据扩展名部分判断请求的MediaTypeServletPathExtensionContentNegotiationStrategylocalhost:8080/getUser.json localhost:8080/getUser.xml
固定媒体类型策略返回指定的媒体类型,通常可在映射路径的注解定义produces属性信息FixedContentNegotiationStrategy@GetMapping(value = “/getUser1”,produces = MediaType.APPLICATION_JSON_UTF8_VALUE)

1: 内容协商策略是由优先级的 后缀 > 请求参数 > HTTP首部Accept

2: 使用produces属性时, 需要说明的是,这里指定的类型不能和后缀、请求参数、Accept冲突。比如这里指定了json格式,那么后缀如果不是json,或者format不是json,或者Accept不是application/json、/,将无法完成内容协商,http status code为406。

4 内容协商测试

设置服务器可以支持json 和xml 格式

4.1 引入依赖
 <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.4.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
  </dependencies>
<!--web starter中默认含有将对象转为json的jar jackson-databind.jar-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

<!--对象转换成xml形式-->
        <dependency>
            <groupId>com.fasterxml.jackson.dataformat</groupId>
            <artifactId>jackson-dataformat-xml</artifactId>
            <version>2.11.3</version>
        </dependency>
    </dependencies>
4.2 application.properties配置
# 开启支持固定参数的内容协商策略
spring.mvc.contentnegotiation.favor-parameter=true
# 开启支持servlet.path 后缀的内容协商策略
spring.mvc.contentnegotiation.favor-path-extension=true
# 支持使用后缀映射 /a 等价于 mapping 到 /a.*
spring.mvc.pathmatch.useSuffixPattern=true

经查,在不同的版本中后缀的内容协商是默认开启的,当前使用的spring-boot2.1.4.RELEASE是不支持的,所以需要手动开启,设置spring.mvc.contentnegotiation.favor-path-extension=true。同时在不支持后缀映射的前提下,需要开启spring.mvc.pathmatch.useSuffixPattern=true,否则会找不到处理请求的handler,页面404报错。
若支持后缀的内容协商策略,可不设置后两项

4.2 4种内容协商策略测试
@RestController
public class NegotiationController {

    @GetMapping("/getUser")
    public User getUser(){
        return new User("lyf",18,"it-api@mail.xxxx.com");
    }

}

4.2.1 A c c e p t 测试 \textcolor{red}{4.2.1 Accept 测试} 4.2.1Accept测试
在这里插入图片描述

在这里插入图片描述

通过请求设置Accept 字段的不同 ,客户端返回不同的媒体数据类型

4.2.2 固定参数测试 \textcolor{red}{4.2.2 固定参数测试} 4.2.2固定参数测试

在这里插入图片描述
在这里插入图片描述

4.2.3 拓展名测试 \textcolor{red}{4.2.3 拓展名 测试} 4.2.3拓展名测试
在这里插入图片描述

在这里插入图片描述

4.2.4 固定媒体类型测试 \textcolor{red}{4.2.4 固定媒体类型 测试} 4.2.4固定媒体类型测试

测试controller

   @GetMapping(value = "/getUser1",produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
    public User getUser1(String format, HttpServletRequest request){
        return new User("lyf",18,"it-api@mail.xxxx.com");
    }

正常访问
在这里插入图片描述

非正常访问
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SpringMVC是一个用于构建Web应用程序的Java框架。在SpringMVC中,处理请求和响应是通过使用控制器方法来实现的。控制器方法使用@RequestMapping注解来映射请求的URL,并通过方法参数来获取请求参数和响应对象。 在处理请求时,可以使用@RequestParam注解来获取请求参数的值。例如,可以在方法参数上使用@RequestParam注解来获取请求中的特定参数值。另外,也可以使用@PathVariable注解来获取URL中的路径参数。 在处理响应时,可以使用@ResponseBody注解将方法的返回值直接写入HTTP响应体中,而不是进行视图跳转。这样可以直接返回字符串、JSON格式的数据或其他类型的数据。 另外,在SpringMVC中,还有一些核心组件,如处理器映射器、处理器适配器和视图解析器。处理器映射器负责将请求映射到相应的控制器方法,处理器适配器负责将请求参数绑定到方法参数,并调用相应的控制器方法,视图解析器负责将方法的返回值解析为视图。 总结起来,SpringMVC通过控制器方法、注解和核心组件来处理请求和响应,使得开发者可以方便地构建Web应用程序。\[1\]\[2\]\[3\] #### 引用[.reference_title] - *1* *3* [springMVC的请求和响应](https://blog.csdn.net/weixin_38088097/article/details/105840310)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [SpringMVC的请求和响应](https://blog.csdn.net/weixin_51146329/article/details/123166475)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值