数据服务支持编写函数,并将一个或多个相同类型的函数关联至API,使得函数可以作为API的过滤器进行使用。本实践以Aviator函数及对应语法为例,为您介绍几种函数逻辑的编写示例。
应用场景
- 如果将函数设置为API的前置过滤器,当API被调用时,函数可以对API的请求参数进行预先处理。
- 如果将函数设置为API的后置过滤器,当API被调用时,函数可以对API的返回结果进行二次加工和改造。
操作指南
- 函数的创建、测试、提交、发布、删除、移动、克隆等操作指南,详情请参见创建与管理函数、测试函数、发布函数。
- 使用函数作为API前置和后置过滤器的操作指南,详情请参见创建和使用Aviator函数(过滤器)。
- Aviator函数语法参考请参见函数语法。
函数的输入参数示例
说明 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 }
- Aviator函数:
- 示例2:调用函数时,函数对客户端未传值的请求参数进行赋值(即:当请求参数为非必填且未传值时进行赋值)。
- Aviator函数:
## 对于请求参数user_id,在客户端的原始传值为user_id= ## 经过滤器处理后,实际查询的传值为user_id=1 $0.user_id = 1; return $0;
- 函数的输入及输出:
## 输入: { "user_id": "" } ## 输出: { "user_id": 1 }
- Aviator函数:
- 示例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函数:
场景二: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" }
- Aviator函数:
- 示例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" }
- Aviator函数:
- 示例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" }
- Aviator函数:
效果展示
说明 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"
}