关于spring mvc中的@RequestBody和@RequestParam到底有什么用

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq32933432/article/details/88840258

缘起

在此之前,我一直搞不清楚@RequestBody和@RequestParam到底有什么作用,在很多时候我发现即使我在controller中设置@RequestBody和@RequestParam或者不设置这些,依然能够接收到请求参数,但在某些情况下他们又行不通。所以本文旨在深入讲解我们到底在什么情况下使用@RequestBody和@RequestParam,什么情况下不能使用@RequestBody和@RequestParam

关于http

在说上面问题之前,你需要了解HTTP的基本信息。用户的浏览器访问网站以及我们通过ajax请求的时候都是HTTP请求。http分为请求头和请求体,在http请求头里面有个参数叫Content-Type
Content-Type有三种取值情况

  1. application/json
  2. application/x-www-form-urlencoded
  3. multipart/form-data

关于这三种情况的详细解释可以参考我的另一篇文章
关于HTTP的其他参数的详细解释也可以参考我的另一篇文章

如果你只是要了解spring mvc中的@RequestBody和@RequestParam到底怎么用,那么你无需详细看我们的那两篇文章,看本文就可以

关于Content-Type与@RequestBody的故事

content-type实际上是代表了你要给服务器发送的数据格式是什么

application/json

比如的你的content-type为application/json。那么你给后台的请求就必须是一个json数据,你的数据可能类似于

{
    "name": "张三",
    "age": "22"
}

而这种情况你的方法接收地方如果想用JavaBean接收必须使用@RequestBody。否则你将无法接收数据。同时你可能需要在你的spring mvc中配置json解析器。但一般情况下你公司的大牛已经帮你配置好,你无需配置。你的controller类似如下这样

public Result updateAuditComment(@RequestBody TestDTO test) {
}

其中TestDTO为你自己DTO.你需要在TestDTO中写入与你的请求参数一致的属性,并包含get set方法。

当然你也可以不通过JavaBean接收,那么你可以在你的controller中定义你需要的参数,你可以使用@RequestParam,也可以不使用,例如对于如上请求你可以这么写你的controlle

public Result updateAuditComment(String name,String age) {
}

也可以这么写

public Result updateAuditComment(@RequestParam String name,@RequestParam String age) {
}

x-www-form-urlencoded

而比如你的content-type为x-www-form-urlencoded,这也是大多数情况下的设置,如果你没有设置任何content-type。那么它默认就是这个。当content-type为x-www-form-urlencoded时证明你的数据格式需要为key=value&key=value的形式,例如

name = 张三 & age = 22

而这种情况你的方法的接收地方就不能使用@RequestBody。因为这个注解的作用是把得到的报文转换成json.而你发送的并非json格式。所有不能使用这个注解,否则可能报错Content type ‘application/x-www-form-urlencoded;charset=UTF-8’ not supported。你的controller类似如下这样

public Result updateAuditComment(TestDTO test) {
}

类似的,你也可以不通过JavaBean接收,那么你可以在你的controller中定义你需要的参数,你可以使用@RequestParam,也可以不使用,例如对于如上请求你可以这么写你的controlle

public Result updateAuditComment(String name,String age) {
}

也可以这么写

public Result updateAuditComment(@RequestParam String name,@RequestParam String age) {
}

关于@RequestParam作用

通过上诉可以看出实际上@RequestParam并不会影响到参数的接收,它存在的意义仅仅是你可以通过它来设置默认值,设置别名,设置是否必须。关于@RequestParam加与不加的区别可以参考这篇文章

猜你喜欢

转载自blog.csdn.net/qq32933432/article/details/88840258
今日推荐