You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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;
}
关键知识点
  1. 访问方式:现在你可以通过http://your-domain/user-details?username=yourName&password=yourPwd这样的URL来访问,Spring会自动把username和password的值注入到方法参数里。
  2. 可选参数处理:如果某个参数是可选的,可以给@RequestParam加required = false,比如@RequestParam(value = "username", required = false) String username,这样就算URL里没传这个参数也不会报错。
  3. 安全提醒:直接在URL里传密码是非常不安全的!URL会被存在浏览器历史、服务器日志、代理日志里,很容易泄露敏感信息。建议改成POST请求,把参数放在请求体里传递。
额外区分:路径变量 vs 查询参数
  • 路径变量:是URL路径的一部分,比如/users/{userId},用来标识特定资源,适合传递资源ID这类必填的、标识性的参数。
  • 查询参数:是?后面的键值对,用来做过滤、分页、传递可选参数,比如/users?page=2&size=10。

内容的提问来源于stack exchange,提问作者rk13

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:55:15