api - Rest api url 设计异常
问题描述
我阅读了一些关于更正(干净)用于休息端点的 url 设计的文章和帖子。无论如何,我想讨论或建议我有一些疑问和不清楚的情况。
情况
假设我们有一个服务,它已经注册了用户。管理员可以为每个用户附加一些文本的自定义注释。
我想被告知的问题只是CRUD
端点,这可能是微不足道的问题。
我们将有 4 个相关的端点:
POST(创建)
根据一些准则,我们可能会设计如下 URL:
/users/{userId}/notes
并发送包含详细信息的有效负载。这里没有问题
GET(读取)
类似情况:
/users/{userId}/notes
作为响应,我们收到附加到特定用户的注释列表。这里没有问题
更新(更新)
类似情况:
/users/{userId}/notes
作为有效负载服务器接收API
包含所有note
详细信息的对象。
在这里,我有我的第一个疑问。由于我收到note
包含userId:
值的对象-我应该严格遵循该URL
模式吗?userId
在这种情况下是多余的。当然,我也可以PathVariable
在有效负载中接收该值,但这是正确的方法吗?同样的情况出现在许多其他CRUD
的,这就是为什么我想知道“良好实践”的
API 对象:
{
"id": 1,
"userId": 2,
"text": "Some message"
}
DELETE (delete)
类似情况:
/users/{userId}/notes/{noteId}
实际上删除我只需要noteId
信息。正如我认为的那样 -/users/notes/{noteId}
就足够了,但这对于DELETE
操作来说意味着我会有不同的URL
. 情况类似,UPDATE
以防万一。
问题
我应该严格遵守 URL 命名约定并使用/users/{userId}/notes
吗?什么是简单CRUD
操作的好习惯?
解决方案
您应该查看Webber 2011。
在 REST 中,我们没有“端点”,我们有“资源”。您的资源模型实际上是一组文档,每个文档都有一个唯一标识符,可以读取 (GET) 和写入 (POST/PUT/PATCH)。
域模型中的有用工作是当有人编辑您的资源时发生的副作用。
机器不关心我们对资源标识符使用什么拼写约定,所以我们通常选择一种对人类来说更容易的拼写;通常这意味着标识符与文档的名称密切相关。
由于我收到包含 userId: value- 的注释对象 - 我应该严格使用该 URL 模式吗?
是的。
广义的观点(韦伯在上面链接的谈话中强调)是 HTTP 是一种应用程序协议;只要我们在请求/响应元数据中包含对正在发生的事情的正确描述,通用组件就可以完成有用的工作。
特别是,应用程序具有缓存和缓存失效。如果您正确识别正在更改的资源,缓存可以自动使以前缓存的响应无效。
这就是我们识别请求修改的特定资源的原因之一,而不仅仅是将我们的所有编辑发布到单个通用资源。
我应该严格遵守 URL 命名约定并使用 /users/{userId}/notes 吗?
是的; 实际上,这就像拥有一个包含每个用户的笔记的网页,管理员编辑该网页(添加和删除笔记)。
推荐阅读
- python - 如何移动 Pygame 对象并将其擦除到之前的位置?
- swift - Userdefault 不在 didFinishLaunchingWithOptions 方法 Swift 中存储值
- c# - Azure Web 应用程序上的 BadImageFormatException 错误
- tensorflow - 仅使用 tensorflow 进行训练中的数据增强
- javascript - 为什么我得到默认的 vuex 存储值而不是计算属性的更新值?
- php - 尝试使用 PhpStorm 在我的远程服务器上安装 Xdebug
- reactjs - 如何在 json-server 中设置主路由
- spring - Spring 如何在 Spring Boot 中的何处解决“java.lang.NoClassDefFoundError: org/springframework/data/mapping/context/MappingContext”?
- java - 如何反序列化我的不可变子类?
- mysql - SELECT 查询,显示每条记录的名称一次和实例数