@RequestParam和@RequestBody区别

总结摘要

1、@RequestParam和什么注解都不加:

这两种接收参数的方式只能接收url中?后面的参数,例如http://localhost:8001?name=张三&age=32,绝对性不能接收json格式的字符串,这是我测试过的,我当时用什么注解都不添加去接收json格式的字符串参数,然后就出现了500错误,这两种能接收的类型写在下面总结明细中,这两种方式 适合任何请求方式,使用次数无限制

2、@PathVariable:

只能接收url中/后面的参数,例如http://localhost:8001/{id}等, 适合任何请求方式,使用次数无限制

3、@RequestBody:

只能接收json格式的字符串,只能用在Post请求方式中,最多使用一次

总结明细

在不添加@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:

postMan:

控制栏:

在这里插入图片描述

解释:

在只添加@RequestParam注解的前提下:测试Array类型成功

其实通过PostMan发送上述请求相当于通过form表单发送请求,比如多选框那种的,前端通过form表单发送请求,如下:

<form action="send/array" method="post">
	<input type="text" name="array" value="5" />
	<input type="text" name="array" value="8" />
	<input type="text" name="array" value="12" />
	<input type="submit" value="提交"/>
</form>

后端通过普通方式接收,如下:

@RequestMapping("/send/array")
@ResponseBody
public String sendArray(@RequestParam("array") List<Integer> list) {
	……
}

你肯定也看到了,@RequestParam里面的值是array,这是因为:
在这里插入图片描述

可以看到前端传过来的参数名称就是array,因此我们在后端@RequestParam里面的值是array;

如果我们在ajax中发送数组数据,比如:

$(function() {
	$("#btn").click(function() {
		$.ajax({
			"url":"send/array",
			"type":"post",
			"data":{
				"array":[5,8,12]
			},
			"dataType":"text",
			"success": function(data){
				alert(data);
			},
			"error": function(data){
				alert(data);
			}
		})
	})
})

那么后端需要这样来接收,如下:

@RequestMapping("/send/array")
@ResponseBody
public String sendArray(@RequestParam("array[]") List<Integer> list) {
	……
}

你肯定也看到了,@RequestParam注解中的值是array[],其实前端发送的请求是:
在这里插入图片描述
可以看到前端发送的数据就是array[],所以如果前端通过ajax方式发送数组数据,那么在后端通过@RequestParam注解接收的时候一定要注意里面的参数是XXX[],一定加上这个[],这是因为前端传过来的时候使用的参数名称就是XXX[]

上面后端代码使用List接收数据也是可以的,当然你可以可以通过String[]数组方式来接收数据都是可以的

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请求

1、不添加@RequestParam注解

1、测试String类型成功,另外Integer、Double等类型测试也都是成功的,所以省略相关类型的测试,不过需要注意,如果不添加@RequestParam注解,那就需要保证类型后面的参数名称和前端发送请求的名称一致

2、测试Object类型成功

3、测试Map类型失败

4、测试Array类型成功

5、测试List类型失败

2、只添加@RequestParam注解

1、测试String类型成功,另外Integer、Double等类型测试也都是成功的,所以省略相关类型的测试

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对象了

2、添加@RequestBody注解的同时还使用其他注解或者不使用注解来接收参数

以上一共测试了五种类型的数据,他们都是成功的。但是我不想只使用@RequestBody,我还想使用一部分数据使用使用@RequestBody去接受参数,另外一部分数据使用@RequestParam去接收参数,或者我什么注解也不添加就去接收参数,这当然也是可以的,我们只需要把参数拼接在url的后面就可以了,之后我们就可以使用@RequestParam注解或者什么都不加注解的形式接收参数了,至于@RequestParam注解或者什么都不加注解的形式能接收什么类型的参数在上面已经说过了,这里不再赘述

最后再说一嘴form-data这种方式,它在postMan工具中的Body下面的form-data上,里面除了可以发送file,其他的和普通post测试是一样的,并且Headers中Content-Type: application/x-www-form-urlencoded,如下图:

在这里插入图片描述

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值