HATEOAS是什么?
- HATEOAS的全称是Hypertext As The Engine Of Application State,也就是用超媒体驱动应用状态。我们知道REST是一种架构方式,它只是指定了需要遵循的基本原则,但是都比较宽泛,属于弱约束。我们需要一种更加具体的约束条件来指导我们的编码。这就是HATEOAS,它是一种特殊的RESTful规范。
- 通常我们开发 RESTful API 提供接口服务时,会有一份前后端对接的文档,这个文档里包含了每一个接口的请求地址、参数、响应内容等信息,虽然我们会对这些接口根据业务模块进行分类或者分组,但其实,每一个接口都是独立的,他们之间没有关系。这是不采用 HATEOAS 的接口开发方式。
- 与之相比,HATEOAS 可以类比我们日常浏览网页。比如,我们日常浏览网站的时候,并不需要分别记住首页、文章列表、个人主页等功能页面的地址,而是,进入首页后,可以通过超链接的方式,进入任何与当前页面相关的页面。包含 HATEOAS 特性的 RESTful API 与之类似,就是在相应结果中,包含了与当前内容相关的接口的地址。这样,我们只需要知道一个「根接口」的地址,就可以像浏览一个网站一样,得到所有 API 的请求地址。
HATEOAS 例子
请求一个银行账户接口,账户ID为12345GET /accounts/12345HTTP/1.1
Host: bank.example.com
HATEOAS风格返回结果如下HTTP/1.1 200 OK
{
"account": {
"account_number": 12345,
"balance": {
"currency": "usd",
"value": 100.00
},
"links": {
"deposits": "/accounts/12345/deposits",
"withdrawals": "/accounts/12345/withdrawals",
"transfers": "/accounts/12345/transfers"
}
}
}
除了返回的账户结果信息,还有一个links字段,里面含有存钱、取钱、转账操作的接口地址。客户端可以通过返回的links继续向下获取更多的信息。
还没完,我们再请求另一个账户,账户ID为54321GET /accounts/54321HTTP/1.1
Host: bank.example.com
HATEOAS风格返回结果如下HTTP/1.1 200 OK
{
"account": {
"account_number": 54321,
"balance": {
"currency": "usd",
"value": -25.00
},
"links": {
"deposits": "/accounts/12345/deposits"
}
}
}
因为账户上余额为负数,同时links字段中可供调用的接口变为了只有存钱接口,因为余额为负不能取钱和转账,接口本身还有条件判断功能!
优点
- 只要知道了一个初始的 API 资源地址,就能动态地发现与之相关的资源和可用的操作,API 接口之间就像网页与网页之间一样,通过超链接的方式连接了起来。前端用起来非常丝滑
- 客户端无需使用硬编码的方式来保存每个接口的地址,只需要业务流程中涉及的每一个步骤就可以了
- 这样一来,进一步解耦前后端,更加优雅。
代价
- 后端需要遵循这样的规范,提高了后端工程化的要求。
发表回复