1 个不稳定版本
0.1.0 | 2022 年 11 月 17 日 |
---|
#670 在 HTTP 服务器
每月 21 次下载
135KB
714 行
无代码 REST API 服务器
目录
使用二进制文件
可以使用 server_config.toml 配置文件设置 API
构建二进制文件
先决条件
- cargo (Rust 软件包管理器)
此命令将构建二进制文件
cargo build --release --bin="rust_rest_api" --features="build-binary"
配置文件
配置文件使用 TOML 格式。
一个典型的配置文件看起来像
database="sqlite3"
database_path="database.db"
loglevel="debug"
host="127.0.0.1:3000"
# Example table
[table.people]
route = "/people"
name = "text"
age = "Integer"
当前仅支持 database="sqlite3"
database_path
数据库将打开/保存到的路径。这可以是绝对路径或相对路径。
loglevel
可以是以下值之一
error
warn
info
debug
trace
off
host
指定服务器运行的 IP 和端口号,格式为 ip:port
指定数据库表
[table.name]
这将创建一个名为 name
的表。
route= "/uri_to_table"
这是每个表的必需属性。该表将在 URL /uri_to_table
上访问。
field= "type"
其余属性指定表的结构。
field
是字段的名称,或列。
type
是字段的 数据类型。在 sqlite3 中,支持以下类型
null
real
integer
text
为每个表自动添加一个主键 id
。
命令行选项
-c--config<FILE>
设置自定义配置文件的路径
-r--resetdb
在启动服务器之前重置数据库
API 格式
该API使用JSON格式接收和发送数据。
GET 请求
发送
向表的路径发送GET请求将检索所有条目。
可以使用查询字符串来过滤结果。
/people?age=4
将转换为SQL SELECT * FROM people WHERE age=4
查询字符串中的+
将被转换为空格。
返回
包含返回结果的数组的JSON字符串。
每个结果是一个有序数组,包含每个字段。第一个字段是唯一ID。
示例
curl 127.0.0.1:3000/people
=> [[1,"john",5],[2,"jess",19],[3,"mike",56],[4,"andrew",56]]
curl 127.0.0.1:3000/people?id=2
=> [[2,"jess",19]]
curl 127.0.0.1:3000/people?age=56
=> [[3,"mike",56],[4,"andrew",56]]
POST 请求
用于添加新的数据库条目。
发送
POST请求必须包含JSON体。体的格式是
{
"columns": {
"name": "john",
"age": "8"
}
}
"columns"中的所有值必须是字符串。
必须指定表的所有字段(除id外)。
返回
包含最近添加的值的数组的JSON字符串。这与GET返回的格式相同。
示例
curl -X POST -d @test.json 127.0.0.1:3000/people
=> [[1,"john",8]]
curl -X POST -d @test.json 127.0.0.1:3000/people
=> [[2,"john",8]]
DELETE 请求
用于删除数据库条目。
发送
向表的路径发送删除请求将删除表的内容。
可以使用查询字符串来过滤要删除的条目。
/people?age=4
将转换为SQL DELETE FROM people WHERE age=4
查询字符串中的+
将被转换为空格。
返回
空体。
如果在删除过程中遇到错误,将返回HTTP错误代码500/400。不能假设条目已成功删除。
否则,HTTP 200。
PATCH 请求
用于更新数据库条目。
发送
PATCH请求必须包含JSON体。体的格式是
{
"columns": {
"name": "jeff",
},
"filters": {
"age": "8"
}
}
"columns"和"filters"中的所有值必须是字符串。
这将更新所有条目的name
为值"jeff"
,这些条目的age=8
。
返回
空体。
如果在更新过程中遇到错误,将返回HTTP错误代码500/400。不能假设任何值已成功更新。否则,HTTP 200。
使用库
基本实现(用于二进制文件)可以在这里找到。
杂项
使用parse解析配置TOML文件。
let (config, tables) = rest_api::config_parser::read_config(optional_path)
通过调用enable_logging启用日志记录。
rest_api::enable_logging(&config)
只调用一次。
使用async_run异步运行应用程序。
rest_api::api_http_server::http::run_app_server(addr, app).await
这要求父函数是异步的。
应用程序中接收到的 HTTP 请求流程:
添加中间件
添加功能的最简单方法是创建自己的App
,其中包含自己的middleware
。
这允许拦截并处理每个请求和响应。
要创建中间件,创建一个实现Middleware trait、Sync和Send(线程安全)的结构体。
在创建App
对象时注册中间件。例如,bin.rs显示了如何创建应用程序。
示例
// create_auth_middleware() must return a struct that implements the Middleware + Send + Sync traits.
let auth_middleware = Box::new( create_auth_middleware() ) as Box<dyn Middleware + Send + Sync>;
let app = App {
routes,
middleware: vec![auth_middleware],
database_interface: Box::new(interface)
};
添加新的数据库实现
要支持新的数据库类型,必须实现以下内容
接口 : 必需
接口充当传入请求和数据库之间的“桥梁”。
它还处理其他数据库功能,如删除、创建和连接。
接口结构体实现了DatabaseInterface trait。
由于处理请求需要异步处理,因此特质的实现必须使用 #[async_trait::async_trait]
,来自 async_trait 库。
支持的数据类型在 SQLType
枚举中。
pub enum SQLType {
Null,
Integer,
Real,
Text,
}
查询
查询 是一个可选特质,可以帮助将请求转换为 SQL。它在 SQLite3 接口实现中用于解析请求数据和安全执行 SQL。
它有 2 个泛型 <T, A>
。
T
是数据库连接类型。
A
是游标类型,执行语句后返回。
响应构建器
响应构建器 是一个可选特质,它定义了一个函数,将查询结果 Vec<Vec<T>>
(其中 T
是数据库值)转换为响应字符串。
外层 Vec
包含行,内层 Vec
包含行中的字段。
依赖
~9–20MB
~262K SLoC