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 文档,在每一个请求都返回超媒体链接又如何?对于一个客户端,该如何写代码获得梁静茹的所有歌曲?
所以我认为,对于机器来说,超媒体并没有什么卵用,超媒体只对人类才富有意义。 你们觉得呢?
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.