# DBAPI 如何使用复杂多层嵌套 JSON 作为请求参数

DBAPI 作为一款后端低代码接口快速开发工具,不仅能实现简单的字段传参给 SQL,也可以实现复杂的 JSON 传参。下面我们就来看一个实际的例子。

# 背景需求

  • 假设我们现在 MySql 有一张 GDP 表,内容如下:

  • 我们的请求参数格式是这样的:
{
  "province": {
    "name": "广东",
    "cities": [
      {
        "name": "深圳",
        "code": "518000"
      },
      {
        "name": "广州",
        "code": "510000"
      }
    ]
  }
}
  • 这是一个复杂的嵌套的 JSON,那如何才能把参数中的两个城市深圳和广州取出来,作为参数传递给 SQL 呢?
  • 先定一个目标:查询参数中的城市的 GDP。接下来开始操作。

# 实操

  • 创建数据源,将 mysql 账户地址填上并创建

  • 在分组上创建 API

注意在基本信息的Content Type中一定要选择application/json,然后将 json 参数填入其中。

在执行器中选择刚才创建的数据源,并填写 sql,注意 sql 中的参数我们这样获取:

 #{province.cities[0].name}   #{province.cities[1].name}

  • 保存并发布 API

# 验证

  • 最后我们来验证数据,我们来到请求测试页面,点击发送请求,可以看到查询到了深圳和广州的数据。完成!

# 解释

  • json 取值就是通过.符号来取字段值,如果是数组类型,可以用[下标]的方式来取出对应的元素。

# 扩展

  • 如果 json 参数中的 cities 数组不是 2 个元素,是 3 个元素怎么办呢?那 SQL 不就只能接收 2 个参数了吗?能否根据参数数组中的个数自动接收参数呢?

  • 当然可以!那就要用到类似 Mybatis 的动态 SQL 语法了!我们修改 API,修改 SQL 为以下内容,然后保存并发布 API。

select * from gdp where city in
<foreach open="(" close=")" collection="province.cities" separator="," item="city" index="index">
#{city.name}
</foreach>

  • 接下来修改参数为 3 个城市,发送请求,可以看到查询结果正确!

  • 那么这一段动态 SQL 如何解释呢

  • collection="province.cities" 表示将province.cities取出来,它是一个数组,对这个数组进行循环遍历

  • item="city"表示循环遍历的时候对每个元素进行命名为 city

  • 所以最后取值的时候用#{city.name}来取值

  • 不熟悉的同学可以学习下 mybatis 动态 SQL 语法