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 文档,在每一个请求都返回超媒体链接又如何?对于一个客户端,该如何写代码获得梁静茹的所有歌曲?
所以我认为,对于机器来说,超媒体并没有什么卵用,超媒体只对人类才富有意义。 你们觉得呢?
1
Jiavwen 2017-03-10 23:50:48 +08:00
web 里的资源不是独立存在的,它们往往和其他资源存在着关联,返回的资源里带有与之相关的其他资源的链接有个好处是不管人还是机器都能知道这个资源可能和另一个种类的资源有着关联而且通过那个链接能直接访问到与之相关的资源。
|
3
Jiavwen 2017-03-13 21:07:56 +08:00
@wh0ami 第三方集成用,比如你的服务卖给别的企业,他们能在这个 API 的基础上做自己的二次开发进行一些产品定制等等。还有自己自动化测试也很有用。
|