• 只会建数据库怎么写API?database2api 能帮到你!


    database2api 意为 DataBase to API,即只要有数据库,就可以生成开放 API

    database2api 是一款强大而便捷的工具,主要功能是依据现有的数据库自动生成开放的 API 接口,能够为开发者大幅节省时间与精力,尤其适用于那些已拥有数据库且需要提供 API 接口,或者仅会构建数据库、而需要迅速实现 API 接口的场景。

    一、功能介绍

    database2api 能够智能地解析数据库结构,并根据用户的需求和配置,自动生成相应的 API 接口,让您无需繁琐的手动编码,即可轻松实现数据库与外部应用的交互。

    在当今的软件开发中,数据库与外部应用的交互是至关重要的环节。然而,手动编写 API 接口往往是一项耗时且容易出错的工作,而且需要具备某一种后端编程语言,门槛较高。database2api 的开发旨在解决这一痛点,让开发者能够更专注于业务逻辑的实现,而无需在接口开发上花费过多的时间和精力。

    例如,在一个快速发展的项目中,数据库结构可能会频繁变动。使用 database2api ,您只需更新配置文件,即可快速重新生成适应新结构的 API 接口,极大地提高了项目的敏捷性。

    无论您是个人开发者还是团队,database2api 都将是您提升开发效率、加速项目进程的得力助手。

    二、技术原理

    本工具使用 Ktor 作为底层框架,JDBC 作为数据库访问层,通过 java.sql.DatabaseMetaData 获取到数据库结构,再通过 Ktor 动态注册 API 路由,实现直接由数据库生成 API 接口。

    三、目前已支持的数据库

    目前,database2api 已支持以下多种主流数据库:

    • ✅ Sqlite
    • ✅ MySQL
    • ✅ Postgresql
    • ✅ Microsoft SQL Server
    • ✅ MariaDb

    四、优势

    1. 高效便捷:通过简单的配置文件,即可快速生成所需的 API 接口,大大提高开发效率。
    2. 广泛的数据库支持:涵盖了常见的数据库类型,满足不同项目的需求。
    3. 易于维护:生成的接口结构清晰,代码规范,便于后续的扩展和测试。

    五、如何使用

    • 点击下载 或直接克隆仓库编译为 jar,文件名为 database2api.jar
    • 目录结构预览
    │  database2api.jar  <-- 主程序(必选)
    └─ data
         └─ ext          <-- 扩展 API 放置目录(可选)
         └─ web          <-- 静态文件目录(可选)
         └─ setting.ini  <-- 配置文件(必选)
    
    • 配置文件 setting.ini 样例
    # API 默认端口
    API_PORT=8080
    # 生成API的前缀,如设置 api/v1 后,则API变为:http://localhost:{PORT}/api/v1/xxxxxx
    API_PREFIX=api
    # 是否启用 API 文档,地址 http://localhost:{PORT},设为 false 不会生成 API 文档
    API_INDEX_ENABLED=true
    # 是否启用接口授权访问功能,默认false,所有 API 无需授权认证即可访问
    API_AUTH_ENABLED=false
    # 接口授权访问,支持:Basic, JWT。(以后可能会支持其他的授权认证方式)
    API_AUTH_TYPE=JWT
    # 接口允许访问的用户名密码列表
    API_AUTH_USERS=admin:123456,user:1234
    # 数据库默认链接地址(主要需要这里的数据库连接字符串,其他数据库连接字符串样例在下方)
    DB_URL=jdbc:sqlite://G:/database2api-test/sqlite/fqb.db
    # 数据库用户名
    DB_USER=
    # 数据库密码
    DB_PWD=
    # 生成API的数据表名称,为空则所有的表都生成API,多个使用英文逗号分割
    INCLUDE_TABLES=
    # 需要忽略的数据表名称,如果不为空,则指定的表名被过滤,多个使用英文逗号分割
    IGNORED_TABLES=
    # 是否启用静态网站,启用后,则创建web目录,放入静态资源即可访问
    STATIC_WEB_ENABLED=true
    # 是否开启扩展API,允许用户使用JS代码使用自定义SQL查询数据库
    EXT_API_ENABLED=true
    
    • 启动方式:
    java -jar database2api.jar
    

    启动后控制台日志如下:

    2024-07-11 23:43:14.367 [main] DEBUG cn.hutool.log.LogFactory - Use [Slf4j] Logger As Default.
    2024-07-11 23:43:14.369 [main] INFO  com.mrhuo.Database2Api - Database2Api: 开始初始化
    2024-07-11 23:43:14.382 [main] INFO  com.mrhuo.Database2Api - Database2Api: 开始初始化 API 配置
    2024-07-11 23:43:14.431 [main] DEBUG cn.hutool.setting.SettingLoader - Load setting file [D:\work\java\database2api\data\setting.ini]
    2024-07-11 23:43:14.444 [main] INFO  com.mrhuo.Database2Api - Database2Api: 静态网站主页[http://127.0.0.1:8080/web/index.html]
    2024-07-11 23:43:14.444 [main] INFO  com.mrhuo.Database2Api - Database2Api: 开始初始化数据库
    2024-07-11 23:43:14.444 [main] INFO  com.mrhuo.Database2Api - Database2Api: 使用链接字符串[jdbc:sqlite://G:/database2api-test/sqlite/fqb.db]
    2024-07-11 23:43:15.236 [main] INFO  com.mrhuo.Database2Api - Database2Api: 获取到所有数据表的表结构
    2024-07-11 23:43:15.236 [main] INFO  com.mrhuo.Database2Api - Database2Api: 已保存到文件[D:\work\java\database2api\data\tables.json]
    2024-07-11 23:43:15.236 [main] INFO  com.mrhuo.Database2Api - Database2Api: 初始化全部成功
    2024-07-11 23:43:15.383 [main] INFO  ktor.application - Autoreload is disabled because the development mode is off.
    2024-07-11 23:43:16.241 [main] INFO  ktor.application - Application started in 0.928 seconds.
    2024-07-11 23:43:16.242 [main] INFO  ktor.application - Application started: io.ktor.server.application.Application@299266e2
    2024-07-11 23:43:16.633 [DefaultDispatcher-worker-1] INFO  ktor.application - Responding at http://127.0.0.1:8080
    

    启动成功后目录结构变为:

    │  database2api.jar
    └─ data
         │  setting.ini
         │  tables.json      <-- 这是数据库中所有的表名称,下次启动时不会从数据库重新获取,直接使用此文件。如数据库已更新,则删除此文件
         │  table_names.json <-- 这是数据库中所有表结构,下次启动时不会从数据库重新获取,直接使用此文件。如数据库已更新,则删除此文件
         └─ ext              <-- 扩展 API 放置目录(可选)
         └─ web              <-- 静态文件目录(可选)
             └─ index.html   <-- 这是静态网页默认首页
    

    打开浏览器,访问 http://127.0.0.1:8080 ,如果开启了配置 API_INDEX_ENABLED=true,此时界面如下:

    端口设置见配置文件 API_PORT=8080

    如果设置 API_INDEX_ENABLED=false,则不会显示 API 文档界面。

    随便找个测试获取所有数据:http://127.0.0.1:8080/api/DEVICE/all

    这里的 DEVICE 是数据库中的表名

    再测试分页显示数据:http://127.0.0.1:8080/api/DEVICE/paged

    可以看到,仅仅是配置了数据库链接,就自动生成一个完整的可用的API接口,非常方便。

    六、接口安全性

    现已支持 Basic、JWT 两种授权认证方式,配置如下:

    # 是否启用接口授权访问功能
    API_AUTH_ENABLED=false
    # 接口授权访问,支持:Basic, JWT,
    API_AUTH_TYPE=JWT
    # 接口允许访问的用户名密码列表
    API_AUTH_USERS=admin:123456,user:1234
    

    Basic 授权

    • 需要配置 API_AUTH_ENABLED=true 开启API授权
    • 需要配置 API_AUTH_TYPE=Basic (注意大小写)
    • 需要配置 API_AUTH_USERS=user:pass,user1:pass1,设置允许访问的用户密码对

    Basic 授权失败演示

    授权失败

    Basic 授权成功演示

    JWT 授权

    • 需要配置 API_AUTH_ENABLED=true 开启API授权
    • 需要配置 API_AUTH_TYPE=JWT (注意大小写)
    • 需要配置 API_AUTH_USERS=user:pass,user1:pass1,设置允许访问的用户密码对

    注意,JWT授权,单独提供了一个用户登录接口,路劲为 /api/api-user-login,前面的 api 前缀,由配置 API_PREFIX 来设置

    JWT 验证失败演示

    JWT 验证成功演示

    JWT 用户登录成功演示

    JWT 用户登录失败演示

    七、高级内容

    扩展 API

    扩展 API 简单来说就是写一个JS文件,作为API扩展接口,执行数据库访问,完成API请求的功能。

    开启方式,在配置文件里设置 EXT_API_ENABLED=true,并在 data 目录下创建 ext 目录,创建文件 get_hello.js,内容如下:

    注意:文件名格式为 {get|post}_{api_name}.js

    function main() {
        var name = context.query.name || "no name";
        return "hello " + name;
    }
    

    规定函数名 main,重新启动 database2api 后可看到控制台提示:

    2024-07-14 17:26:58.380 [main] INFO  com.mrhuo.plugins.RoutingKt - Database2Api.scriptApiRoute: 创建扩展API[GET:/api/ext/hello]成功
    

    访问该API http://127.0.0.1:8080/api/ext/hello?name=mrhuo 时,返回结果如下:

    {
      "code": 0,
      "msg": "OK",
      "data": "hello mrhuo"
    }
    

    注意:扩展API因为用到了脚本引擎来解释执行脚本代码,性能不是太好,如非必要,请勿过度依赖此功能。

    扩展API中目前支持 db, context 两个对象。

    • db 对象主要用于数据库查询,提供 db.query(sql), db.queryOne(sql), db.exec(sql) 这三个方法
    • context 对象主要用于当前请求参数的获取,提供 context.uri, context.method, context.headers, context.query, context.body 五个对象

    附1:数据库连接字符串模板

    注意如果数据库有密码,还需要配置 DB_USERDB_PWD

    1. Sqlite
    DB_URL=jdbc:sqlite://G:/db.db
    
    1. MySQL
    DB_URL=jdbc:mysql://127.0.0.1:3306/db?useSSL=false&serverTimezone=UTC&charset=utf8mb
    
    1. PostgreSQL
    DB_URL=jdbc:postgresql://127.0.0.1:5432/db
    
    1. Microsoft SQL Server
    DB_URL=jdbc:sqlserver://;serverName=rm-abc.sqlserver.rds.aliyuncs.com;port=1433;databaseName=db_cms
    
    1. MariaDb
    jdbc:mariadb://127.0.0.1:3306/mysql?useSSL=false&serverTimezone=UTC&charset=utf8mb4
    

    附2:开源地址

    https://github.com/mrhuo/database2api
    

    版权提示

    MIT

  • 相关阅读:
    如何让WPF中的ValidationRule实现参数绑定
    重磅!首次揭露中国人群血液病毒组特征
    Flutter插件开发流程
    诊所病例信息管理系统(Java+Web+SSH+MYSQL)
    LeetCode 209 长度最小的子数组
    Python:函数调用的实参
    MongoDB的管理与监控
    nginx反向代理与负载均衡
    网络安全技能差距的高成本
    docker容器化搭建mysql8.0的主从复制 [详细说明,步骤简洁]
  • 原文地址:https://www.cnblogs.com/MrHuo/p/18309261/database2api