首页 > 解决方案 > API 的初始化和存在端点

问题描述

要求

注意:一份报告要么存在,要么不存在,而且永远不会超过一份

理念一

但是如何初始化呢?POST将一个空的PUT主体插入到端点似乎是错误的(POST因为我们知道资源在哪里;PUT因为我们不希望那里什么都没有),但也许这只是我。另一种选择可能是GET /account/{id}/report/init.

想法 2

但是如何检查报告是否存在?

问题

我的两种方法都以不同的方式不足。在遵守 REST 原则的同时满足要求的适当方法是什么?

标签: restapihttp

解决方案


在遵守 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代表,并根据需要创建您需要的内容。


推荐阅读