据我目前的了解,HATEOAS基本上是与每个响应链接一起发送以及下一步操作的信息。在互联网上可以轻松找到一个简单的示例:银行系统和帐户资源。该示例显示了对帐户资源的GET请求后的此响应
GET /account/12345 HTTP/1.1 HTTP/1.1 200 OK
<?xml version="1.0"?>
<account>
<account_number>12345</account_number>
<balance currency="usd">100.00</balance>
<link rel="deposit" href="/account/12345/deposit" />
<link rel="withdraw" href="/account/12345/withdraw" />
<link rel="transfer" href="/account/12345/transfer" />
<link rel="close" href="/account/12345/close" />
</account>
连同数据一起,有链接告诉下一步可以做什么。如果余额为负,我们有
GET /account/12345 HTTP/1.1 HTTP/1.1 200 OK
<?xml version="1.0"?>
<account>
<account_number>12345</account_number>
<balance currency="usd">-25.00</balance>
<link rel="deposit" href="/account/12345/deposit" />
</account>
这样我们只能存款。很好,如果我们使用Fiddler或通过浏览器发出请求,我们可以轻松地看到可以做什么。这样的信息对于我们发现API的功能以及服务器与客户端的分离非常有用。
但是,要点是,当我们构建客户端(例如带有Javascript的SPA或Android应用程序或许多其他东西)时,我看不到HATEOAS如何继续发挥作用。我的意思是:当我用javascript编码SPA时,我必须知道可以在API中完成什么才能编写代码。
因此,我需要知道资源,所支持的方法,它们期望接收什么以及它们返回什么,以便将ajax调用写入服务器,甚至还可以构建UI。在构建UI时,我必须知道请求帐户后,可以将其存入其中,否则我将无法在UI上提供此选项。另外,我将需要知道URI以进行存款以构建ajax调用。
我的意思是,当我们向API发出请求时,链接确实可以使我们更好地发现和使用API,但是当我们构建客户端时,我们正在构建的应用程序不会简单地查看链接,然后自己渲染正确的UI并进行正确的Ajax调用。
那么,HATEOAS对客户来说有多重要?无论如何,我们为什么还要打扰HATEOAS?