概念
HttpMessageConverter
主要功能在于Java对象和Json Xml等Http消息格式之前的来回转换. 来看HttpMessageConverter在Spring中如何使与Http的通信变更更优雅
首先启用SpringMvc会自动注册一箩筐HttpMessageConverter
默认,有如下组件被注册:
每个具体的HttpMessageConverter都实际关联了一个或几个媒体类型( MIMEType
)
Http协议
说到http协议,在这里需要提下Http协议头中的几个 header
Accept
表示当前http请求希望返回的数据格式,或者说支持的数据格式(我想要什么格式)
Content-type
表示当前请求中的数据是什么格式(我给的是什么格式) 当请求发送到SpringMvc的服务端时,恰恰是利用了Http协议的这一约定来进行逻辑处理
处理逻辑
一个请求到SpringMvc的Controller时,Spring会利用Content-Type来判断使用哪个HttpMessageConverter来读取并转成Java Object 当请求处理完成时,如果是用 @ResponseBody
标注的Controller方法,Spring会通过当前http request头中的Accept来判断使用哪个HttpMessageConverter来转换并回写数据到Http reponse的body中
从http请求中读取消息
@RequestBody
用于 Controller
方法中的参数前时,表示需要将Http请求中的body转成当前的Java实体对象,如何转,是利用上面提到的http协议头中的 Content-Type ,找到恰当的HttpMessageConverter,完成转换.
假如这样请求:
当Spring发现请求头是 application/json
,它会通过某种规则( ContentNegotation
)来找到 MappingJackson2HttpMessageConverter
从而把Http请求的body转成 Book对象
向Http响应中回写消息
@ResponseBody
用于Controller方法时,表示需要SpringMvc把方法的返回值序列化后回写到http response的body中,当然也是利用 Http request中的Accept,请求想要什么就给它什么格式
发一个带Accept的请求
会得到如下结果:
上面大致说的是HttpMessageConverter在SpringMvc server-side的作用,此外在 RestTemplate
中也同样有使用. 更多RestTemplate介绍可以翻看之前的一篇文章RestTemplate
获取数据
作为Client端,想要得到什么格式的原始数据,只要设置好Http Accept header就好.
发送数据
在发送数据的时候,也较简单,只要传入Java Ojbect 把想要发送的数据格式设置到 Http header Content-Type中就可以.
关于HttpMessageConverter的表现形式,大概就是这样,总体来说,设计理念符合Spring的一贯做法,屏蔽了http通信当中的各种格式转换细节,在Spring中,我们只需要直接跟Java Object打交道就好了,至于Http请求在进来之前是什么格式,想要什么格式,对于业务逻辑来讲,不需要关心这些细节. 当然,要让这一切完美无误的执行,不管是服务端还是客户端,都需要准确的设置Http消息的Accept和Content-Type.不按这个规则来,往往得不到期望的结果.然而我并不认为这损害了应用的容错性,恰恰相反,每一个发出的http请求,都要准确的设置各种协议头,这是必要的,也是对Http协议规范遵守,毕竟,那些Accept是text/html而又期望得到json格式的http请求,终归是没办法好好玩的.
本篇大体介绍了如何使用,下篇着重说下HttpMessageConverter在底层代码是如何工作的.
Thx all
SpringAutowired
一个有用的公众号
长按,识别二维码,加关注
原文
https://mp.weixin.qq.com/s/BhpFpJ2M4F2WUxevhMsw4w
本站部分文章源于互联网,本着传播知识、有益学习和研究的目的进行的转载,为网友免费提供。如有著作权人或出版方提出异议,本站将立即删除。如果您对文章转载有任何疑问请告之我们,以便我们及时纠正。PS:推荐一个微信公众号: askHarries 或者qq群:474807195,里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多

转载请注明原文出处:Harries Blog™ » Spring 中 HttpMessageConveter 概念