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特性

更多特性

相关文章
相关标签/搜索