在REST Controller中如何以键值对形式在URL中传递参数?
嗨,我看了你的代码,发现你混淆了路径变量和查询参数的用法啦!你现在想处理的是URL里?后面的键值对参数,这种属于查询参数,不能用@PathVariable来获取,得用@RequestParam才行。下面给你详细说清楚:
问题出在哪?
你的@RequestMapping里写了"/?username={username}&password={password}",还搭配@PathVariable,这是错误的逻辑:
@PathVariable是用来提取URL路径里的变量(比如/users/{userId}里的userId),不是处理?后面的查询参数。- 而且
?在@RequestMapping的value里这么写是无效的,Spring不会识别这里的参数。
正确的实现代码
改成用@RequestParam来绑定查询参数,同时简化一下注解写法(用@GetMapping替代@RequestMapping(method=GET)):
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseStatus; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; @GetMapping(value = "/user-details", produces = {MediaType.APPLICATION_JSON_VALUE}) @ResponseStatus(value = HttpStatus.OK) public UserDetails getUserDetails( @RequestParam("username") String username, @RequestParam("password") String password ) { System.out.println("This is controller: " + username + ", " + password); UserDetails userDetails = userService.loadUserByUsername(username); // 提醒下:这里返回userDetails的时候,别把敏感信息(比如密码)暴露出去哦,最好做脱敏处理 return userDetails; }
关键知识点
- 访问方式:现在你可以通过
http://your-domain/user-details?username=yourName&password=yourPwd这样的URL来访问,Spring会自动把username和password的值注入到方法参数里。 - 可选参数处理:如果某个参数是可选的,可以给
@RequestParam加required = false,比如@RequestParam(value = "username", required = false) String username,这样就算URL里没传这个参数也不会报错。 - 安全提醒:直接在URL里传密码是非常不安全的!URL会被存在浏览器历史、服务器日志、代理日志里,很容易泄露敏感信息。建议改成POST请求,把参数放在请求体里传递。
额外区分:路径变量 vs 查询参数
- 路径变量:是URL路径的一部分,比如
/users/{userId},用来标识特定资源,适合传递资源ID这类必填的、标识性的参数。 - 查询参数:是
?后面的键值对,用来做过滤、分页、传递可选参数,比如/users?page=2&size=10。
内容的提问来源于stack exchange,提问作者rk13
相关产品推荐
相关产品推荐

