本文描述了後端開發服務返回值定製的一些痛點,以及如何使用Gateway 來優雅的解決這些問題前端
在咱們開發系統的時候,會遇到一些很噁心的問題,對於一個業務對象,針對不同的場景,對外輸出的時候,數據字段上須要過濾。好比:用戶信息包括的字段:git
那麼對於以下的場景:github
這個時候就會有不少作法:後端
這個兩種作法,作起來都是比較麻煩的,對於後端開發來講,比較麻煩,特別一些比較核心的業務對象有時候很負責,場景不少。api
咱們使用網關後,能夠使用聚合的功能,聚合返回數據。在有些時候,聚合的返回值有一些對前端不友好,舉個例子:ui
這個API返回:.net
{ "code": 0, "data": { "f1": "api1-field1", "f2": "api1-field2" } }
這個返回數據: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支持對後端的返回值和聚合結果從新根據模板渲染,用這個功能能夠定製返回對象的字段,格式等等。
假設user的API返回值是:
{ "code": 0, "data": { "id": 1, "name": "zhangsan", "bank": "123456" } }
那麼咱們能夠在Gateway上定義2個API分別爲:
使用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")
使用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返回值的定製化功能,而且這些都是動態的,能夠隨時調整。解放了後端的部分開發工做。