WEBKT

Rust Web 开发实战:构建返回 JSON 数据的简易 Web 服务器

148 0 0 0

Rust Web 开发实战:构建返回 JSON 数据的简易 Web 服务器

想用 Rust 搭建一个能返回 JSON 数据的 Web 服务器?没问题,这篇教程就带你一步步搞定。我们会用到一些流行的 Rust crate,比如 tokio(异步运行时)和 serde(序列化/反序列化)。

1. 环境准备

首先,确保你已经安装了 Rust 和 Cargo。如果没有,可以去 Rust 官网 下载安装。

接下来,创建一个新的 Rust 项目:

cargo new json_server
cd json_server

2. 添加依赖

我们需要添加 tokio, serde, serde_json, 和 axum 作为依赖。 axum 是一个基于 tokio 的 Web 框架,用起来很方便。

打开 Cargo.toml 文件,在 [dependencies] 部分添加以下内容:

[dependencies]
tokio = { version = "1", features = ["full"] }
serde = { version = "1", features = ["derive"] }
serde_json = "1"
axum = "0.7"

解释一下这些依赖的作用:

  • tokio: Rust 的异步运行时,用于处理并发。
  • serde: 用于序列化和反序列化 Rust 数据结构。
  • serde_json: 用于将数据结构序列化成 JSON 格式,以及将 JSON 数据反序列化成 Rust 数据结构。
  • axum: 一个简单易用的 Web 框架,基于 tokio 构建,提供了路由、中间件等功能。

3. 定义数据结构

假设我们要返回一个包含用户信息的 JSON 数据。首先,定义一个 User 结构体:

use serde::{Deserialize, Serialize};

#[derive(Serialize, Deserialize)]
struct User {
    id: u32,
    name: String,
    email: String,
}

#[derive(Serialize, Deserialize)] 宏来自 serde,它可以自动为 User 结构体实现序列化和反序列化 trait。这意味着我们可以轻松地将 User 结构体转换成 JSON 字符串,也可以将 JSON 字符串转换成 User 结构体。

4. 实现 HTTP 请求处理

接下来,我们需要创建一个处理 HTTP 请求的函数。这个函数接收请求,并返回 JSON 格式的用户数据。

use axum::{extract::Path, handler::Handler, routing::get, Json, Router};
use std::net::SocketAddr;

async fn get_user(Path(user_id): Path<u32>) -> Json<User> {
    // 模拟从数据库获取用户数据
    let user = User {
        id: user_id,
        name: "张三".to_string(),
        email: "zhangsan@example.com".to_string(),
    };

    Json(user)
}

这个 get_user 函数接收一个 user_id 作为路径参数,然后创建一个 User 结构体实例,并将其包装在 Json 中返回。Jsonaxum 提供的一个类型,它可以自动将 Rust 数据结构序列化成 JSON 格式。

5. 构建 Web 服务器

现在,我们可以使用 axum 构建 Web 服务器了。

#[tokio::main]
async fn main() {
    // 定义路由
    let app = Router::new().route("/users/:user_id", get(get_user));

    // 启动服务器
    let addr = SocketAddr::from(([127, 0, 0, 1], 3000));
    println!("listening on {}", addr);
    axum::Server::bind(&addr)
        .serve(app.into_make_service())
        .await
        .unwrap();
}

#[tokio::main] 宏将 main 函数转换成一个异步函数,这是使用 tokio 的必要步骤。

Router::new() 创建一个新的路由。

.route("/users/:user_id", get(get_user)) 定义一个路由,当收到 /users/:user_id 的 GET 请求时,调用 get_user 函数处理。:user_id 是一个路径参数,它的值会被传递给 get_user 函数。

axum::Server::bind(&addr).serve(app.into_make_service()).await.unwrap() 启动 Web 服务器,监听 127.0.0.1:3000 地址。

6. 运行服务器

在项目根目录下,运行以下命令启动服务器:

cargo run

7. 测试

打开浏览器或使用 curl 命令,访问 http://localhost:3000/users/123,你应该能看到以下 JSON 数据:

{"id":123,"name":"张三","email":"zhangsan@example.com"}

完整代码

use axum::{extract::Path, handler::Handler, routing::get, Json, Router};
use serde::{Deserialize, Serialize};
use std::net::SocketAddr;

#[derive(Serialize, Deserialize)]
struct User {
    id: u32,
    name: String,
    email: String,
}

async fn get_user(Path(user_id): Path<u32>) -> Json<User> {
    // 模拟从数据库获取用户数据
    let user = User {
        id: user_id,
        name: "张三".to_string(),
        email: "zhangsan@example.com".to_string(),
    };

    Json(user)
}

#[tokio::main]
async fn main() {
    // 定义路由
    let app = Router::new().route("/users/:user_id", get(get_user));

    // 启动服务器
    let addr = SocketAddr::from(([127, 0, 0, 1], 3000));
    println!("listening on {}", addr);
    axum::Server::bind(&addr)
        .serve(app.into_make_service())
        .await
        .unwrap();
}

总结

通过这篇教程,你学会了使用 Rust 和 axum 搭建一个简单的 Web 服务器,并且能够返回 JSON 格式的数据。 这只是一个起点,你可以继续学习 axum 的更多功能,比如处理 POST 请求、使用中间件、连接数据库等等。祝你 Rust Web 开发愉快!

码农小李 RustWeb ServerJSON

评论点评