database2api 意為 DataBase to API
,即只要有數(shù)據(jù)庫(kù),就可以生成開(kāi)放 API
。
database2api 是一款強(qiáng)大而便捷的工具,主要功能是依據(jù)現(xiàn)有的數(shù)據(jù)庫(kù)自動(dòng)生成開(kāi)放的 API
接口,能夠?yàn)殚_(kāi)發(fā)者大幅節(jié)省時(shí)間與精力,尤其適用于那些已擁有數(shù)據(jù)庫(kù)且需要提供 API
接口,或者僅會(huì)構(gòu)建數(shù)據(jù)庫(kù)、而需要迅速實(shí)現(xiàn) API
接口的場(chǎng)景。
database2api 能夠智能地解析數(shù)據(jù)庫(kù)結(jié)構(gòu),并根據(jù)用戶的需求和配置,自動(dòng)生成相應(yīng)的 API
接口,讓您無(wú)需繁瑣的手動(dòng)編碼,即可輕松實(shí)現(xiàn)數(shù)據(jù)庫(kù)與外部應(yīng)用的交互。
在當(dāng)今的軟件開(kāi)發(fā)中,數(shù)據(jù)庫(kù)與外部應(yīng)用的交互是至關(guān)重要的環(huán)節(jié)。然而,手動(dòng)編寫(xiě) API
接口往往是一項(xiàng)耗時(shí)且容易出錯(cuò)的工作,而且需要具備某一種后端編程語(yǔ)言,門檻較高。database2api 的開(kāi)發(fā)旨在解決這一痛點(diǎn),讓開(kāi)發(fā)者能夠更專注于業(yè)務(wù)邏輯的實(shí)現(xiàn),而無(wú)需在接口開(kāi)發(fā)上花費(fèi)過(guò)多的時(shí)間和精力。
例如,在一個(gè)快速發(fā)展的項(xiàng)目中,數(shù)據(jù)庫(kù)結(jié)構(gòu)可能會(huì)頻繁變動(dòng)。使用 database2api ,您只需更新配置文件,即可快速重新生成適應(yīng)新結(jié)構(gòu)的 API 接口,極大地提高了項(xiàng)目的敏捷性。
無(wú)論您是個(gè)人開(kāi)發(fā)者還是團(tuán)隊(duì),database2api 都將是您提升開(kāi)發(fā)效率、加速項(xiàng)目進(jìn)程的得力助手。
本工具使用 Ktor 作為底層框架,JDBC
作為數(shù)據(jù)庫(kù)訪問(wèn)層,通過(guò) java.sql.DatabaseMetaData
獲取到數(shù)據(jù)庫(kù)結(jié)構(gòu),再通過(guò) Ktor
動(dòng)態(tài)注冊(cè) API
路由,實(shí)現(xiàn)直接由數(shù)據(jù)庫(kù)生成 API
接口。
目前,database2api 已支持以下多種主流數(shù)據(jù)庫(kù):
? Sqlite
? MySQL
? Postgresql
? Microsoft SQL Server
? MariaDb
高效便捷:通過(guò)簡(jiǎn)單的配置文件,即可快速生成所需的 API 接口,大大提高開(kāi)發(fā)效率。
廣泛的數(shù)據(jù)庫(kù)支持:涵蓋了常見(jiàn)的數(shù)據(jù)庫(kù)類型,滿足不同項(xiàng)目的需求。
易于維護(hù):生成的接口結(jié)構(gòu)清晰,代碼規(guī)范,便于后續(xù)的擴(kuò)展和測(cè)試。
│ database2api.jar <-- 主程序(必選)
└─ data
└─ ext <-- 擴(kuò)展 API 放置目錄(可選)
└─ web <-- 靜態(tài)文件目錄(可選)
└─ setting.ini <-- 配置文件(必選)
# API 默認(rèn)端口
API_PORT=8080
# 生成API的前綴,如設(shè)置 api/v1 后,則API變?yōu)椋篽ttp://localhost:{PORT}/api/v1/xxxxxx
API_PREFIX=api
# 是否啟用 API 文檔,地址 http://localhost:{PORT},設(shè)為 false 不會(huì)生成 API 文檔
API_INDEX_ENABLED=true
# 是否啟用接口授權(quán)訪問(wèn)功能,默認(rèn)false,所有 API 無(wú)需授權(quán)認(rèn)證即可訪問(wèn)
API_AUTH_ENABLED=false
# 接口授權(quán)訪問(wèn),支持:Basic, JWT。(以后可能會(huì)支持其他的授權(quán)認(rèn)證方式)
API_AUTH_TYPE=JWT
# 接口允許訪問(wèn)的用戶名密碼列表
API_AUTH_USERS=admin:123456,user:1234
# 數(shù)據(jù)庫(kù)默認(rèn)鏈接地址(主要需要這里的數(shù)據(jù)庫(kù)連接字符串,其他數(shù)據(jù)庫(kù)連接字符串樣例在下方)
DB_URL=jdbc:sqlite://G:/database2api-test/sqlite/fqb.db
# 數(shù)據(jù)庫(kù)用戶名
DB_USER=
# 數(shù)據(jù)庫(kù)密碼
DB_PWD=
# 生成API的數(shù)據(jù)表名稱,為空則所有的表都生成API,多個(gè)使用英文逗號(hào)分割
INCLUDE_TABLES=
# 需要忽略的數(shù)據(jù)表名稱,如果不為空,則指定的表名被過(guò)濾,多個(gè)使用英文逗號(hào)分割
IGNORED_TABLES=
# 是否啟用靜態(tài)網(wǎng)站,啟用后,則創(chuàng)建web目錄,放入靜態(tài)資源即可訪問(wèn)
STATIC_WEB_ENABLED=true
# 是否開(kāi)啟擴(kuò)展API,允許用戶使用JS代碼使用自定義SQL查詢數(shù)據(jù)庫(kù)
EXT_API_ENABLED=true
java -jar database2api.jar
啟動(dòng)后控制臺(tái)日志如下:
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: 開(kāi)始初始化
2024-07-11 23:43:14.382 [main] INFO com.mrhuo.Database2Api - Database2Api: 開(kāi)始初始化 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: 靜態(tài)網(wǎng)站主頁(yè)[http://127.0.0.1:8080/web/index.html]
2024-07-11 23:43:14.444 [main] INFO com.mrhuo.Database2Api - Database2Api: 開(kāi)始初始化數(shù)據(jù)庫(kù)
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: 獲取到所有數(shù)據(jù)表的表結(jié)構(gòu)
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
啟動(dòng)成功后目錄結(jié)構(gòu)變?yōu)椋?/p>
│ database2api.jar
└─ data
│ setting.ini
│ tables.json <-- 這是數(shù)據(jù)庫(kù)中所有的表名稱,下次啟動(dòng)時(shí)不會(huì)從數(shù)據(jù)庫(kù)重新獲取,直接使用此文件。如數(shù)據(jù)庫(kù)已更新,則刪除此文件
│ table_names.json <-- 這是數(shù)據(jù)庫(kù)中所有表結(jié)構(gòu),下次啟動(dòng)時(shí)不會(huì)從數(shù)據(jù)庫(kù)重新獲取,直接使用此文件。如數(shù)據(jù)庫(kù)已更新,則刪除此文件
└─ ext <-- 擴(kuò)展 API 放置目錄(可選)
└─ web <-- 靜態(tài)文件目錄(可選)
└─ index.html <-- 這是靜態(tài)網(wǎng)頁(yè)默認(rèn)首頁(yè)
打開(kāi)瀏覽器,訪問(wèn) http://127.0.0.1:8080 ,如果開(kāi)啟了配置 API_INDEX_ENABLED=true
,此時(shí)界面如下:
端口設(shè)置見(jiàn)配置文件 API_PORT=8080
如果設(shè)置 API_INDEX_ENABLED=false
,則不會(huì)顯示 API
文檔界面。
隨便找個(gè)測(cè)試獲取所有數(shù)據(jù):http://127.0.0.1:8080/api/DEVICE/all
這里的 DEVICE
是數(shù)據(jù)庫(kù)中的表名
再測(cè)試分頁(yè)顯示數(shù)據(jù):http://127.0.0.1:8080/api/DEVICE/paged
可以看到,僅僅是配置了數(shù)據(jù)庫(kù)鏈接,就自動(dòng)生成一個(gè)完整的可用的API接口,非常方便。
現(xiàn)已支持 Basic、JWT 兩種授權(quán)認(rèn)證方式,配置如下:
# 是否啟用接口授權(quán)訪問(wèn)功能
API_AUTH_ENABLED=false
# 接口授權(quán)訪問(wèn),支持:Basic, JWT,
API_AUTH_TYPE=JWT
# 接口允許訪問(wèn)的用戶名密碼列表
API_AUTH_USERS=admin:123456,user:1234
需要配置 API_AUTH_ENABLED=true
開(kāi)啟API授權(quán)
需要配置 API_AUTH_TYPE=Basic
(注意大小寫(xiě))
需要配置 API_AUTH_USERS=user:pass,user1:pass1
,設(shè)置允許訪問(wèn)的用戶密碼對(duì)
Basic 授權(quán)失敗演示
Basic 授權(quán)成功演示
需要配置 API_AUTH_ENABLED=true
開(kāi)啟API授權(quán)
需要配置 API_AUTH_TYPE=JWT
(注意大小寫(xiě))
需要配置 API_AUTH_USERS=user:pass,user1:pass1
,設(shè)置允許訪問(wèn)的用戶密碼對(duì)
注意,JWT授權(quán),單獨(dú)提供了一個(gè)用戶登錄接口,路勁為 /api/api-user-login
,前面的 api
前綴,由配置 API_PREFIX
來(lái)設(shè)置
JWT 驗(yàn)證失敗演示
JWT 驗(yàn)證成功演示
JWT 用戶登錄成功演示
JWT 用戶登錄失敗演示
擴(kuò)展 API 簡(jiǎn)單來(lái)說(shuō)就是寫(xiě)一個(gè)JS文件,作為API擴(kuò)展接口,執(zhí)行數(shù)據(jù)庫(kù)訪問(wèn),完成API請(qǐng)求的功能。
開(kāi)啟方式,在配置文件里設(shè)置 EXT_API_ENABLED=true
,并在 data
目錄下創(chuàng)建 ext
目錄,創(chuàng)建文件 get_hello.js
,內(nèi)容如下:
注意:文件名格式為 {get|post}_{api_name}.js
function main() {
var name = context.query.name || "no name";
return "hello " + name;
}
規(guī)定函數(shù)名 main
,重新啟動(dòng) database2api 后可看到控制臺(tái)提示:
2024-07-14 17:26:58.380 [main] INFO com.mrhuo.plugins.RoutingKt - Database2Api.scriptApiRoute: 創(chuàng)建擴(kuò)展API[GET:/api/ext/hello]成功
訪問(wèn)該API http://127.0.0.1:8080/api/ext/hello?name=mrhuo 時(shí),返回結(jié)果如下:
{
"code": 0,
"msg": "OK",
"data": "hello mrhuo"}
注意:擴(kuò)展API因?yàn)橛玫搅四_本引擎來(lái)解釋執(zhí)行腳本代碼,性能不是太好,如非必要,請(qǐng)勿過(guò)度依賴此功能。
擴(kuò)展API中目前支持 db
, context
兩個(gè)對(duì)象。
db
對(duì)象主要用于數(shù)據(jù)庫(kù)查詢,提供 db.query(sql)
, db.queryOne(sql)
, db.exec(sql)
這三個(gè)方法
context
對(duì)象主要用于當(dāng)前請(qǐng)求參數(shù)的獲取,提供 context.uri
, context.method
, context.headers
, context.query
, context.body
五個(gè)對(duì)象
注意如果數(shù)據(jù)庫(kù)有密碼,還需要配置 DB_USER
和 DB_PWD
Sqlite
DB_URL=jdbc:sqlite://G:/db.db
MySQL
DB_URL=jdbc:mysql://127.0.0.1:3306/db?useSSL=false&serverTimezone=UTC&charset=utf8mb
PostgreSQL
DB_URL=jdbc:postgresql://127.0.0.1:5432/db
Microsoft SQL Server
DB_URL=jdbc:sqlserver://;serverName=rm-abc.sqlserver.rds.aliyuncs.com;port=1433;databaseName=db_cms
MariaDb
jdbc:mariadb://127.0.0.1:3306/mysql?useSSL=false&serverTimezone=UTC&charset=utf8mb4
https://github.com/mrhuo/database2api
MIT
轉(zhuǎn)自https://www.cnblogs.com/MrHuo/p/18309261/database2api
該文章在 2024/10/8 15:20:17 編輯過(guò)