rest - API 的初始化和存在端点
问题描述
要求
- 检查报告是否存在的方法
- 一种初始化新报告的方法(客户不知道表示形式)
- 获取报告的方法
注意:一份报告要么存在,要么不存在,而且永远不会超过一份
理念一
GET /account/{id}/report
404
如果报告不存在200
如果报告确实存在
但是如何初始化呢?POST
将一个空的PUT
主体插入到端点似乎是错误的(POST
因为我们知道资源在哪里;PUT
因为我们不希望那里什么都没有),但也许这只是我。另一种选择可能是GET /account/{id}/report/init
.
想法 2
GET /account/{id}/report
200
如果存在报告;退货报告200
如果报告不存在;初始化并返回报告
但是如何检查报告是否存在?
问题
我的两种方法都以不同的方式不足。在遵守 REST 原则的同时满足要求的适当方法是什么?
解决方案
在遵守 REST 原则的同时满足要求的适当方法是什么?
REST 不关心您对资源标识符使用什么拼写。
您应该记住两件事。首先,REST 架构风格的参考应用程序是万维网,它只与 GET 和 POST 相处得很好。其次,缓存是这个故事的重要组成部分。
在 HTTP 中,当服务器返回非错误状态代码以响应不安全的请求时,这是对客户端(和任何中间组件)的隐式指令,即先前缓存的表示应该无效。
因此,我们通常希望将编辑设置为对最重要资源的不安全请求,如果更改成功则需要刷新这些资源。
因此,如果我想获取报告及其元数据?
GET /A3E7205B-6DC6-4685-9133-2759F739BC22
如果我想要没有报告本身的元数据?
HEAD /A3E7205B-6DC6-4685-9133-2759F739BC22
如果我想更改报告
POST /A3E7205B-6DC6-4685-9133-2759F739BC22
PUT
并且PATCH
是具有更具体语义的有效替代品POST
,因此很适合在那里使用。
从 REST 的角度来看,创建只是另一种编辑:
资源可以映射到空集,这允许在概念的任何实现存在之前对该概念进行引用——菲尔丁
但是 POST 的一般灵活性的一部分是它支持创建具有不同标识符的资源。因此,如果您愿意,可以这样做。
如果报告不存在;初始化并返回报告
GET 语义应该是安全的——允许缓存通过预加载资源来改善体验,允许蜘蛛抓取它们等等。这并不意味着您不能创建某些东西——HTTP 限制了你的语义,而不是你的实现——只是你需要了解其中的含义。
HTTP 不尝试要求 GET 的结果是安全的。它所做的是要求操作的语义是安全的,因此它是实现的错误,而不是接口或该接口的用户,如果发生任何导致财产损失的结果 - Fielding 2002
你观察到:
POSTing...一个空的身体到端点似乎是错误的
不,没关系,真的。您需要考虑其他一些用例(将空正文发布到确实存在的报告是什么意思?)
但是在创建新报告实际上是免费的并且客户不需要了解详细信息的情况下?然后只需告诉客户GET
代表,并根据需要创建您需要的内容。
推荐阅读
- javascript - 显示导航栏菜单取决于用户身份验证
- python-3.x - 2个问题,Python OverflowError: (34, 'Result too large') 和错误的函数结果
- python - 从文本中删除除“\n”和“/”之外的所有特殊字符
- c# - 关于 lambda 表达式的非常基本的问题
- slurm - SLURM 提交脚本是在计算节点还是控制器机器上运行?
- javascript - 使用 React 时如何正确地将事件列表器添加到输入
- rust - 如何在不派生结构的情况下使用 serde_json 获取 JSON 文件中的一个特定项目?
- linux - 内核态与内核空间、用户态与用户空间的关系?
- html - 如何使另一行出现在 Bootstrap 4 的另一行内?
- sql-server - 服务器升级后 Excel 宏上发生 SSL 安全错误