提醒:REST 不关心你的 URI 使用什么拼写
对于同一个模型,两个动词(GET 和 POST)有不同的 URI 可以吗?否则,我该怎么办?
没关系,但有一些与之相关的成本。
让我们回顾一下菲尔丁不得不说的话(2008 年)
REST 旨在用于跨多个组织的基于网络的长期应用程序。REST 接口旨在高效地进行大粒度超媒体数据传输,针对 Web 的常见情况进行了优化,但导致的接口对于其他形式的架构交互来说并不是最佳的。
Fielding 在他的论文中指出的一种复制方式是缓存。他继续将这种风格添加到他对REST的定义中
为了提高网络效率,我们添加缓存约束以形成客户端缓存无状态服务器样式......缓存约束要求对请求的响应中的数据被隐式或显式标记为可缓存或不可缓存。如果响应是可缓存的,则客户端缓存有权将响应数据重用于以后的等效请求。
在 HTTP 中,缓存的语义在RFC 7234中定义;第 4.4 节描述了失效。
当接收到非错误状态码以响应一个不安全的请求方法。
这意味着通过对您的协议细节一无所知的通用客户端的通信可以根据请求和响应中的元数据使它们的陈旧表示的本地副本无效。
(在过去,当我们没有加密所有流量时,这是一个更大的交易;但它仍然适用于 (a) 客户端的本地缓存和 (b) 位于域模型前面的缓存反向代理)。
就 REST 而言,URI 是不透明的;之间没有根本的关系
/A
/A/B
/A/B/C
/A/B/D
/A/E
因此,如果缓存看到/A/B
应该无效,他们可以这样做,但他们不会对其他 URI 做任何事情。
对于 PUT、DELETE、PATCH——这些方法的语义对于有效的请求 URI 来说是非常具体的。
如果您将相同的方法应用于 POST,那么您将“免费”获得缓存失效。
走过一个简单的例子;想象一个网站,我们有
GET /superCoolResource
GET /superCoolResource/editForm
我们想引起一些变化/superCoolResource
,所以我们加载编辑表单,并提交它....
POST ...?
如果我们 POST 到/superCoolResource/editForm
,那么我们告诉客户端如果 POST 成功,则应该重新加载缓存的表单副本。但这可能不是我们想要的——形式更可能保持不变,而 /superCoolResource 是改变的东西。这意味着我们可能想要制作/superCoolResource
目标 URI
GET /superCoolResource/editForm
200 OK
... <form action="/superCoolResource" method="POST"> ....
并且神奇地,客户端的缓存、源服务器的缓存以及任何与对话有关的中间缓存都知道在 POST 成功时驱逐他们的 /superCoolResource 的旧副本。