天天看点

@RequestParam与@RequestBody对比文章目录

文章目录

  • handler method 参数绑定常用的注解,我们根据他们处理的Request的不同内容部分分为四类:(主要讲解常用类型)
    • 1、根据content-type方面区分:
    • 2、根据注解方式区分:
  • 划重点(∩_∩)

handler method 参数绑定常用的注解,我们根据他们处理的Request的不同内容部分分为四类:(主要讲解常用类型)

  1. 处理requet uri 部分(这里指uri template中variable,不含queryString部分)的注解: @PathVariable;
  2. 处理request header部分的注解: @RequestHeader, @CookieValue;
  3. 处理request body部分的注解:@RequestParam, @RequestBody;
  4. 处理attribute类型是注解: @SessionAttributes, @ModelAttribute;

本文只讨论:@RequestParam和@RequestBody。

1、根据content-type方面区分:

  1. application/json:json字符串部分可以用@RequestBody;url中的?后面参数可以用@RequestParam。见下图
    @RequestParam与@RequestBody对比文章目录
  2. form-data、x-www-form-urlencoded:不可以用@RequestBody;可以用@RequestParam。

    如果用@RequestBody,值会合并在一起。如下图所示。

    @RequestParam与@RequestBody对比文章目录
    @RequestParam与@RequestBody对比文章目录

    所以这样还是需要后台代码再去解析一次,注解等于无效。

    正确的:

    @RequestParam与@RequestBody对比文章目录

2、根据注解方式区分:

  • @RequestBody

    该注解常用来处理Content-Type为application/json, application/xml的数据;

(@RequestBody Map map)

(@RequestBody Object object)

application/json时候可用

form-data、x-www-form-urlencoded时候不可用

ps:

  1. GET请求不能用@RequestBody来接收参数。
  2. 后台只能有一个@Request注解
  • @RequestParam

    使用@RequestParm用于绑定controller上的参数,可以是多个参数,也可以是一个Map集合,GET,POST均可

(@RequestParam Map map)

application/json时候,json字符串部分不可用,url中的?后面添加参数即可用,见图一

form-data、x-www-form-urlencoded时候可用,但是要将Headers里的Content-Type删掉

(@RequestParam String param1,

@RequestParam String param2)

application/json时候,json字符串部分不可用,url中的?后面添加参数即可用。

form-data、x-www-form-urlencoded时候可用,且参数可以没有顺序(即前端传过来的参数或者url中的参数顺序不必和后台接口中的参数顺序一致,只要字段名相同就可以),但是要将Headers里的Content-Type删掉

(@RequestParam Object object)

不管application/json、form-data、x-www-form-urlencoded都不可用

ps:只支持Content-Type: 为 application/x-www-form-urlencoded编码的内容。Http协议中,如果不指定Content-Type,则默认传递的参数就是application/x-www-form-urlencoded类型)

注解对比图

区别 @RequestParam @RequestBody
content-type 仅支持x-www-form-urlencoded json(常用), xml
请求类型 所有 除了GET
注解个数 可多个 只能有一个