【发布时间】:2012-02-01 18:52:51
【问题描述】:
HATEOAS 背后的核心理念之一是客户端应该能够从单个入口点 URL 开始,并发现所有可用的公开资源和状态转换。虽然我可以完美地看到它如何与 HTML 和浏览器后面的人点击链接和“提交”按钮一起工作,但我想知道如何将这一原则应用于我(不)幸运处理的问题。
我喜欢 RESTful 设计原则在论文和教育文章中的呈现方式,这一切都很有意义,How to GET a Cup of Coffee 就是一个很好的例子。我将尝试遵循惯例并提出一个简单且没有繁琐细节的示例。让我们看看邮政编码和城市。
问题 1
假设我想设计 RESTful api 来通过邮政编码查找城市。我想出了嵌套在邮政编码中的称为“城市”的资源,因此 http://api.addressbook.com/zip_codes/02125/cities 上的 GET 返回包含例如代表多切斯特和波士顿的两条记录的文档。
我的问题是:如何通过 HATEOAS 发现这样的 url?在http://api.addressbook.com/zip_codes 下公开所有~40K 邮政编码的索引可能是不切实际的。即使拥有 40K 项目索引不是问题,请记住,我已经制作了这个示例,并且存在更大数量的集合。
所以本质上,我想公开的不是链接,而是链接模板,而是像这样:http://api.addressbook.com/zip_codes/{:zip_code}/cities,这违背了原则并且依赖于客户拥有的带外知识。
问题 2
假设我想公开具有某些过滤功能的城市索引:
http://api.addressbook.com/cities?name=X上的 GET 将仅返回名称与X匹配的城市。http://api.addressbook.com/cities?min_population=Y上的 GET 只会返回人口等于或大于Y的城市。
当然这两个过滤器可以一起使用:http://api.addressbook.com/cities?name=X&min_population=Y。
在这里,我不仅要公开 url,还要公开这两个可能的查询选项以及它们可以组合的事实。如果没有客户对这些过滤器的语义和将它们组合成动态 URL 背后的原则的带外知识,这似乎是根本不可能的。
那么 HATEOAS 背后的原则如何帮助使这些微不足道的 API 真正成为 RESTful?
【问题讨论】:
-
顺便说一句,我也在探索 api 版本控制的选项,这就是为什么每个版本都有一个入口点很诱人。 these lines.