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



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

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

你对其他方法有什么好主意吗?

提前感谢

一个资源有两个URI(或者说两个URI指向同一个资源)没有错。例如

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

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

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

顺便说一句,客户端不应该构造URI,服务器应该返回一个内容类型格式(HTML、JSON等),其中包含一种识别客户端想要的资源的方法,以及在哪里找到这些资源的URI。例如,HTML中的一个链接,上面写着"Todays Rainbow",并带有该资源的URI。如果用户想要今天的降雨量,请点击该链接

如果你想保持在REST体系结构的约束范围内,你肯定需要使用动词GET。不能添加其他方法。

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

GET /things/:id

使得CCD_ 1可以是或者规范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)
  });
});

您也可以像您建议的那样,将别名作为查询参数。

我怀疑唯一的其他方法可能是使用不同的url(things以外的其他url),但我认为这是虚伪的,因为无论是否使用id或别名,您都希望返回相同的表示。它应该是同一个控制器,并且应该使用GET,所以我认为您需要使用path参数或query参数。

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

最新更新