iT邦幫忙

2018 iT 邦幫忙鐵人賽
1

Spring HATEOAS

或許你會覺得這又是啥?

其實是 Hypermedia as the Engine of Application State 縮寫啦.

那這個在 Spring Data 裡面你只要是用 @RepositoryrestResource 他回傳的就是這個格式, 這邊還有個好處是, 你只要使用 SpringData 操作的不管是 MongoDB ElasticSearch 還是 傳統資料庫, 他提供的 Rest API 就是這個相同的結構, 你們前端也不用 呼天喊地 辛苦的接不同格式資料.

好了那實際上有什麼差別? 又要用在哪個時間點?

好了舉例來說這是我們傳統回覆給前端資料庫裡面的一列資料

{
  "name": "Alice"
}

下面則是帶有 HATEOAS 格式的結構

{
  "studentid": "65874115",
  "name": "Alice",
  "classid": "6866",
  "_links": {
    "self": {
      "href": "http://localhost:8080/student/65874115"
    },
    "class": {
      "href": "http://localhost:8080/class/6866"
    }
  }
}

關於這個學生的相關資料, 如 在哪一班?
前端只需要從 _links 抽出 class 這個資訊位置, 再去呼叫就可以取得相關資料了.

你也許會想說, 啊脫褲子放屁....都有 classid 了前端知道位置自己去查就好啦....

But... 人生最厲害就是這個But....

若是還要考慮到 API 版本的控管勒?

那你前端不就改到瘋掉 每次都改 v -> v2 -> v3 再上架....

你早晚會被前端砍

但如果你可以提供這個的資訊.

{
  "studentid": "65874115",
  "name": "Alice",
  "classid": "6866",
  "_links": {
    "self": {
      "href": "http://localhost:8080/api/v1/student/65874115"
    },
    "class": {
      "href": "http://localhost:8080//api/v2/class/6866"
    }
  }
}

在資料格相容的情況下 _links.class 指的位置不一樣, 對前端來說他就完全不需要去修正他的 程式 或 url 定義等等....

這不是皆大歡喜.....XD


上一篇
Day 32 - Configuration meta-data in Spring Boot
下一篇
Day 34 - Define entity resource link in spring data rest
系列文
30天從零開始 使用 Spring Boot 跟 Spring Cloud 建構完整微服務架構35

尚未有邦友留言

立即登入留言