43

Spring 中 HttpMessageConveter 概念

 6 years ago
source link: https://mp.weixin.qq.com/s/BhpFpJ2M4F2WUxevhMsw4w?amp%3Butm_medium=referral
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

JzU3Mvy.jpg!web

概念

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

一个有用的公众号

Qjma6rB.jpg!web

长按,识别二维码,加关注


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK