Gateway雜談:定製化輸出API結果

前言

本文描述了後端開發服務返回值定製的一些痛點,以及如何使用Gateway 來優雅的解決這些問題前端

問題一

在咱們開發系統的時候,會遇到一些很噁心的問題,對於一個業務對象,針對不同的場景,對外輸出的時候,數據字段上須要過濾。好比:用戶信息包括的字段:git

  • ID
  • 名稱
  • 銀行帳號

那麼對於以下的場景:github

  • 查看他人信息,展現:ID和名稱
  • 查看本身信息,展現:全部字段

這個時候就會有不少作法:後端

  1. 根據不一樣場景定製不一樣對象,copy屬性後,返回
  2. 定製化的Json字段序列化(例如Jackson的View概念)

這個兩種作法,作起來都是比較麻煩的,對於後端開發來講,比較麻煩,特別一些比較核心的業務對象有時候很負責,場景不少。api

問題二

咱們使用網關後,能夠使用聚合的功能,聚合返回數據。在有些時候,聚合的返回值有一些對前端不友好,舉個例子:ui

  • API-1

這個API返回:.net

{
    "code": 0, 
    "data": {
        "f1": "api1-field1", 
        "f2": "api1-field2"
    }
}
  • API-2

這個返回數據:code

{
  "code": 0,
  "data": {
    "f1": "api2-field1",
    "f2": "api2-field2"
  }
}

那麼這個聚合API的返回值是:對象

{
    "api1": {
        "code": 0, 
        "data": {
            "f1": "api2-field1", 
            "f2": "api2-field2"
        }
    }, 
    "api2": {
        "code": 0, 
        "data": {
            "f1": "api2-field1", 
            "f2": "api2-field2"
        }
    }
}

在這個狀況下,前端須要對這個返回值作特殊處理。若是輸出這個格式那麼對前端更友好,更統一:blog

{
    "code": 0, 
    "data": {
        "api1": {
            "f1": "api1-field1", 
            "f2": "api1-field2"
        }, 
        "api2": {
            "f1": "api2-field1", 
            "f2": "api2-field2"
        }
    }
}

Gateway的RenderTemplate功能

Gateway支持對後端的返回值和聚合結果從新根據模板渲染,用這個功能能夠定製返回對象的字段,格式等等。

解決問題一

假設user的API返回值是:

{
    "code": 0, 
    "data": {
        "id": 1, 
        "name": "zhangsan", 
        "bank": "123456"
    }
}

那麼咱們能夠在Gateway上定義2個API分別爲:

  • /api/users/[0-9]+

使用Gateway的客戶端針對這個API設置RenderTemplate:

api := client.GetAPI(apiID)
ab := c.NewAPIBuilder().Use(api)
ab.AddFlatRenderObject("code", "code")
ab.AddRenderObject("data", "id", "data.id", "name", "data.name", "bank", "data.bank")
  • /api/public/users/[0-9]+

使用Gateway的客戶端針對這個API設置RenderTemplate:

api := client.GetAPI(apiID)
ab := c.NewAPIBuilder().Use(api)
ab.AddFlatRenderObject("code", "code")
ab.AddRenderObject("data", "id", "data.id", "name", "data.name")

咱們也能夠定製更多輸出場景,可是對於後端開發來講,只有一個API。

解決問題二

在聚合API的基礎上設置RenderTemplate:

api := client.GetAPI(apiID)
ab := c.NewAPIBuilder().Use(api)
ab.AddFlatRenderObject("code", "api1.code")
ab.AddRenderObject("data", "api1", "api1.data", "api2", "api2.data")

若是在須要定製api1或者api2的data的部分字段能夠修改成:

api := client.GetAPI(apiID)
ab := c.NewAPIBuilder().Use(api)
ab.AddFlatRenderObject("code", "api1.code")
ab.AddRenderObject("data", "api1", "api1.data.field1,api1.data.field2", "api2", "api2.data")

總結

利用Gateway的renderTemplate功能可以實現後臺API返回值的定製化功能,而且這些都是動態的,能夠隨時調整。解放了後端的部分開發工做。

瞭解更多Gateway特性

更多特性

相關文章
相關標籤/搜索