gpt4 book ai didi

java - Spring REST URI 存在检查

转载 作者:行者123 更新时间:2023-12-01 17:31:49 26 4
gpt4 key购买 nike

让我们假设一个简单的基于 Spring 的 RESTful API 和一些嵌套资源。

  • 一个User是每个人创建的用于访问API的根实体
  • 每个User可以创建Posts ,因此 Post没有创造者就不可能存在
  • 一个User还可以评论现有Posts ,因此 Comment属于Post

对于此 API,我选择了以下 RESTful 路线:

  • /api/users对于 User
  • /api/users/{userId}/posts对于 Post
  • /api/users/{userId}/posts/{postId}/comments对于 Comment

关于我的问题,我应该验证父资源是否存在?例如对于请求 GET /api/users/2/posts/3/comments/7 ,我是否应该确保实体 User(2)Post(3)也存在吗?我是否还必须确保实体彼此相关,并且不使用任何存在的任意资源?

示例

@PostMapping("/api/users/{userId}/posts/{postId}/comments")
public void create(@PathVariable("userId") Long userId, @PathVariable("postId") Long postId, @RequestBody CommentPayload payload) {

// userService.existsByIdWithPostId(userId, postId); ???

commentService.createForPost(postId, payload);
}

要在数据库中创建评论,userId完全无关,postId只需要。我是否仍然应该确保用户具有 userId X 存在并且有一个帖子 postId是还是应该忽略它?

如果是的话我怎样才能做到如此优雅?因为 JPA/Repository 查询不断增长,例如 Optional<Comment> findByUserIdAndPostIdAndId(...)似乎不是一个解决方案...然后验证应该在多个查询中进行吗?包含所有 parent 的 ID 使实际查询变得非常复杂。此外,标识符必须通过所有层(服务、安全),这使内部 API 变得复杂。

最佳答案

简短的回答:是的,您必须检查父/根实体是否存在,是的,您需要定义实体之间的关系

长答案:

事实上,没有用户就无法创建帖子,因此不必通过 URL 结构进行检查。 URL 只是为了阐明请求什么资源。检查必须直接在代码中完成。检查记录是否存在不需要额外的努力和方法,这是因为实体之间的关系。

当您使用 /users/{userId}/posts API 为用户添加帖子时,您需要将帖子添加到 id= 用户的帖子列表中[userId],因此您调用相关的存储库方法来获取用户记录(例如findById),这本身就是检查带有id=[的用户是否存在的行为用户 ID]。因为如果存储库返回 null,您就知道用户不存在

要设计良好、高效且易于理解的 API,请遵循以下简单规则:

如果资源可以单独访问,则它必须有一个基本 URL 作为/[entity],否则使用父子模式(就像帖子的模式)。

请注意,此规则并非始终有效,很多时候您需要自定义 API 并更改它以提高效率。

因此,如果用户可以看到其他用户的帖子,那么您应该将 API 设计为:

  • /users [用户实体的请求]
  • /posts [帖子实体的请求]

然后,对于针对特定用户的帖子的请求,您应该使用 /users/{userId}/posts 来创建新帖子或阅读它们,对于针对特定帖子的评论的请求,您应该使用 /posts/{postId}/comments

据我了解您的应用的设计,您不需要 /comments 因为所有评论都与帖子相关,并且应该通过相关帖子访问(如上所示)。如果评论可以单独访问(比如有一个页面列出所有评论而不关心其相关帖子),那么您需要 /comments API 来获得更多说明

关于java - Spring REST URI 存在检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61106841/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com