当前位置: 首页 > article >正文

Actix-Web构建一个简单的HTTP服务器

Actix-Web框架是目前性能上数一数二的rust的web框架,它的性能远超spring,nestJS, gin等目前流行的框架。
性能排名
仅仅是返回hello,wold,我发现actix-web的性能就已经是gin的3倍。但是使用actix-web的缺点也非常明显,就是代码通过编译非常困难(也许是我太菜了)。

我实践了actix-web的以下功能:

  • 静态文件
  • 错误处理
  • post一个json参数

本服务器用于提交易班账号信息

首先在文件结构上
文件结构
page页面用于存放静态页面,src内容是代码文件,configure_parse用于解析配置文件,配置文件格式是toml,db_handler用于处理数据库,response用于统一处理错误。APITEST用于测试接口。main.rs是主函数。开发过程中使用命令cargo watch -x run,可以热编译。需要安装:cargo install cargo-watch

大概需要下面这些依赖

[dependencies]
actix-web = "4"
actix-files = "0.6.0"
derive_more = "0.99.17"
sqlx = { version = "0.5.11", features = ["runtime-actix-native-tls", "mysql"] }
exitcode = "1.1.2"
serde = { version = "1.0.136" ,features=["derive"]}
serde_json = "1.0.79"
futures-util = { version = "0.3.7", default-features = false, features = ["std"] }
validator = { version = "0.12", features = ["derive"] }
toml = "0.5.8"

HTTP服务器

官方的API文档给出了一个简单的例子

use actix_web::{get, web, App, HttpServer, Responder};#[get("/hello/{name}")]
async fn greet(name: web::Path<String>) -> impl Responder {format!("Hello {name}!")
}#[actix_web::main] // or #[tokio::main]
async fn main() -> std::io::Result<()> {HttpServer::new(|| {App::new().route("/hello", web::get().to(|| async { "Hello World!" })).service(greet)}).bind(("127.0.0.1", 8080))?.run().await
}

在宏的加持下,使用rust构建HTTP服务器也是比较简单的,只需要简简单单的几行代码就可以搞定。

静态文件

显示静态文件也不是非常困难,我们在网页路径和本地的路径之间建立映射关系。
文件映射
为了在网站的根目录也能显示网页,我们还需要单独处理一下get(“/”)这种情况,我们稍稍修改一下hello函数

use actix_files::{NamedFile};
#[get("/")]
async fn hello() -> Result<NamedFile> {Ok(NamedFile::open(PathBuf::from("./page/index.html"))?)
}

这样就可以显示静态页面了
静态网页

统一处理错误


// response/result.rs
use actix_web::{error, HttpResponse, HttpResponseBuilder};
use actix_web::body::BoxBody;
use actix_web::http::{header, StatusCode};
use derive_more::{Display, Error};
use serde_json::json;#[derive(Display, Debug)]
pub enum YiBanResponseError {#[display(fmt = "格式化错误 :{}", _0)]FormatError(&'static str),#[display(fmt = "服务器错误 : {}", _0)]ServerError(&'static str),#[display(fmt = "数据库错误 : {}", _0)]DBError(&'static str),#[display(fmt = "未找到目标 : {}", _0)]NotFoundError(
http://www.lryc.cn/news/2419764.html

相关文章:

  • 51单片机原理以及接口技术(四)--80C51的程序设计
  • greensock下载_GreenSock动画平台初学者指南
  • 手把手叫你做ToDoList
  • 解密:2012世界末日其实是个大骗局
  • 算法设计与分析——背诵知识点合集
  • 霍夫曼(Huffman)编码算法详解之C语言版
  • 强度理论介绍和惯性矩推导
  • 数据库性能监控策略:如何监控数据库性能
  • 基本概念:子域名和域
  • 【HTML基础】HTML基本语法
  • 【CSDN软件工程师能力认证学习精选】吐血整理!140 种 Python 标准库、第三方库和外部工具都有了
  • linux驱动开发扩展--字符设备注册详解
  • 多线程之线程间通讯
  • (4)pokeman_用图片对模型进行测试
  • 什么是TTL电平,什么是CMOS电平
  • “boost::get_property的用法示例“:使用Boost库的get_property方法可以方便地获取C++对象的属性值
  • sockaddr和sockaddr_in结构体、以及inet_ntoa()和inet_addr()函数的用法
  • rownum,row_number區別。 执行顺序
  • 最新BIOS设置中英文对照表
  • P2P原理与实践
  • erpc的设计和工作机制
  • MD5:介绍与应用
  • Win10 VC++6 无法启动此程序,因为计算机中丢失mfc42d.dll 需要提升
  • Vim的全面配置
  • 谈安全测试的重要性
  • Oracle 视图详解
  • 浅谈快速沃尔什变换(FWT)快速莫比乌斯变换(FMT)
  • Android 二级列表控件ExpandableListView 的简单使用
  • FlashFXP的使用
  • stm32平衡小车--(1)JGB-520减速电机+tb6612(附测试代码)