本文描述了后端开发服务返回值定制的一些痛点,以及如何使用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返回值的定制化功能,而且这些都是动态的,能够随时调整。解放了后端的部分开发工做。