[!NOTE] 导读
本文内容基于 Docker 和容器,将运行后端程序、提供 api 请求示例。
如果你在本地进行开发或不使用 Docker 容器,则忽略相关内容。
转载请注明原文出处!
简述
Actix Web 是一个功能强大、实用且速度极快的 Rust Web 框架。
- 可以在 Rust 1.72 或更高版本上运行,并且可以与稳定版本一起使用。
- 使用 Rust 构建 Web 服务器和应用程序,提供路由、中间件、请求的预处理、响应的后处理等。
运行环境
本文内容基于 Docker 和容器,拉取 Rust 镜像:
#查看镜像列表
docker images
#拉取镜像
docker pull rust:latest
使用 Docker 容器管理:
#查看容器列表
docker ps
#新建容器
docker run -it -p 8080:80 --name backend --network 1panel-network -v driver-backend:/www rust:latest /bin/bash
-p 8080:80
: 指定端口的关系,宿主机 8080 指向容器的 80 端口。--name backend
: 指定容器的名称。--network 1panel-network
: 指定网络方式,例如bridge
。-v driver-backend:/www
: 指定挂载的目录,这里是将存储卷指向了容器内的/www
。
注意:在挂载路径后,文件的改动是双向的,即“持久化存储”。
第一个程序
安装包管理工具 cargo
:
apt install cargo
你可能遇到:
root@dev:/home/project# cargo new backend
Command 'cargo' not found, but can be installed with:
snap install rustup # version 1.27.1, or
apt install cargo # version 1.75.0+dfsg0ubuntu1-0ubuntu7.1
apt install rustup # version 1.26.0-3
See 'snap info rustup' for additional versions.
root@dev:/home/project# apt install cargo
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following additional packages will be installed:
......
0 upgraded, 38 newly installed, 0 to remove and 129 not upgraded.
Need to get 148 MB of archives.
After this operation, 604 MB of additional disk space will be used.
Do you want to continue? [Y/n] y
在存储卷或容器里,创建项目:
cargo new backend
cd backend
添加依赖(Cargo.toml
):
[dependencies]
actix-web = "4"
示例程序(src/main.rs
):
use actix_web::{get, web, App, HttpServer, Responder};
#[get("/")]
async fn index() -> impl Responder {
"Hello, World!"
}
#[get("/{name}")]
async fn hello(name: web::Path<String>) -> impl Responder {
format!("Hello {}!", &name)
}
#[actix_web::main]
async fn main() -> std::io::Result<()> {
HttpServer::new(|| App::new()
.service(index)
.service(hello))
.bind(("0.0.0.0", 80))?
.run()
.await
}
在容器内运行:
cd /www/backend
cargo run
经验小贴士:首次运行时,在“容器”内下载依赖会占用相当长的时间,因此可以在“存储卷”里执行 cargo run
,尽管在下载成功后会“报错 80 端口已经被占用了”,忽略即可。此时,在容器里运行上面的命令。
经验小贴士:bind
绑定了 0.0.0.0
,避免宿主机无法访问、反向代理等配置无效,即不是 127.0.0.1
、localhost
。
在容器内测试(不常用):
curl http://127.0.0.1/
#"Hello, World!"
curl http://127.0.0.1/World
#"Hello, World!"
curl http://127.0.0.1/ha
#"Hello, ha!"
在宿主机测试(仅测试是否连通):
curl http://127.0.0.1:8080/
#"Hello, World!"
curl http://127.0.0.1:8080/World
#"Hello, World!"
curl http://127.0.0.1:8080/ha
#"Hello, ha!"
如果配置了反向代理,即域名指向了宿主机的 8080 端口,可以测试(常用):
curl http://backend.dev.com/
#"Hello, World!"
curl http://backend.dev.com/World
#"Hello, World!"
curl http://backend.dev.com/ha
#"Hello, ha!"
现在,第一个程序运行成功了。
官网的 Hello, world!
src/main.rs
:
use actix_web::{get, post, web, App, HttpResponse, HttpServer, Responder};
#[get("/")]
async fn hello() -> impl Responder {
HttpResponse::Ok().body("Hello world!")
}
#[post("/echo")]
async fn echo(req_body: String) -> impl Responder {
HttpResponse::Ok().body(req_body)
}
async fn manual_hello() -> impl Responder {
HttpResponse::Ok().body("Hey there!")
}
#[actix_web::main]
async fn main() -> std::io::Result<()> {
HttpServer::new(|| {
App::new()
.service(hello)
.service(echo)
.route("/hey", web::get().to(manual_hello))
})
.bind(("0.0.0.0", 80))?
.run()
.await
}
在容器内运行:
cd /www/backend
cargo run
测试:
curl http://127.0.0.1:8080/
#"Hello, World!"
curl -X POST -H "Content-Type: application/json" -d '{"id":"1", "name":"铊代码网", "link":"https://thalliumcode.com"}' http://127.0.0.1:8080/echo
#{"id":"1", "name":"铊代码网", "link":"https://thalliumcode.com"}
curl http://127.0.0.1:8080/hey
#"Hey there!"
在 Apifox 测试 POST 请求:
curl --location --request POST 'http://backend.dev.com/echo?id=1&name=%E9%93%8A%E4%BB%A3%E7%A0%81%E7%BD%91&link=https://thalliumcode.com' \
--header 'User-Agent: Apifox/1.0.0 (https://apifox.com)' \
--header 'Content-Type: application/json' \
--header 'Accept: */*' \
--header 'Host: backend.dev.com' \
--header 'Connection: keep-alive' \
--data-raw '{
"id": 1,
"name": "铊代码网",
"link": "https://thalliumcode.com"
}'
本文内容到此为止,仅供参考;转载需注明出处。