RESTful --- 要有HATEOAS才叫RESTful?
Written on March 27th, 2018 by Richard LinRESTful到底是REST什麼?
REST為REpresentational State Transfer的簡寫,其意義在於在我們看到URL的同時就能預期到自己會得到的結果。
而其達到的方法就是將物件用「資源」的形式去定義,並使用不同的動作對資源進行操控,例如HTTP的Get Post Update等等的動作,最後用Json Xml或其他格式呈現出來結果。
HATEOAS??
HATEOAS是啥,為何RESTful的設計者說沒有HATEOAS就不算是RESTful?
HATEOAS為Hypermedia As The Engine Of Application State的縮寫(怎麼又是縮寫),其所想呈現的意義就是所有與server的互動都可以透過api完成。平常的api我們想對資源進行操控,我們必須事先知道各個接口的定義以及權限等等問題。但設計者希望能夠解決這個問題,而如何解決請看以下範例。
首先我們發出一個http request
GET /account/12345 HTTP/1.1
Host: somebank.org
Accept: application/xml
得到以下response
HTTP/1.1 200 OK
Content-Type: application/xml
Content-Length: ...
<?xml version="1.0"?>
<account>
<account_number>12345</account_number>
<balance currency="usd">100.00</balance>
<link rel="deposit" href="https://somebank.org/account/12345/deposit" />
<link rel="withdraw" href="https://somebank.org/account/12345/withdraw" />
<link rel="transfer" href="https://somebank.org/account/12345/transfer" />
<link rel="close" href="https://somebank.org/account/12345/close" />
</account>
這時回傳的本文中還包含了可以對這資源進行操縱的url,且如果帳戶餘額小於0時的回傳會是。
HTTP/1.1 200 OK
Content-Type: application/xml
Content-Length: ...
<?xml version="1.0"?>
<account>
<account_number>12345</account_number>
<balance currency="usd">-25.00</balance>
<link rel="deposit" href="https://somebank.org/account/12345/deposit" />
</account>
因為帳戶中沒有錢了所以只能對deposit做操作。
因此HATEOAS就是能讓api有更好的操縱,讓整個RESTful又更REST了。
個人覺得這是個不錯的特色,但似乎許多教學都略過這個部分,或許是這個feature的實現比較困難吧。