#sql-database #http-api #rest-api #http #sql

bin+lib easy-rest-api

一个用于创建 HTTP API 的简单库,设置简单

1 个不稳定版本

0.1.0 2022 年 11 月 17 日

#670HTTP 服务器

每月 21 次下载

MIT 许可证

135KB
714

Rust Logo

无代码 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 请求流程:

Flow overview

添加中间件

添加功能的最简单方法是创建自己的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