【问题标题】:@PathVariable vs @RequestParam to retrieve an entity@PathVariable 与 @RequestParam 检索实体
【发布时间】:2020-09-16 10:55:06
【问题描述】:

我知道@PathVariable@RequestParam 之间的区别,这不是重点。

我也阅读了一些文章,但我仍然不明白在简单的情况下何时使用其中一种。

对于 REST API,假设我有一个带有 idusernameUser 实体(两者都是唯一的)。

现在我想通过用户名获取用户。

我有两个选择:

@GetMapping(path = "/users/{username}")
public ResponseEntity<Object> getUser(@PathVariable String username){
    //Get user
}

@GetMapping(path = "/users}")
public ResponseEntity<Object> getUser(@RequestParam String username){
    //Get user
}

我必须使用哪一个(@RequestParam 在代码中不是强制性的,我放置它只是为了更清楚)?

谢谢

【问题讨论】:

  • 这完全取决于你,但典型的 REST API 将在路径中使用 ID,所以我会亲自选择选项 #2(在 /users/ 上没有尾随 /),例如 /users?username=whatever
  • 这是一种设计选择。如果你想访问像“/users/john”这样的 URL,你可以使用路径变量,但使用请求参数“/users?username=john”。可能重复:stackoverflow.com/questions/37878684/…
  • 谢谢,我编辑了/
  • 我看到了可能重复的问题,但我真的没有答案,对我来说还不清楚......
  • 注意:最好在可行的情况下返回ResponseEntity&lt;ActualResultType&gt;(或者只返回结果类型并省去ResponseEntity,除非您需要设置标题)。

标签: java spring-boot rest http


【解决方案1】:

URL 的路径部分标识一个资源,查询字符串代表一个查询。虽然查询当然可以只返回一个项目,但集合资源 URL (/users) 应该返回一个 array 项目(从零到无穷大),而记录资源 URL (/users/123 ) 应该只返回一项(这是应该处理 DELETE/PUT 请求的 URL)。

如果username实际上是用户的规范ID,它应该是一个路径变量;如果有不同的规范 ID(例如 UUID),但您正在按用户名搜索,则使用查询参数但返回零个或一个结果的集合。 (您可以在请求映射中使用params=username 以仅在存在该查询参数时匹配控制器。)

【讨论】:

  • 好的,所以也许如果我有 id 并且我想知道例如电子邮件,让我们使用路径变量。如果我想查找具有用户名的用户,让我们使用 param。这会是一个解决方案吗?
  • @Manta 假设用户名与 ID 不同(这是一个很好的做法,以便您可以更改用户名),那么这正是这样做的。在这种情况下,您通常希望使用 params 限制请求映射。
  • 始终使用id,即使username 是唯一的,我认为它在性能、内存使用、可编辑功能、加入等方面都更好……最后我明白了,谢谢大家。
猜你喜欢
  • 2012-11-22
  • 2014-08-16
  • 1970-01-01
  • 2015-08-28
  • 2015-08-18
  • 2017-11-10
  • 1970-01-01
相关资源
最近更新 更多