我们希望我们的参数能够按照我们设想的、正常的发送到后端接口,但是post、get和各种接参的api容易让人迷糊,下面我说下自己的理解。
1、前端传参方式
传参可以将参数放到header里面,也可以拼到地址中,或者放在body中,不过一般header中只放一些校验的参数。
1.1 get请求
get请求一般只允许在url尾部拼接参数,如http://localhost:9003/mid/app/queryTagByMenu?name=1
get请求也可以将参数放到路径中,如http://localhost:9003/mid/app/queryTagByMenu/1
1.2 post请求
get请求可以将参数放到路径中,如http://localhost:9003/mid/app/queryTagByMenu/1
post请求即可以把参数放到请求体中,也可以把参数拼接到url尾部
2、后端接参方式
2.1 @PathVariable
前端传参如:http://localhost:9003/test/1/chen
,需要使用此注解接收参数。
@RequestMapping("test/{id}/{name}")
public void test(@PathVariable("id") Long id ,@PathVariable("name") String name){
System.out.println(id, name);
}
2.2 @RequestParam
前端j将参数拼接到url尾部的,如:http://localhost:9003/mid/app/queryTagByMenu?name=1
,需要使用此注解接收参数。
如果使用此注解,则url中必须有这个参数,否则会报400错误。
@PostMapping("/queryTagByMenu")
public AjaxResult queryTagByMenu(@RequestParam String menuId) {
if (StringUtil.isEmpty(menuId)) {
return AjaxResult.error("缺少menuId参数");
}
return AjaxResult.success();
}
2.3 @RequestBody
前端使用post方式,将参数写在body中的,可以按照属性名,使用map或者实体类接收。
@PostMapping("/queryMenuByRole")
public AjaxResult queryMenuByRole(@RequestBody AppMenuRoleVo appMenuRoleVo) {
return AjaxResult.success(appSysService.queryMenuListByRole(appMenuRoleVo));
}
2.4 无注解接收参数
有人说无注解也可以正常接收参数,我试了一下,发现post是无法接收参数的。
下面试试使用get传参数,发现get是可以自动组装成实体类的。
get请求也适用于单参数无注解的情况。
2.5 @RequestHeader @CookieValue
这两个用法都差不多,我用的比较少,基本上如果我需要从header中获取参数的话,一般我是从request中获取。
@GetMapping("/test")
public void demo3(@RequestHeader(name = "headerName") String headerName,
@CookieValue(name = "cookieName") String cookieName) {
System.out.println(myHeader + "--" + cookieName);
}
看到这里,大家大概对前后端参数传递有了一些了解,欢迎留言讨论。
个人博客: https://www.51bishe.site