RestController 设计之争 - Spring Boot REST API

2024-01-09

我对 REST API 开发还很陌生。我决定使用 Spring Boot 创建一个博客应用程序,但我真的在为应用程序的设计和结构而苦苦挣扎。

现在我的应用程序由帖子和评论模型和存储库组成。对于这两个模型,我创建了服务类(PostService 和 CommentService)。在这些课程中,我拥有所有业务逻辑(现在只是简单的 CRUD)。

现在我对 @RestControler for Posts 的设计感到摸不着头脑。在 PostController 中我公开了这些操作:

@PostMapping("/api/posts/create")
public Post create(@RequestBody Post post) { ... }

@GetMapping("/api/posts")
public List<Post> findAll() { ... }

@GetMapping("/api/posts/{id}")
public Post findById(@PathVariable("id") Long id) { ... }

@PutMapping("/api/posts/{id}")
public Post update(@RequestBody Post post) { ... }

@DeleteMapping("/api/posts/{id}")
public void delete(@PathVariable Long id) { ... }

现在我开始回答我的问题了。我想知道向帖子添加评论的正确设计是什么。

  1. 我应该使用 CommentController 类公开 Comment 的所有 CRUD 方法并使用 create 方法吗?
  2. 添加新方法可以吗addComment到 PostController 它将创建一个新的评论?

在我看来,向帖子添加评论属于帖子,但我真的不知道。

有人可以就此事给我一些建议吗?

多谢!

Bye, Tom


如果我是你,我会考虑 REST 设计原则开放API规范 http://spec.openapis.org/oas/v3.0.3并将遵循resource -> sub-resource -> method||identifier图案。出于可读性和理解的目的,这可能是最 KISS 和简洁的设计。

@PostMapping("/api/posts/") //you don't need /create as a separate URI
public Post create(@RequestBody Post post) { ... }

@GetMapping("/api/posts") //This is OK.
public List<Post> findAll() { ... }

@GetMapping("/api/posts/{id}") //OK, however {id} should be optional, hence you can combine this and upper methods in one method.
public Post findById(@PathVariable("id") Long id) { ... }

@PutMapping("/api/posts/{id}") //OK.
public Post update(@RequestBody Post post) { ... }

@DeleteMapping("/api/posts/{id}") //OK.
public void delete(@PathVariable Long id) { ... }

现在,对于 API 设计的注释,我会将它们包含在posts资源,并且会添加这些相应的 URI:

@GetMapping("/api/posts/{id}/comments/{commendId}") //commentId is optional
@PostMapping("/api/posts/{id}/comments/") //you don't need any {commendId} here, just post the payload

等等。我希望你能想出方法签名和其他方法映射。

您还可以查看 RESTful 命名约定here https://restfulapi.net/resource-naming/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

RestController 设计之争 - Spring Boot REST API 的相关文章

随机推荐

  • 在 PowerShell 中打开所选应用程序中的文件

    我想使用 PowerShell 中的 cmdln 和特定应用程序打开一个文件 就我而言 我有一个文件scripts js我想打开它Notepad 但通常会定期开放notepad exe如果我这样做 Invoke Item scripts j
  • 基类不包含无参数构造函数?

    我通过删除一些空的构造函数来使我的构造函数更加严格 我对继承还很陌生 并且对我得到的错误感到困惑 基类不包含无参数构造函数 如何让 A2 继承 A 而 A 中没有空构造函数 另外 根据我个人的理解 为什么 A2 需要 A 的空构造函数 Cl
  • 在 jspdf.debug.js 中哪里可以更改默认的 pdf 页面宽度和字体大小?

    我需要更改默认 pdf 页面宽度和字体大小在 jspdf debug js 中 在哪里以及如何更改 jspdf debug js 中的默认值 除了使用默认格式之一之外 您还可以以指定的单位指定任何大小 例如 Document of 210m
  • “!!”有什么用? (否定两次)? [复制]

    这个问题在这里已经有答案了 可能的重复 C 代码中的双重否定 https stackoverflow com questions 248693 double negation in c code 比方说 bool var true 它将为变
  • 什么是http多部分请求?

    我编写iPhone应用程序已经有一段时间了 向服务器发送数据 接收数据 通过HTTP协议 没有考虑太多 大多数情况下 我理论上熟悉流程 但我不太熟悉的部分是 HTTP 多部分请求 我知道它的基本结构 但我不知道它的核心 似乎每当我发送非纯文
  • Android Bitmap保存没有透明区域

    我想保存没有透明区域的位图 位图具有大的透明像素 所以我想删除它 我怎样才能做到这一点 我无法添加图片 所以用符号解释 我不想裁剪功能 我希望使用过滤器 透明区域 裁剪这个 要查找位图的非透明区域 请在 x 和 y 中迭代位图并查找非透明区
  • 游戏开发中处理战斗效果

    我正在尝试为我正在修改的个人项目的游戏制定高级技术规范 这是一款可能最接近的回合制冒险游戏Archon http en wikipedia org wiki Archon computer game 就我想做的事情而言 我遇到的麻烦是概念化
  • webkit 浏览器获取 elements.width() 错误

    我正在尝试获得容器的正确计算宽度 所有浏览器都能正确计算出宽度 甚至 IE 但令人惊讶的是 Chrome 和 webKit 浏览器也获得了有线号码 我正在尝试获取总宽度 li 包括它的边框和填充 它的右边距 然后乘以长度 li li 以获得
  • 使用 UIDocumentPickerViewController 在 Swift 中导入文本

    我目前正在学习 iOS 开发课程 作为我项目的一部分 我的任务是使用UIDocumentPickerViewController导入文本 我发现的每个例子要么 a 用 Objective C 编写 要么 b 用于导入UIImage file
  • 在 Clojure 中将“map”与不同大小的集合一起使用

    我想了解在 clojure 中操作不同大小的集合的惯用方式 有没有办法告诉函数 map 用一些默认值填充集合的其余部分 举个例子 假设我有 3 个向量 def x 1 2 3 4 def y 1 2 3 4 5 def z 1 2 3 4
  • 根据选择器中选择的应用程序为 ACTION_SEND 意图设置不同的文本[重复]

    这个问题在这里已经有答案了 如何设置不同的内容 不同的文本 图像 无图像 ACTION SEND意图 基本上我想要电子邮件的长文本和图像 Facebook 的长文本和 Twitter 的短文本 我知道这个问题 https stackover
  • Excel:如果满足条件,则从范围内进行 TEXTJOIN

    我在 Excel 中遇到了一个问题 但我不知道如何解决 上图中有两个表 表 1 列出了个人之间交换的礼物 并标明了赠送者和接受者 我使用 礼物 和 人 是为了更容易在这里讨论 实际上 这些是交换控制信号的设备 这张表可能有数百行长 表 2
  • 正则表达式查找仅包含一个斜杠的 URL

    我正在测试一个网站 需要使用正则表达式来定位我想要包含在测试中的页面 我将仅定位 URL 中都有一个斜杠的产品页面 URL 不显示http 在他们中 以下是我需要匹配的 URL 我想要的看起来像这样 www example com just
  • 如何获取 NSRunningApplication 的参数?

    如何获取启动期间使用的参数列表NSRunningApplication 类似于我跑步时看到的ps aux let workspace NSWorkspace shared let applications workspace running
  • 使用 importlib.util 检查库时出错

    我正在尝试使用 importlib 库来验证 nmap 库是否安装在执行 Python 3 5 2 中的脚本的计算机上 我正在尝试使用importlib util find spec nmap 但收到以下错误 gt gt gt import
  • 鼠标悬停在按钮上的问题

    我正在使用 Twitter Bootstrap 当我将鼠标悬停在btn primary button 这是我的代码 div class navbar navbar fixed top div class navbar inner div c
  • 如何使用c#检查xml文件是否为空

    大家好 我想检查我的 xml 文件是否为空 我正在尝试将一个 xml 数据更新为另一个 为此我正在使用以下代码 现在请告诉我如何检查我的 xml 文件是否有数据 这是我用来更新 xml 文件的代码 protected void CheckU
  • 使用索引搜索相似的单词

    我需要使用某种模糊搜索 例如来自 Oracle 的模糊搜索 并使用索引来搜索数据库表 因为我不需要表扫描 有大量数据 我想忽略大小写 语言特殊内容 和特殊字符 如 等 搜索 maria cool 应该得到 maria COOL 和 Mar
  • Spring Security + Keycloak:登录后403

    我尝试重现一个https www baeldung com spring boot keycloak教程进行了一些简化 我的 Keycloak 服务器也在另一台机器上 由于弃用 配置也略有变化antMatchers Configuratio
  • RestController 设计之争 - Spring Boot REST API

    我对 REST API 开发还很陌生 我决定使用 Spring Boot 创建一个博客应用程序 但我真的在为应用程序的设计和结构而苦苦挣扎 现在我的应用程序由帖子和评论模型和存储库组成 对于这两个模型 我创建了服务类 PostService