@RequestParam和@RequestBody区别
结论:
在不添加@RequestParam注解的前提下(Get / Post请求方式):
1、测试String类型成功,另外Integer、Double等类型测试也都是成功的,所以省略相关类型的测试,不过需要注意,如果不添加@RequestParam注解,那就需要保证类型后面的参数名称和前端发送请求的名称一致
2、测试Object类型成功
3、测试Map类型失败
4、测试Array类型成功
5、测试List类型失败
在只添加@RequestParam注解的前提下(Get / Post请求方式):
1、测试String类型成功,另外Integer、Double等类型测试也都是成功的,所以省略相关类型的测试
2、测试Object类型失败
3、测试Map类型成功
4、测试Array类型成功
5、测试List类型失败
只添加@RequestBody注解的前提下(Post请求方式):
1、测试String类型成功,由于前端发过来的是json格式的字符串,所以使用Integer、Double等类型接受测试都是失败的,所以省略相关类型的测试
2、测试Object类型成功,直接接收到的是User类型的对象,而不是字符串
3、测试Map类型成功,直接接收到的是Map类型的对象,而不是字符串
4、测试Array类型成功,直接收到的就是数组,而不是字符串
5测试List类型成功,直接接收到的是List集合中包裹着Map对象的形式
不想只使用@RequestBody,我还想使用一部分数据使用使用@RequestBody去接收参数,另外一部分数据使用@RequestParam去接收参数,或者我什么注解也不添加就去接收参数(Post请求方式):
这当然也是可以的,我们只需要把参数拼接在url的后面就可以了,之后我们就可以使用@RequestParam注解或者什么都不加注解的形式接收参数了,至于@RequestParam注解或者什么都不加注解的形式能接收什么类型的参数在上面已经说过了,这里不再赘述
如果你想看如何证明过程,那你就往下看吧,不过挺长的哈!
一、Get请求
1、不添加@RequestParam注解
1.1 String
代码:
@GetMapping("/test")
public String test(String name) {
System.out.println(name);
return "测试成功";
}
postMan:
控制栏:
解释:
在不添加@RequestParam注解的前提下:测试String类型成功,另外Integer、Double等类型测试也都是成功的,所以省略相关类型的测试,不过需要注意,如果不添加@RequestParam注解,那就需要保证类型后面的参数名称和前端发送请求的名称一致
1.2 Object
代码:
@GetMapping("/test")
public String test(User user) {
System.out.println(user);
return "测试成功";
}
User.java:
@Data // Lombok依赖中的注解,相当于添加了get、set等方法
@NoArgsConstructor // Lombok依赖中的注解,这是全参构造器
@AllArgsConstructor // Lombok依赖中的注解,这是无参构造器
public class User {
@ApiModelProperty("用户名")
public String username;
@ApiModelProperty("密码")
public String password;
}
postMan:
控制栏:
解释:
在不添加@RequestParam注解的前提下:测试Object类型成功
注意:虽然是Get请求,但是password只是一个测试的字段,并不是真实环境,别在意这个问题
1.3 Map
代码:
@GetMapping("/test")
public String test(Map<String,String> map) {
System.out.println(map);
return "测试成功";
}
postMan:
控制栏:
解释:
在不添加@RequestParam注解的前提下:测试Map类型失败
1.4 Array
代码:
@GetMapping("/test")
public String test(String[] name) {
System.out.println(name[0]);
System.out.println(name[1]);
return "测试成功";
}
postMan:
控制栏:
解释:
在不添加@RequestParam注解的前提下:测试Array类型成功
1.5 List
代码:
@GetMapping("/test")
public String test(List<String> list) {
System.out.println(list.get(0));
System.out.println(list.get(1));
return "测试成功";
}
postMan:
控制栏:
解释:
在不添加@RequestParam注解的前提下:测试List类型失败
2、只添加@RequestParam注解
2.1 String
代码:
@GetMapping("/test")
public String test(@RequestParam String name) {
System.out.println(name);
return "测试成功";
}
postMan:
控制栏:
解释:
在只添加@RequestParam注解的前提下:测试String类型成功,另外Integer、Double等类型测试也都是成功的,所以省略相关类型的测试
扩展:
@RequestParam后面的括号中可以添加参数,分别是value、required、defaultValue,例如:
@GetMapping("/test")
public String test(@RequestParam(value = "myname",required = true,defaultValue = "xiaoai") String name) {
System.out.println(name);
return "测试成功";
}
其中value后面的是前端发起请求时的key值,必须写myname,不能写name,String name代表我们在java后端代码中使用的是变量name,required代表是否必须添加该参数,默认是false,也就是可以不在url中添加该参数,defaultValue代表默认值,也就是当name参数为null的时候(写的有该参数,但是没有赋值)默认被赋予的值,这些参数一般只在普通类型的时候会用
2.2 Object
代码:
@GetMapping("/test")
public String test(@RequestParam User user) {
System.out.println(user);
return "测试成功";
}
User.java:
@Data // Lombok依赖中的注解,相当于添加了get、set等方法
@NoArgsConstructor // Lombok依赖中的注解,这是全参构造器
@AllArgsConstructor // Lombok依赖中的注解,这是无参构造器
public class User {
@ApiModelProperty("用户名")
public String username;
@ApiModelProperty("密码")
public String password;
}
postMan:
控制栏:
解释:
在只添加@RequestParam注解的前提下:测试Object类型失败
2.3 Map
代码:
@GetMapping("/test")
public String test(@RequestParam Map<String,String> map) {
System.out.println(map);
return "测试成功";
}
postMan:
控制栏:
解释:
在只添加@RequestParam注解的前提下:测试Map类型成功
2.4 Array
代码:
@GetMapping("/test")
public String test(@RequestParam String[] name) {
System.out.println(name[0]);
System.out.println(name[1]);
return "测试成功";
}
postMan:
控制栏:
解释:
在只添加@RequestParam注解的前提下:测试Array类型成功
2.5 List
代码:
@GetMapping("/test")
public String test(@RequestParam List<String> list) {
System.out.println(list.get(0));
System.out.println(list.get(1));
return "测试成功";
}
postMan:
控制栏:
解释:
在只添加@RequestParam注解的前提下:测试List类型失败
二、Post请求
在不添加@RequestParam注解的前提下:
1、测试String类型成功,另外Integer、Double等类型测试也都是成功的,所以省略相关类型的测试,不过需要注意,如果不添加@RequestParam注解,那就需要保证类型后面的参数名称和前端发送请求的名称一致
2、测试Object类型成功
3、测试Map类型失败
4、测试Array类型成功
5、测试List类型失败
在不添加@RequestParam注解的前提下:
1、测试String类型成功,另外Integer、Double等类型测试也都是成功的,所以省略相关类型的测试,不过需要注意,如果不添加@RequestParam注解,那就需要保证类型后面的参数名称和前端发送请求的名称一致
2、测试Object类型成功
3、测试Map类型成功
4、测试Array类型成功
5、测试List类型失败
由于Post请求测试方式和Get请求测试方式一致,并且我已经测试过了结论都是一致的,所以我在上面直接把结论给你了,如果你也想测试,只需要把Get请求中测试的@GetMapping换成@PostMapping就可以了,如果你对PostMan不熟悉请看:https://blog.csdn.net/qq_42449963/article/details/109049195
由于@RequestBody的相关知识太多,所以在下面新开了一个标题
三、Post请求下@RequestBody怎么用?
当我们发送Post请求的时候,默认Content-Type:application/x-www-form-urlencoded,如果在PostMan中你选择Body中的x-www-form-urlencoded,那么你会看到Headers中出现Content-Type:application/x-www-form-urlencoded,如下图:
这就是我们使用$.ajax()发送请求所采用的的普通方式,不需要在请求头里面设置Content-Type属性,默认Content-Type就设置成application/x-www-form-urlencoded,例如:
但是你可能还见到过请求头中设置Content-Type:application/json,例如:
如果我们在通过@RequestParam去接收参数却发现无法接收到参数,这个时候就需要@RequestBody登场了,它的作用就是接收Content-Type是application/json或者application/xml时候的数据,并且@RequestBody只能在Post请求中使用,这是因为GET请求中没有HttpEntity,所以@RequestBody并不适用(解释来自网络),另外在一个方法中@RequestBody只能使用一次,而@RequestParam可以使用多次(说法来自网络),那么这个时候我们可以用@RequestBody来接受参数了,接下来根据几种类型来说明如何使用@RequestBody在Content-Type:application/json的情况下接收参数:
1、只添加@RequestBody注解
1.1 String
代码:
@PostMapping("/test")
public String test(@RequestBody String name) {
System.out.println(name);
return "测试成功";
}
postMan:
控制台:
解释:
只添加@RequestBody注解的前提下:测试String类型成功,由于前端发过来的是json格式的字符串,所以使用Integer、Double等类型接受测试都是失败的,所以省略相关类型的测试
1.2 Object
代码:
@PostMapping("/test")
public String test(@RequestBody User user) {
System.out.println(user);
return "测试成功";
}
User.java:
@Data // Lombok依赖中的注解,相当于添加了get、set等方法
@NoArgsConstructor // Lombok依赖中的注解,这是全参构造器
@AllArgsConstructor // Lombok依赖中的注解,这是无参构造器
public class User {
@ApiModelProperty("用户名")
public String username;
@ApiModelProperty("密码")
public String password;
}
postMan:
控制台:
解释:
只添加@RequestBody注解的前提下:测试Object类型成功,直接接收到的是User类型的对象,而不是字符串
1.3 Map
代码:
@PostMapping("/test")
public String test(@RequestBody Map<String,String> map) {
System.out.println(map);
return "测试成功";
}
postMan:
控制台:
解释:
只添加@RequestBody注解的前提下:测试Map类型成功,直接接收到的是Map类型的对象,而不是字符串
1.4 Array
代码:
@PostMapping("/test")
public String test(@RequestBody String[] name) {
System.out.println(name[0]);
System.out.println(name[1]);
return "测试成功";
}
postMan:
控制台:
解释:
只添加@RequestBody注解的前提下:测试Array类型成功,直接收到的就是数组,而不是字符串
1.5 List
代码:
@PostMapping("/test")
public String test(@RequestBody List<Map<String,Object>> list) {
System.out.println(list.get(0));
System.out.println(list.get(1));
return "测试成功";
}
postMan:
控制台:
解释:
只添加@RequestBody注解的前提下:测试List类型成功,直接接收到的是List集合中包裹着Map对象的形式,当然List集合里面还可以包裹Object对象,例如我们上面提到的User对象,只需要把方法中的@RequestBody List<Map<String,Object>> list
改成@RequestBody List<User> list
,另外使用postMan发送请求的时候需要改变json格式数据的内容,具体改变如下图:
只需要改变一下参数就可以了,这样就可以用List接收多个User对象了
以上一共测试了五种类型的数据,他们都是成功的,但是我不想只使用@RequestBody,我还想使用一部分数据使用使用@RequestBody去接受参数,另外一部分数据使用@RequestParam去接收参数,或者我什么注解也不添加就去接收参数,这当然也是可以的,我们只需要把参数拼接在url的后面就可以了,之后我们就可以使用@RequestParam注解或者什么都不加注解的形式接收参数了,至于@RequestParam注解或者什么都不加注解的形式能接收什么类型的参数在上面已经说过了,这里不再赘述
最后再说一嘴form-data这种方式,它在postMan工具中的Body下面的form-data上,里面除了可以发送file,其他的和普通post测试是一样的,并且Headers中Content-Type: application/x-www-form-urlencoded,如下图: