V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
wh0ami
V2EX  ›  问与答

看完《RESTful web API》之后我觉得我(可能不光是我,甚至是 99%的程序员)都对 REST 错误理解了

  •  
  •   wh0ami · 2017-03-10 11:43:48 +08:00 · 2000 次点击
    这是一个创建于 2846 天前的主题,其中的信息可能已经有所发展或是发生改变。

    1.超媒体 2.超媒体 3.超媒体

    如果你不了解超媒体对 REST 的意义,可能我们根本就无法讨论接下来要探讨的主题。 按照 Roy Fielding 的定义,只有超媒体引擎驱动的才是真正的 RESTful 。

    仅仅使用 Richardson 成熟度模型 2 级-(使用 HTTP 动词设计 API )根本称不上是 RESTful API. 真正的 RESTful API 只需要给你一个入口,比如 http://www.example.com. 客户端每一个请求操作返回的内容中都带有超媒体链接提供接下来可操作的选择,客户端依据这些选择做下一步状态转换,直至任务完成。

    这给我带来一个极大的困惑,超媒体对于非人类用户到底有什么意义? 在一个完全意义的 REST 系统中,比如 WEB HTML ,每一个链接都是一个超媒体,人类用户可以自行判断我需要浏览哪一个链接(下一页,发帖,删除等)。但是对于非人类用户的场景,系统如何判断做哪个选择?

    考虑这样一个系统,我归纳整理一个歌曲资源库,外部系统通过 api 获得歌曲资源。 GET http://my.example.com/songs

    GET http://my.example.com/songs/{id}

    GET http://my.example.com/singers/{id}

    GET http://my.example.com/singers/{id}/birthday

    GET http://my.example.com/singers/{id}/gender

    GET http://my.example.com/singers/{id}/songs

    POST http://my.example.com/songs/

    PUT http://my.example.com/songs/{id}

    DELETE http://my.example.com/songs/{id}

    99%的程序员可能觉得这样就已经是一个 RESTful API 了,但按照 Fielding 的定义,每一个请求返回的结果中必须带有指向其他资源的链接。比如 http://my.example.com/songs/{id}带有指向 http://my.example.com/singers/{id}的信息, singer 又带有指向 http://my.example.com/singers/{id}/birthday 的信息。

    我的困惑是,这些超媒体对于一个人类用户(通过每次获得的超媒体链接选择下一个资源)或者爬虫(通过超媒体获得所有资源)是有意义的,但对于一个有特定目标的程序来说没有任何意义。

    例如我想获得梁静茹有哪些歌,我会先: GET http://my.example.com/singers

    得到梁静茹的 URI ,然后 GET http://my.example.com/singers/Liangjingru/songs/

    在这个过程中,我无需上述的超媒体,只需要阅读 API 文档就可以知道。 有人会反驳说,这样严重依赖 API 文档的阅读,每个人都是开发了 FIAT 文档,不利于重用。

    我的问题是,我使用 IANA 注册过的 API 文档,在每一个请求都返回超媒体链接又如何?对于一个客户端,该如何写代码获得梁静茹的所有歌曲?

    所以我认为,对于机器来说,超媒体并没有什么卵用,超媒体只对人类才富有意义。 你们觉得呢?

    5 条回复    2017-03-14 20:12:42 +08:00
    Jiavwen
        1
    Jiavwen  
       2017-03-10 23:50:48 +08:00
    web 里的资源不是独立存在的,它们往往和其他资源存在着关联,返回的资源里带有与之相关的其他资源的链接有个好处是不管人还是机器都能知道这个资源可能和另一个种类的资源有着关联而且通过那个链接能直接访问到与之相关的资源。
    wh0ami
        2
    wh0ami  
    OP
       2017-03-13 14:42:07 +08:00
    @Jiavwen 我的问题就是,对于机器,除了爬虫引擎外有什么用?
    Jiavwen
        3
    Jiavwen  
       2017-03-13 21:07:56 +08:00
    @wh0ami 第三方集成用,比如你的服务卖给别的企业,他们能在这个 API 的基础上做自己的二次开发进行一些产品定制等等。还有自己自动化测试也很有用。
    wh0ami
        4
    wh0ami  
    OP
       2017-03-13 21:14:23 +08:00
    @Jiavwen 没错,我就是在做自动化测试。我做出一个 RESTful 的 API 给别人使用,用户仍然需要阅读我的 API 文档才能工作。我的思考是,我的 API 有没有包含超媒体对用户没有任何区别。

    除了 HTML WEB ,什么场景下的超媒体会有意义呢?
    Jiavwen
        5
    Jiavwen  
       2017-03-14 20:12:42 +08:00
    @wh0ami 额。。这个你可以再深入研究下
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5894 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 02:01 · PVG 10:01 · LAX 18:01 · JFK 21:01
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.