SpringMVC中的@RequestBody

2019-04-01  本文已影响0人  leibnist

记一次用postman测试接口的傻逼历程

首先来看看docs.spring.io@RequestBody的定义:

Annotation indicating a method parameter should be bound to the body of the web request. The body of the request is passed through an HttpMessageConverter to resolve the method argument depending on the content type of the request.

这里其实只是说明了,加入这个注解后,就是使用HttpMessageConverter来依据Content-Type的类型来对输入进行解析,但是对这个注解的使用场景并未做太多介绍。查看了官方文档,也没有看到使用场景的介绍。虽然Spring的官方文档一直被人称道,我终于也发现自己目前还是不是很适合看这种文档,原因在于,官方文档虽然介绍了使用方法,但是对场景的使用却没有太多的介绍,或许有经验的人能够举一反三,但是目前来看,我还做不到啊。
后来查看了@RequestParam @RequestBody @PathVariable 等参数绑定注解详解,终于大概有了些了解。原文讲解@RequestBody时是这么说的:

该注解常用来处理Content-Type: 不是application/x-www-form-urlencoded编码的内容,例如application/json, application/xml等;
它是通过使用HandlerAdapter 配置的HttpMessageConverters来解析post data body,然后绑定到相应的bean上的。
因为配置有FormHttpMessageConverter,所以也可以用来处理 application/x-www-form-urlencoded的内容,处理完的结果放在一个MultiValueMap<String, String>里,这种情况在某些特殊需求下使用,详情查看FormHttpMessageConverter api;

其实也很好理解:平常开发的web应用,可能是通过ajax发送的请求,这些表单的请求的Content-Type一般都是application/x-www-form-urlencoded,因此在解析时其实是很容易的,SpringMVC的Controller方法中,添加一个POJO即可完成解析,这样做是非常方便开发的,不用开发人员来对数据进行获取、转换,直接可以通过POJO来访问。而现在一般REST接口时,可能请求和返回都是application/json格式的,此时,@RequestBody就派上用场了。

傻逼历程

其实也就是测试一下api,controller都已经写好了,函数有加上@RequestBody的注解,body当然时json格式的。然而通过postman去测试时,接口死活都是返回404,url检查了很多遍,没有问题。后来偶然发现,去掉@RequestBody时接口能够测通,经过查询,终于知道了@RequestBody的用途,也大概明白了,为什么会404了,原因就在于没有指明Content-Type是application/json。
嗯,相当简单而有基础的问题,却总是让我花费半天的时间,总的来说,真的是练习的太少了。

上一篇下一篇

猜你喜欢

热点阅读