数据服务支持编写函数,并将一个或多个相同类型的函数关联至API,使得函数可以作为API的过滤器进行使用。本实践以Aviator函数及对应语法为例,为您介绍几种函数逻辑的编写示例。

应用场景

  • 如果将函数设置为API的前置过滤器,当API被调用时,函数可以对API的请求参数进行预先处理。
  • 如果将函数设置为API的后置过滤器,当API被调用时,函数可以对API的返回结果进行二次加工和改造。

操作指南

函数的输入参数示例

说明 Aviator代码中的默认变量名称$0,指的是函数的整体输入。
  • 场景一:Aviator函数作为API的前置过滤器
    此时,API的请求参数及参数值将按照JSON结构(单层JSON)作为函数的整体输入。请求参数作为函数输入时的示例如下:
    ## 请求参数为user_id
    ## API调用时传入了多个参数值:user_id = (0,1,2)
    {
      "user_id": [0,1,2]
    }
  • 场景二:Aviator函数作为API的后置过滤器
    此时,API的返回结果将按照JSON结构(多层JSON)作为函数的整体输入。返回结果作为函数输入时的示例如下:
    ## 返回结果共包含3列:user_id,city,tags
    ## API调用后共返回了3条符合条件的数据记录(见rows)
    {
      "data": {
        "totalNum": 3,
        "pageSize": 10,
        "rows": [
          {
            "user_id": 2,
            "city": "BJ",
            "tags": "B,D,dongcs,ccccc"
          },
          {
            "user_id": 3,
            "city": "SH",
            "tags": "A,C,D,F"
          },
          {
            "user_id": 1,
            "city": "HZ",
            "tags": "A,B,C"
          }
        ],
        "pageNum": 1
      },
      "errCode": 0,
      "requestId": "0bb211c516357674333185698eb07b",
      "errMsg": "success",
      "apiLog": null
    }

函数的使用示例

场景一:Aviator函数作为API的前置过滤器。使用示例如下所示:
  • 示例1:调用函数时,函数对客户端传入的请求参数的值进行修改。
    • Aviator函数:
      ## 对于请求参数user_id,在客户端的原始传值为user_id=1
      ## 经过滤器处理后,实际查询的传值为user_id=2
      if $0.user_id == 1
      {
          $0.user_id = $0.user_id + 1;
      }
      return $0;
    • 函数的输入及输出:
      ## 输入:
      {
          "user_id": 1
      }
      
      ## 输出:
      {
        "user_id": 2
      }
  • 示例2:调用函数时,函数对客户端未传值的请求参数进行赋值(即:当请求参数为非必填且未传值时进行赋值)。
    • Aviator函数:
      ## 对于请求参数user_id,在客户端的原始传值为user_id=
      ## 经过滤器处理后,实际查询的传值为user_id=1
      $0.user_id = 1;
      return $0;
    • 函数的输入及输出:
      ## 输入:
      {
          "user_id": ""
      }
      
      ## 输出:
      {
        "user_id": 1
      }
  • 示例3:调用函数时,当客户端传入的请求参数的值为数组时(即:对一个请求参数传入多个值),函数将根据循环条件,遍历每一个值并修改为新值。
    • Aviator函数:
      ## 对于请求参数user_id,在客户端的原始传值为user_id=(0,1,2)
      ## 经过滤器处理后,实际查询的传值为user_id=(1,2,3)
      user_id = $0.user_id;
      for index in user_id
      {
          user_id[index] = index + 1;
      }
      return $0;
    • 函数的输入及输出:
      ## 输入:
      {
        "user_id": [0,1,2]
      }
      
      ## 输出:
      {
        "user_id": [
          1,
          2,
          3
        ]
      }
场景二:Aviator函数作为API的后置过滤器。使用示例如下所示:
  • 示例1:调用函数后,函数将对API返回的数据结果(JSON格式)中的某条记录进行修改。
    • Aviator函数:
      ## 首先获取到JSON中的最内层数组rows,接下来对数组进行遍历,当遇到某条记录为"city":"BJ"时,将"tags":""改为"tags":"数据服务"
      rows = $0.data.rows;
      for row in rows
      {
          if(row.city == "BJ")
          {
              row.tags = "数据服务";
          }
      }
      return $0;
    • 函数的输入及输出:
      ## 输入:
      {
        "data": {
          "totalNum": 3,
          "pageSize": 10,
          "rows": [
            {
              "user_id": 2,
              "city": "BJ",
              "tags": "数据服务"
            },
            {
              "user_id": 1,
              "city": "HZ",
              "tags": "A,B,C"
            },
            {
              "user_id": 3,
              "city": "SH",
              "tags": "A,C,D,F"
            }
          ],
          "pageNum": 1
        },
        "errCode": 0,
        "requestId": "0bb211e016357705412263266e571e",
        "errMsg": "success",
        "apiLog": null
      }
      
      ## 输出:
      {
        "data": {
          "totalNum": 3,
          "pageSize": 10,
          "rows": [
            {
              "user_id": 2,
              "city": "BJ",
              "tags": "数据服务"
            },
            {
              "user_id": 1,
              "city": "HZ",
              "tags": "A,B,C"
            },
            {
              "user_id": 3,
              "city": "SH",
              "tags": "A,C,D,F"
            }
          ],
          "pageNum": 1
        },
        "errCode": 0,
        "requestId": "0bb211e016357705412263266e571e",
        "errMsg": "success"
      }
  • 示例2:调用函数后,函数将对API返回的数据结果(JSON格式)的每条记录增加一个常量列。
    • Aviator函数:
      ## 首先获取到JSON中的最内层数组rows,接下来对数组进行遍历,对每条记录均增加一个常量列is_target= "Y"
      rows = $0.data.rows;
      for row in rows
      {
          row.is_target= "Y";
      }
      
      return $0;
    • 函数的输入及输出:
      ## 输入:
      {
        "data": {
          "totalNum": 3,
          "pageSize": 10,
          "rows": [
            {
              "user_id": 2,
              "city": "BJ",
              "tags": "数据服务"
            },
            {
              "user_id": 1,
              "city": "HZ",
              "tags": "A,B,C"
            },
            {
              "user_id": 3,
              "city": "SH",
              "tags": "A,C,D,F"
            }
          ],
          "pageNum": 1
        },
        "errCode": 0,
        "requestId": "0bb211e016357705412263266e571e",
        "errMsg": "success",
        "apiLog": null
      }
      
      ## 输出:
      {
        "data": {
          "totalNum": 3,
          "pageSize": 10,
          "rows": [
            {
              "is_target": "Y",
              "user_id": 2,
              "city": "BJ",
              "tags": "数据服务"
            },
            {
              "is_target": "Y",
              "user_id": 1,
              "city": "HZ",
              "tags": "A,B,C"
            },
            {
              "is_target": "Y",
              "user_id": 3,
              "city": "SH",
              "tags": "A,C,D,F"
            }
          ],
          "pageNum": 1
        },
        "errCode": 0,
        "requestId": "0bb211e016357705412263266e571e",
        "errMsg": "success"
      }
  • 示例3:调用函数后,如果API返回的数据结果(JSON格式)中字段很多,不想逐个判断字段返回值,可以用函数来遍历所有字段,并对有特殊值的字段进行改值。
    • Aviator函数:
      ## 首先获取到JSON中的最内层数组rows,然后对数组rows进行嵌套遍历,即:对数组rows中的每个元素,进一步获取其中的map;当map中的value值为null时,改值为"测试"
      ## 在Aviator语法中,nil是空值常量,相当于其他语法中的null
      rows = $0.data.rows;
      for row in rows
      {
          for index in row
          {
              if(index.value == nil)
              {
                  index.value = "测试"
              }
          }
      }
      return $0;
    • 函数的输入及输出:
      ## 输入:
      {
        "data": {
          "totalNum": 3,
          "pageSize": 10,
          "rows": [
            {
              "user_id": null,
              "city": "SH",
              "tags": "A,C,D,F"
            },
            {
              "user_id": 2,
              "city": "BJ",
              "tags": "数据服务"
            },
            {
              "user_id": null,
              "city": null,
              "tags": "A,B,C"
            }
          ],
          "pageNum": 1
        },
        "errCode": 0,
        "requestId": "0bb211f016372870359913841e52d8",
        "errMsg": "success",
        "apiLog": null
      }
      
      ## 输出:
      {
        "data": {
          "totalNum": 3,
          "pageSize": 10,
          "rows": [
            {
              "user_id": "测试",
              "city": "SH",
              "tags": "A,C,D,F"
            },
            {
              "user_id": 2,
              "city": "BJ",
              "tags": "数据服务"
            },
            {
              "user_id": "测试",
              "city": "测试",
              "tags": "A,B,C"
            }
          ],
          "pageNum": 1
        },
        "errCode": 0,
        "requestId": "0bb211f016372870359913841e52d8",
        "errMsg": "success"
      }

效果展示

说明 API的过滤器中仅支持选择已发布的函数。
API执行结果如下:
## API的输入:
{
  "user_id": ""
}

## API的输出:
{
  "data": {
    "totalNum": 1,
    "pageSize": 10,
    "rows": [
      {
        "is_target": "Y",
        "user_id": 2,
        "city": "BJ",
        "tags": "数据服务"
      }
    ],
    "pageNum": 1
  },
  "errCode": 0,
  "requestId": "0be30a8716357721257118118e2b0f",
  "errMsg": "success"
}