生活资讯
requestbody的简单介绍
2023-04-07 01:40  浏览:46

@RequestBody注解原理

从源码中可以看到,@RequestBody 用在方法参数上面,用来将请求参数绑定到request body中,通过 HttpMessageConverter 封装为具体的JavaBean。通俗点讲就是你在一个参数上加上该注解,spring就会将request body中的json/xml对象解析成该参数类型的Javabean对象。

作为RESTful开发中经常用到的注解,研究其原理有利于我们更好地理解并掌握它。

那么spring是如何做到这一点的呢?先来看DispatcherServlet。

作为springMVC处理请求的中央调度器,DispatcherServlet本身是一个servlet,所以我们看doService():

重点在doDispatch()方法,该方法先找到会找到合适的handler来处理当前请求:

HandlerAdapter是一个接口,具体处理方法在 RequestMappingHandlerAdapter 类中:

这里又调用了handleInternal()方法,RequestMappingHandlerAdapter重写了该方法:

进入该方法,

可以看到最终调用的都是invokeHandlerMethod()方法,此方法会处理@RequestMapping修饰的请求

进入该方法的 invocableMethod.invokeAndHandle(webRequest, mavContainer); ,来到ServletInvocableHandlerMethod,此类继承了InvocableHandlerMethod,可以处理请求的返回值。invokeAndHandle()方法:

重点在 Object returnValue = invokeForRequest(webRequest, mavContainer, providedArgs); ,通过请求调用并产生返回值。

getMethodArgumentValues() 方法的作用是获取方法参数,重点就在这里,

进入resolveArgument()方法,

@RequestBody修饰的参数会使用RequestResponseBodyMethodProcessor解析,

进入readWithMessageConverters()方法一路顺藤摸瓜,来到AbstractMessageConverterMethodArgumentResolver的readWithMessageConverters(),

可以看到使用文章开头提到的HttpMessageConverter解析参数并返回,而此处的HttpMessageConverter是在RequestMappingHandlerAdapter中设置解析器的时候添加到每个解析器中的。而json格式的数据使用AbstractJackson2HttpMessageConverter进行解析,内部使用jackson进行json数据的解析。

请求由DispatcherServlet处理,找到相应的HandlerAdapter进行处理,RequestMappingHandlerAdapter会处理@RequestMapping注解的请求,设置一系列参数解析器进行解析,如果参数使用@RequestBody注解,则使用RequestResponseBodyMethodProcessor进行解析,此参数解析器用HttpMessageConverter将HttpMessage封装为具体的JavaBean对象,json格式的数据使用AbstractJackson2HttpMessageConverter进行解析,内部使用jackson进行json数据的解析。

requestbody和modelattribute的区别

他们的区别在于:

request body指的是请求主体;求体。

model attribute指的是模型属性值。

例句辨析:

request body

1、The vocabulary for the request body is specified by the server.

请求体的词汇表由服务器指定。

2、Listing 1 shows a message handler that reads the request body while the request is being sent.

清单1显示了一个消息处理程序,用于在发送请求时读取请求主体。

3、Now, Agavi can ***tomatically read and convert a URL-encoded request body intoindividual request parameters.

现在,Agavi可以自动读取URL编码的请求主体并将之转换为单个请求参数。

model attribute

1、Collections are characterized by a model attribute defining the type of models composing the collection.

集合具有一个模型属性的特性,定义了组成该集合的模型类型。

2、To improve performance, you m*** wish to factor out the code for each model attribute into its own method ( or a single method with a "switch").

为了提高性能,您可能希望抽取每个模型属性的代码放到它自己的方法中(或者带有“开关”的单个方法)。

3、As a process model attribute, this openness is a critical factor bec***se it allows seamless integration, which is a great advantage when communicating changeprocesses and process improvement.

作为一个过程模型属性,这种公开性是一个关键因素,因为它导致无缝集成,当通讯改变过程或过程改进发生时,无缝集成是一个重要优势。

@RequestBody的加与不加的区别

做个笔记,摘自:

目的:备份贴,原作即使删除依然可见自己的笔记。

如有版权问题,请联系我删除。

简单来说 @RequestBody 主要用于处理 json格式数据,如:ajax设置了Content-type为:application/json

ajax表单提交的话就不需要加了,加了格式不一致会报错。表单提交的Content-type为:application/x-www-form-urlencoded

如下:

controller中 参数前面就不需要加了

原因:

表单 格式使用的是默认的ContentType类型application/x-www-form-urlencoded,格式为key1=value1key2=value2提交到后台 ,不需要加@requestBody。

使用@requestBody.当请求content_type为:application/json类型的请求,数据类型为json时, json格式如下:{“aaa”:“111”,“***b”:“222”}

表单格式和json格式 转换后的数据格式不一样的。

作者原文写的非常好了:

requestbody的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于、requestbody的信息别忘了在本站进行查找喔。

发表评论
0评