» Rust:使用ElasticSearch构建全文检索API » 2. 索引文档 » 2.1 Axum Sever

Axum Server

创建项目

执行 cargo new 命令:

cargo new lr_fulltext_search_rust --bin

指定 --bin 参数用于制作二进制程序;如果制作库,可指定 --lib 参数。

或者,在已有目录里创建一个二进制 Cargo 项目:

cargo init

该命令会创建一系列初始文件,包括 Cargo.toml 文件,其主要用于追踪管理项目依赖。

添加依赖

安装 AxumTokio 框架。

执行 cargo add

cargo add axum
cargo add tokio --features full

或者,添加 axumtokio 框架到 Cargo.toml:

@@ -6,3 +6,5 @@ edition = "2021"
 # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
 
 [dependencies]
+axum = "0.7.5"
+tokio = { version = "1.37.0", features = ["full"] }

更新 src/main.rs:

安装 serde_json,用于将字符串序列化成 json:

cargo add serde_json
use axum::{routing::get, Json, Router};
use serde_json::json;

async fn welcome() -> Json<serde_json::Value> {
    Json(json!({
        "status": "ok"
    }))
}

#[tokio::main]
async fn main() {
    let app = Router::new().route("/", get(welcome));

    let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await.unwrap();
    axum::serve(listener, app).await.unwrap();
}

如下运行程序:

cargo run

你的服务器已经在 3000 端口跑起来了。

尝试使用 curl 命令测试 http://localhost:3000/ URL。它应该展示如下 json:

{
  "status": "ok"
}

数据模型:Book

数据模型表示 API 处理的数据的结构。

创建 src/domain/model/book.rs:

形如 domain/model/... 目录结构的项目都是在使用4层架构,详情可阅读这里

#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
pub struct Book {
    pub title: String,
    pub author: String,
    pub published_at: String,
    pub content: String,
}

创建兄弟文件 mod.rs 用于导出符号:

mod book;

pub use book::Book;