0

我有 3 个模型:锦标赛冠军竞争者

  • 一场比赛有很多冠军
  • 冠军属于锦标赛;_
  • 一个冠军有很多竞争对手

因此,要列出所有锦标赛的所有参赛者,URL 是:

GET https://base.com/tournament/{slug}/competitors

但是要添加一个竞争对手,它与冠军有关,所以:

POST  https://base.com/championships/{id}/competitors

对于同一个模型,两个动词(GET 和 POST)有不同的 URI 可以吗?否则,我该怎么办?

我喜欢这样做:

POST  https://base.com/tournaments/{slug}/championships/{id}/competitors 

没有必要的字段。

4

2 回答 2

2

对于同一个模型,两个动词(GETPOST)有不同的URI可以吗?

这可能会给 API 使用者造成混淆,因此我建议您使用相同的 URI。


请记住,在Roy T. Fielding 的论文第 5 章中描述的 REST 架构风格为构建在此类架构之上的应用程序定义了一组约束。但它没有说明 URI 必须是什么样的。

Martin Fowler 撰写的一篇流行文章中显示的示例解释了 Leonard Richardson 定义的模型,这表明URI 结构看起来友好且易于阅读。虽然它可能是可取的,但它不是REST 应用程序的强制要求。


您可以采用很多有效的方法。如果竞争对手需要锦标赛存在而锦标赛需要锦标赛存在,您可以使用以下方式表达这种层次结构

/tournaments/{slug}
/tournaments/{slug}/championships/{id}
/tournaments/{slug}/championships/{id}/competitors/{id}

但是最后一个 URI 可能被认为太长并且可能难以记住。所以你可以简单地拆分它,然后你不需要发送很多参数:

/tournaments/{slug}
/championships/{id}
/competitors/{id}

如果您需要执行任何过滤,您可以使用查询参数。例如:

/championships/{id}?tournament={slug}
于 2018-06-19T08:19:16.587 回答
0

提醒: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 的旧副本。

于 2018-06-19T13:49:57.400 回答