我需要您提供有关 REST Arch 的帮助。 我有一个资源,我可以使用经典的 GET /resource/ID URI 检索它,但该资源有一个别名,有人想通过别名调用它来获取该资源。
有一个很好的方法,通过调用 GET /resource/?alias=x,获取 ID,然后转到详细信息 /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 Rainfall”以及该资源的 URI。如果用户想要今天的降雨量,则可以点击该链接
如果您想保持在 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,所以我相信您需要使用路径参数或查询参数。
顺便说一下,这个选择与查询重写无关。