我需要您关于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参数。
顺便说一句,这种选择与查询重写无关。