设为首页 加入收藏

TOP

day08-自定义转换器&处理JSON&内容协商(三)
2023-07-25 21:36:56 】 浏览:60
Tags:day08- 处理 JSON& 容协商
= var26; throw var26; } finally { if (generator != null) { if (var10 != null) { try { generator.close(); } catch (Throwable var25) { var10.addSuppressed(var25); } } else { generator.close(); } } } } catch (InvalidDefinitionException var28) { throw new HttpMessageConversionException("Type definition error: " + var28.getType(), var28); } catch (JsonProcessingException var29) { throw new HttpMessageNotWritableException("Could not write JSON: " + var29.getOriginalMessage(), var29); } }

3.内容协商

3.1基本说明

内容协商:服务端和请求端协商决定最终返回什么格式的内容。客户端发送请求的时候可以告知服务器,自己希望对方返回的数据格式列表,而服务器的接口也有能支持响应的格式列表,最终返回的结果会根据这两个类型列表,找到一种两边都能支持的类型返回,如果找不到合适的类型,则报错。

简单来说就是:根据客户端接收能力不同,SpringBoot 返回不同媒体类型的数据

比如:

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

例子1:使用postman测试

(1)使用postman发送Http请求,在此期间服务器的代码不变,根据请求头不同,返回的数据格式也会不同

返回json格式:

image-20230320170031966

返回xml格式:

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

<!--引入处理xml的依赖-->
<dependency>
    <groupId>com.fasterxml.jackson.dataformat</groupId>
    <artifactId>jackson-dataformat-xml</artifactId>
</dependency>
image-20230320170806738

例子2:使用浏览器测试

浏览器不能指定Accept属性,我们在浏览器发出请求,发现返回的数据为xml格式:

image-20230320174140503

这是因为浏览器的Accept中指定了多种媒体类型,如下:

  1. 支持接收html,xhtml+xml,xml格式类型的权重为0.9
  2. 支持接收image和 */* [所有类型] 格式的权重为0.8
  3. 所以服务器会优先返回xhtml+xml格式
image-20230320174118166

3.2问题

如上,客户端通过Http请求的Accept来指定能接收的媒体类型。那么服务端的接口是怎么响应这个类型的呢?

内容协商原理

内容协商原理:

  1. 判断当前响应头中是否已经有确定的媒体类型
  2. 获取客户端Accept请求头字段
  3. 遍历循环所有当前系统的 MessageConverter,看谁支持操作这个对象
  4. 找到支持操作当前操作对象的converter,把converter支持的媒体类型统计出来
  5. 进行内容协商得到最佳匹配媒体类型

3.3注意事项

Postman可以通过修改Accept的值来返回不同的数据格式。对于浏览器来说,我们无法修改其Accept的值,这时如果要指定返回json格式,怎么办呢?

解决方案:开启支持基于请求参数的内容协商功能

(1)修改application.yml

spring:
  mvc:
    contentnegotiation:
      favor-parameter: true #开启基于请求参数的内容协商,默认不开启

(2)在浏览器请求的时候带上format参数,此时返回的就是指定的格式了

image-20230320180554415

注意:参数format的值是规定好的,在开启请求参数的内容协商功能后,SpringBoot底层ParameterContentNegotiationStrategy会通过format来接收参数,然后返回对应的媒体类型/数据格式,因此format的值也要是SpringBoot能处理的才行。

image-20230320181020880

当然format这个属性名本身也可以通过配置文件修改:

image-20230320181415810 image-20230320181601135
首页 上一页 1 2 3 下一页 尾页 3/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Nginx rewrite 详解 下一篇剑指 Offer 07. 重建二叉树(java..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目