无注解接收

特点:参数非必传,如下我们可以只传id,age不传name是可以正常请求的。

  1. //【Get】请求【http://localhost:8083/demo/testId?id=1&name=xiaozhang&age=20】后台不加任何注解,直接接收方式。注意请求的key必须和后台参数名称对应
  2. @GetMapping("/testId")
  3. public Result testId(int id,String name,int age){
  4. UserInfo userInfo = new UserInfo();
  5. userInfo.setId(id);
  6. userInfo.setName(name);
  7. userInfo.setAge(age);
  8. return Result.success(userInfo);
  9. }

场景:前端查询数据时经常含有多个条件,通常我们会封装对象,而不是一个个接收。在不加注解的情况下去请求查询就是个不错的方法,如下:

  1. @GetMapping("/queryUserInfo")
  2. public Result queryUserInfo(UserInfo userInfo) {
  3. return Result.success(userInfo);
  4. }
  5. - Get请求【http://localhost:8083/demo/queryUserInfo?id=2&name=xiaozhang&age=22&sex=%E7%94%B7&phone=18675689576】
  6. - 响应结果:
  7. {
  8. "msg": "操作成功",
  9. "code": 200,
  10. "data": {
  11. "id": 2,
  12. "name": "xiaozhang",
  13. "age": 22,
  14. "sex": "男",
  15. "phone": "18675689576",
  16. "idCard": null
  17. }
  18. }

@RequestParam接收参数

使用这个注解需要注意两个点:
  • 加了这个参数后则请求中必须传递这个参数
  • @RequestParam这个注解可以指定名字,请求参数必须和指定的这个名字相同,如果不指定,则默认为具体参数名
  1. @GetMapping("/testRequestParam")
  2. public Result testRequestParam( int id, @RequestParam String name, int age) {
  3. UserInfo userInfo = new UserInfo();
  4. userInfo.setId(id);
  5. userInfo.setName(name);
  6. userInfo.setAge(age);
  7. return Result.success(userInfo);
  8. }

无注解请求和@RequestParam接收参数区别:无注解传参在请求时可以不一定要传入,而加上@RequestParam则一定要传的,否则报错。

  1. Required request parameter 'name' for method parameter type String is not present

@PathVariable注解

作用:@Pathvariable映射URL绑定的占位符,将URL中的占位符参数绑定到控制器的方法进行入参。URL中{xxx}占位符可以通过@Pathvariable(“XXX”)进行绑定。一般是在get请求中使用。
  1. //注意点:当参数名称和url中变量名称一致时可以简写
  2. @GetMapping("/testIdToPathVariable1/{id}")
  3. public Result testIdToPathVariable1(@PathVariable int id){
  4. return Result.success(id);
  5. }
  6. //不一样时PathVariable注解需要指定具体的参数名称
  7. @GetMapping("/testIdToPathVariable2/{id}")
  8. public Result testIdToPathVariable2(@PathVariable("id") int ids){
  9. return Result.success(ids);
  10. }

HttpServletRequest接收参数

从请求request流中获取参数,以下是最简单的使用方式:

  1. //HttpServletRequest接收参数的几种方法
  2. @GetMapping("/testHttpServletRequest")
  3. public Result testHttpServletRequest(HttpServletRequest request) {
  4. String id = request.getParameter("id");
  5. return Result.success(id);
  6. }
  7. //请求 - http://localhost:8083/demo/testHttpServletRequest?id=1
  8. {
  9. "msg": "1",
  10. "code": 200
  11. }

@RequestBody

作用:@RequestBody的作用其实是将json格式的数据转为java对象。就是将传入的json字符串映射转换为实体对象。使用@RequestBody接收数据时,一般都用POST方式进行提交

在后端的同一个接收方法里,@RequestBody与@RequestParam()可以同时使用,@RequestBody最多只能有一个,而@RequestParam()可以有多个。
  1. //@RequestBody接收请求体参数
  2. @GetMapping("/testRequestBody")
  3. public Result testRequestBody(@RequestBody UserInfo userInfo) {
  4. return Result.success(userInfo);
  5. }
  1. ### 测试@RequestBody传参
  2. POST http://localhost:8083/demo/testRequestBody
  3. Content-Type: application/json
  4. {
  5. "id": 0,
  6. "name": "xiaochen",
  7. "age": 0,
  8. "sex": "男",
  9. "phone": null,
  10. "idCard": null
  11. }
  12. //响应
  13. {
  14. "msg": "操作成功",
  15. "code": 200,
  16. "data": {
  17. "id": 0,
  18. "name": "xiaochen",
  19. "age": 0,
  20. "sex": "男",
  21. "phone": null,
  22. "idCard": null
  23. }
  24. }
  25. 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:默认值
  1. //@RequestHeader接收请求头参数
  2. @PostMapping("/testRequestHeaderAndCookie")
  3. public Result testRequestHeaderAndCookie(@RequestHeader String appkey ,@RequestHeader String appsecret,@CookieValue String cookieId) {
  4. List<Object> objects = new ArrayList<>();
  5. objects.add(appkey);
  6. objects.add(appsecret);
  7. objects.add(cookieId);
  8. return Result.success(objects);
  9. }

Controller接收参数方式 - 图1

Controller接收参数方式 - 图2

  1. {
  2. "msg": "操作成功",
  3. "code": 200,
  4. "data": [
  5. "test-key",
  6. "test-secret",
  7. "cookie-Id"
  8. ]
  9. }