Rest API 架构 - 通过别名获取资源

问题描述 投票:0回答:2

我需要您提供有关 REST Arch 的帮助。 我有一个资源,我可以使用经典的 GET /resource/ID URI 检索它,但该资源有一个别名,有人想通过别名调用它来获取该资源。

有一个很好的方法,通过调用 GET /resource/?alias=x,获取 ID,然后转到详细信息 /resource/ID。

您对其他方法有什么好的想法吗?

node.js rest architecture api-design
2个回答
4
投票

一个资源拥有两个 URI(或者换句话说,两个 URI 指向同一资源)并没有什么问题。例如

GET www.myweatherapi.com/2013/11/18/rainfall

GET www.myweatherapi.com/today/rainfall

可以都指向同一个资源。您可以说后者是前者的别名,反之亦然,这并不重要,它们都标识相同的资源。您不需要开始显式地将某些内容标记为其他内容的别名。

如果别名是临时的并且将来可能会消失,您可以使用 307 响应、临时重定向。这告诉客户端他们应该转到不同的 URI 来查找资源,但不要假设将来会如此(例如限制缓存此资源的时间)。

顺便说一句,客户端不应该构造 URI,服务器应该返回内容类型格式(HTML、JSON 等),其中包含识别客户端所需资源的方法以及在哪里找到它们的 URI。例如,HTML 中的链接显示“Todays Rainfall”以及该资源的 URI。如果用户想要今天的降雨量,则可以点击该链接


2
投票

如果您想保持在 REST 架构的约束范围内,那么您肯定需要使用动词 GET。您无法添加其他方法。

现在您需要决定资源的命名方式。您有一个规范名称(您的 ID)和一个别名。一种方法是设置控制器

GET /things/:id

因此

:id
可以是规范ID别名。所以你会有

app.get('/resources/id', function (req, res) {
  var id = req.params.id;
  if (isAlias(id)) id = resolveAlias(id);
  Thing.findById(id, null, function (err, thing) {
    if (err) res.json(400, err)
    if (thing === null) res.json(404, {"No such id": id})
    res.json(thing)
  });
});

您还可以按照您的建议将别名作为查询参数输入。

我怀疑唯一的其他方法可能是使用不同的网址(

things
以外的其他东西),但我认为这是不诚实的,因为无论你是否使用 id 或别名,你都想返回相同的表示。它应该是相同的控制器,并且您应该使用 GET,所以我相信您需要使用路径参数或查询参数。

顺便说一下,这个选择与查询重写无关。

© www.soinside.com 2019 - 2024. All rights reserved.