【问题标题】:Rest API Architecture - GET a resource by aliasRest API 架构 - 通过别名获取资源
【发布时间】:2013-12-01 21:05:39
【问题描述】:

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

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

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

提前致谢

【问题讨论】:

    标签: node.js api rest web architecture


    【解决方案1】:

    如果您想保持在 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,所以我相信你需要使用路径参数或查询参数。

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

    【讨论】:

    • 除了 /things/id 之外,还会使用 /things/alias/x 吗?
    • 如果你想学究气,/things/alias/x 是说alias 是things 的子资源。我以前曾见过将路径参数用作“属性”,但对我来说感觉不对,我避免这样做。但是“100%”的宁静不一定是法律,所以请随意添加它作为您自己的答案。 OP 可能会喜欢它,即使它“不那么纯净”。 :)
    • 我喜欢这个答案,因为它对消费者来说是透明的。
    • 感谢 Ray、Hector 和 rdodev。 @Ray,我同意您的回答,但是我认为使用两个不同的 ID 调用一个 URI 时没有指定差异,这对客户端来说不是那么透明。 GET /things/:id?q=alias 或类似的东西怎么样。也许可以将 ID 指定到某个标题中? (但是什么?):-)
    • 一个是别名,一个是客户端的真实ID真的很重要吗?
    【解决方案2】:

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

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

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

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

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

    【讨论】:

    • 感谢 Cormac Mulhall,在我的情况下,我想避免使用两个不同的 URI 调用同一个资源,因为资源的“身份”对我来说非常强大。无论如何,感谢您的 URI 示例。佛朗哥
    • 我完全同意你的结论,但你的例子有一个小问题。 today 资源不是幂等的。一个更好的例子可能是2013/321(一年中的某天)或1384732800(unix 时间)作为2013/11/18 的别名。
    • 我并没有真正关注。为什么不能对today资源做幂等请求?
    • 我通常喜欢这个例子,我认为在获取今天的降雨量的情况下使用它是有意义的。但我认为 nicerobot 关于幂等性的观点对于数据修改请求是有效的:如果我用相同的请求点击 today/rainfall 两次,如果第二次调用落在日期边界的另一侧,则会产生不同的效果。还有一个关于确定性行为的相关点(尽管这不是 REST 要求 AFAIK):端点的行为会根据请求的时间而有所不同。
    • 不完全是。假设你有一个资源/today/color,你在晚上 11.59 有一个资源PUT red,然后在上午 1.34 有一个PUT red,这两个请求都是幂等的。您可以这样做两次,也可以这样做 1,000 次,在所有情况下,/today/color 资源最终将是 red。我认为你们俩的意思是,您可能试图在一个请求中访问资源/aug/20/color,然后在下一个请求中访问/aug/21/color,而您并不打算这样做。是的,如果您实际上不希望 /today/color 不通过该资源进行状态更改,请改为特定于一天
    猜你喜欢
    • 1970-01-01
    • 2018-01-13
    • 1970-01-01
    • 2021-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多