在Spring项目中,Controller层作为与前端交互的核心层,主要负责的是对前端的请求的解析操作,以及对后端服务层逻辑的调用,进行请求响应反馈的操作。在进行客户端请求参数处理的时候,Spring Boot的Controller层中提供了多种的参数接收方案,下面就来详细的介绍一下这些参数接收方法。
通过 @RequestParam 接收请求参数
用来接收URL中的查询参数,如GET请求/api/user?name=John&age=30中的相关参数如下所示:
@RestController @RequestMapping("/api/user") public class UserController { @GetMapping public String getUserInfo( @RequestParam String name, @RequestParam(defaultValue = "0") int age ) { return "Name: " + name + ", Age: " + age; } }
这种方式直接指定了参数名和参数方法的对应关系,可以为请求参数设置默认值,提高了操作的灵活性。
通过 @PathVariable 接收路径参数
可以用来接收URL路径中的动态参数,如GET请求 /api/user/123中的123路径参数。通过{}占位符中获取路径变量,如下所示:
@RestController @RequestMapping("/api/user") public class UserController { @GetMapping("/{id}") public String getUserById(@PathVariable("id") Long userId) { return "User ID: " + userId; } }
这种方式非常适合RESTFul的动态路由解析,但是要求必须有路径参数存在,否则会报错。
通过@RequestBody接收请求体参数
用来处理POST、PUT请求中的JSON或XML格式的请求体参数,但是需要配合Jackson或Gson等工具进行序列化/反序列化操作,在Spring Boot中默认提供了Jackson的支持,如下所示:
@RestController @RequestMapping("/api/user") public class UserController { @PostMapping public String createUser(@RequestBody User user) { return "Created user: " + user.getName() + ", Age: " + user.getAge(); } } class User { private String name; private int age; // Getters and Setters }
这种方式适合传递一些复杂的参数结构,需要客户端中提供严格的数据参数,否则就会因为格式检查而抛出异常或者是序列化的异常。
通过@RequestHeader接收请求头参数
这种方式适合从HTTP请求头中进行参数的提取,例如Authorization、Content-Type等参数的获取可以通过这种方式来获取:
@RestController @RequestMapping("/api/user") public class UserController { @GetMapping("/info") public String getUserInfo(@RequestHeader("Authorization") String authHeader) { return "Authorization Header: " + authHeader; } }
这种方式适合从客户端传递的元信息中进行参数的提取,并且还支持了默认值的设置。
通过@CookieValue接收Cookie参数
这种方式是和从请求的Cookie中提取参数,专门用于提取客户端的Cookie数据,与@RequestHeader类似,但是更加语义化,如下所示:
@RestController @RequestMapping("/api/user") public class UserController { @GetMapping("/profile") public String getProfile(@CookieValue("SESSIONID") String sessionId) { return "Session ID: " + sessionId; } }
通过@ModelAttribute接收表单参数
这种方式用于将表单数据绑定到一个Java对象中,适用于表单提交的操作中,如下所示:
@RestController @RequestMapping("/api/user") public class UserController { @PostMapping("/register") public String registerUser(@ModelAttribute User user) { return "Registered user: " + user.getName() + ", Age: " + user.getAge(); } } class User { private String name; private int age; // Getters and Setters }
通过这种方式可以方便的将多个参数绑定到一个对象中,但是需要保证字段名称与对象的属性的一致性。
通过HttpServletRequest和HttpServletResponse接收原始数据
这种方式适合需要直接操作底层HTTP请求和响应对象时使用,用于获取更多信息,如下所示:
@RestController @RequestMapping("/api/user") public class UserController { @GetMapping("/details") public String getDetails(HttpServletRequest request) { String clientIp = request.getRemoteAddr(); return "Client IP: " + clientIp; } }
通过这种方式来处理一些高级的HTTP处理场景,但是一般不推荐直接对其参数进行操作。