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