【问题标题】:Multiple endpoints with the same path but with different @RequestParam values具有相同路径但具有不同 @RequestParam 值的多个端点
【发布时间】:2025-12-13 15:05:01
【问题描述】:

我有一个 API 路径 GET /users/copy。我可以有两个 API 具有相同的 /users/type 路径,但使用以下构造具有不同的 RequestParams 集:

@GetMapping(value = "/users/copy", params = {"type"})
public ResponseEntity<UserDto> copyUserWithType(@RequestParam UserTypeEnum type) {
    ...
}

@GetMapping(value = "/users/copy", params = {"origin"})
public ResponseEntity<UserDto> copyUserWithOrigin(@RequestParam UserOriginEnum origin) {
    ...
}

但是如果我需要为不同的用户类型提供不同的 API(例如 type = OLDtype = NEW),有没有办法让他们仍然拥有相同的 GET /users/copy 路径?

可能是这样的:

@GetMapping(value = "/users/copy", params = {"type=OLD"})
public ResponseEntity<UserDto> copyUserWithTypeOld(@RequestParam UserTypeEnum type) {
    ...
}  

@GetMapping(value = "/users/copy", params = {"type=NEW"})
public ResponseEntity<UserDto> copyUserWithTypeNew(@RequestParam UserTypeEnum type) {
    ...
}

【问题讨论】:

  • 我不知道你为什么要这样做,但这不是一个好的模式。您可以在方法内部执行 if else 。还是想用,可以/users/copy/type/old/users/copy/type/new
  • 是的,我知道我的问题很奇怪。但是添加后缀不是我的选择
  • 如果你想要固定的参数,那么你使用后缀更好。或者使用 if-else inside 方法。
  • 我不能添加后缀,我非常想避免额外的 if-else 结构。否则我不会有这个问题
  • 尝试过这个吗?

标签: java spring-boot api rest http-request-parameters


【解决方案1】:

其实答案就在问题里。

为了使不同的 API 端点具有相同的路径和相同的 @ReuqestParam 集,但具有不同的 @ReuqestParam 值,您需要指定 params 属性,如下所示:

@GetMapping(value = "/users/copy", params = {"type=OLD"})
public ResponseEntity<UserDto> copyUserWithTypeOld(@RequestParam UserTypeEnum type) {
    ...
}  

@GetMapping(value = "/users/copy", params = {"type=NEW"})
public ResponseEntity<UserDto> copyUserWithTypeNew(@RequestParam UserTypeEnum type) {
    ...
}

【讨论】:

    最近更新 更多