看完《RESTful web API》之后我觉得我(可能不光是我,甚至是 99%的程序员)都对 REST 错误理解了 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
wh0ami
V2EX    问与答

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

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

    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     Solana     5276 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 29ms UTC 07:13 PVG 15:13 LAX 23:13 JFK 02:13
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86