内容简介
本专题将带你从零开始实现一个简单的、RESTFUL 风格的 Todo 服务。包括:JSON 响应及请求、PostgreSQL 的使用、自定义错误的处理、RESTFul 的定义、配置文件、日志的记录等。配置文件
本章我们将实现配置文件的加载。我们将对 axum 的监听地址和 PostgreSQL 相关的信息进行配置,并保存到`.env`文件中。错误处理
本章我们将自定义错误、自定义一个`Result`以及让它们作为 handler 的返回值,进行 HTTP 响应。自定义响应
我们的 Todo 服务是对外提供 API 的服务,它的响应格式总是`JSON`类型。为此,我们可以定义响应类型,以简化 handler 的编写。数据库、模型、状态共享及TodoList
现在是时候开始进行数据库操作,以便实现功能了。本章将实现`TodoList`的功能。日志及重构
本章我们将对之前的代码进行重构并且使用日志记录可能发生的错误。实现TodoItem
经过一番重构,目前我们的 Todo 服务已经基本完善了,现在只差最后一个部分:TodoItem。本章我们就来实现它。总结
经过一番不懈努力,我们终于完成了一个提供 RESTFul API 的 Todo 服务。虽然功能简单,但它涉及到了 Axum 开发的多个方面。
配置文件
- 990207
- 2021-11-25 10:27:34
本章我们将实现配置文件的加载。我们将对 axum 的监听地址和 PostgreSQL 相关的信息进行配置,并保存到.env
文件中。
本章代码在01/配置文件分支。
.env
先看一下.env
文件的内容:
WEB.ADDR=0.0.0.0:9527
PG.USER=axum_rs
PG.PASSWORD=axum.rs
PG.DBNAME=axum_rs
PG.PORT=5432
PG.HOST=pg.axum.rs
PG.POOL.MAX_SIZE=30
首先,我们要在 src/main.rs
声明一个 config
模块:
mod config;
然后,创建一个 src/config.rs
文件,并定义相关结构体:
handler
模块
为了演示,我们创建 src/handler.rs
文件,并定义一个 handler:
pub async fn usage() -> &'static str {
r#"
### USAGE ###
- GET /todo -- get all todo list
- POST /todo -- create a todo list
- GET /todo/:list_id -- get detail for a todo list
- DELETE /todo/:list_id -- delete a todo list, include it's items
- PUT /todo/:list_id -- edit a todo list
- GET /todo/:list_id/items -- get items from todo list
- GET /todo/:list_id/items/:item_id -- get detail for a todo item
- PUT /todo/:list_id/items/:item_id -- edit a todo item(set the item to checked)
- DELETE /todo/:list_id/items/:item_id -- delete a todo item
"#
}
别忘了在 src/main.rs
声明这个模块:
mod handler;
解析.env
并初始化配置
现在可以在main
函数中解析.env
并初始化配置了:
// 解析 .env 文件
dotenv().ok();
// 初始化配置
let cfg = config::Config::from_env().expect("初始化配置失败");
创建 axum 服务
接下来,我们可以创建 axum 服务了
// 路由
let app = Router::new().route("/", get(handler::usage));
// 绑定到配置文件设置的地址
axum::Server::bind(&cfg.web.addr.parse().unwrap())
.serve(app.into_make_service())
.await
.unwrap();
下一章,我们将进行错误处理。