无注解接收
特点:参数非必传,如下我们可以只传id,age不传name是可以正常请求的。
//【Get】请求【http://localhost:8083/demo/testId?id=1&name=xiaozhang&age=20】后台不加任何注解,直接接收方式。注意请求的key必须和后台参数名称对应
@GetMapping("/testId")
public Result testId(int id,String name,int age){
UserInfo userInfo = new UserInfo();
userInfo.setId(id);
userInfo.setName(name);
userInfo.setAge(age);
return Result.success(userInfo);
}
场景:前端查询数据时经常含有多个条件,通常我们会封装对象,而不是一个个接收。在不加注解的情况下去请求查询就是个不错的方法,如下:
@GetMapping("/queryUserInfo")
public Result queryUserInfo(UserInfo userInfo) {
return Result.success(userInfo);
}
- Get请求【http://localhost:8083/demo/queryUserInfo?id=2&name=xiaozhang&age=22&sex=%E7%94%B7&phone=18675689576】
- 响应结果:
{
"msg": "操作成功",
"code": 200,
"data": {
"id": 2,
"name": "xiaozhang",
"age": 22,
"sex": "男",
"phone": "18675689576",
"idCard": null
}
}
@RequestParam接收参数
使用这个注解需要注意两个点:- 加了这个参数后则请求中必须传递这个参数
- @RequestParam这个注解可以指定名字,请求参数必须和指定的这个名字相同,如果不指定,则默认为具体参数名
@GetMapping("/testRequestParam")
public Result testRequestParam( int id, @RequestParam String name, int age) {
UserInfo userInfo = new UserInfo();
userInfo.setId(id);
userInfo.setName(name);
userInfo.setAge(age);
return Result.success(userInfo);
}
无注解请求和@RequestParam接收参数区别:无注解传参在请求时可以不一定要传入,而加上@RequestParam则一定要传的,否则报错。
Required request parameter 'name' for method parameter type String is not present
@PathVariable注解
作用:@Pathvariable映射URL绑定的占位符,将URL中的占位符参数绑定到控制器的方法进行入参。URL中{xxx}占位符可以通过@Pathvariable(“XXX”)进行绑定。一般是在get请求中使用。
//注意点:当参数名称和url中变量名称一致时可以简写
@GetMapping("/testIdToPathVariable1/{id}")
public Result testIdToPathVariable1(@PathVariable int id){
return Result.success(id);
}
//不一样时PathVariable注解需要指定具体的参数名称
@GetMapping("/testIdToPathVariable2/{id}")
public Result testIdToPathVariable2(@PathVariable("id") int ids){
return Result.success(ids);
}
HttpServletRequest接收参数
从请求request流中获取参数,以下是最简单的使用方式:
//HttpServletRequest接收参数的几种方法
@GetMapping("/testHttpServletRequest")
public Result testHttpServletRequest(HttpServletRequest request) {
String id = request.getParameter("id");
return Result.success(id);
}
//请求 - http://localhost:8083/demo/testHttpServletRequest?id=1
{
"msg": "1",
"code": 200
}
@RequestBody
作用:@RequestBody的作用其实是将json格式的数据转为java对象。就是将传入的json字符串映射转换为实体对象。使用@RequestBody接收数据时,一般都用POST方式进行提交
在后端的同一个接收方法里,@RequestBody与@RequestParam()可以同时使用,@RequestBody最多只能有一个,而@RequestParam()可以有多个。
//@RequestBody接收请求体参数
@GetMapping("/testRequestBody")
public Result testRequestBody(@RequestBody UserInfo userInfo) {
return Result.success(userInfo);
}
### 测试@RequestBody传参
POST http://localhost:8083/demo/testRequestBody
Content-Type: application/json
{
"id": 0,
"name": "xiaochen",
"age": 0,
"sex": "男",
"phone": null,
"idCard": null
}
//响应
{
"msg": "操作成功",
"code": 200,
"data": {
"id": 0,
"name": "xiaochen",
"age": 0,
"sex": "男",
"phone": null,
"idCard": null
}
}
Response code: 200; Time: 69ms; Content length: 104 bytes
需要注意,如果前台传入参数和后台参数不一样,则无法映射到对应的实体类上。
如果参数时放在请求体中,application/json
传入后台的话,那么后台要用@RequestBody
才能接收到;如果不是放在请求体中的话,那么后台接收前台传过来的参数时,要用@RequestParam
来接收,或 则形参前 什么也不写也能接收。
@RequestHeader&@CookieValue接收参数
@RequestHeader- @RequestHeader是将请求头信息和控制器方法的形参创建映射关系
- @RequestHeader注解一共有三个属性:value(值)、required(是否为必须的,默认为true)、defaultValue(当没值的时候,采取此值)。
@CookieValue
- 用来获取cookie中的value
- 参数、value:参数名称、required:是否必须、defaultValue:默认值
//@RequestHeader接收请求头参数
@PostMapping("/testRequestHeaderAndCookie")
public Result testRequestHeaderAndCookie(@RequestHeader String appkey ,@RequestHeader String appsecret,@CookieValue String cookieId) {
List<Object> objects = new ArrayList<>();
objects.add(appkey);
objects.add(appsecret);
objects.add(cookieId);
return Result.success(objects);
}
{
"msg": "操作成功",
"code": 200,
"data": [
"test-key",
"test-secret",
"cookie-Id"
]
}