目标
完成提交表单至后端,然后接受返回数据


Hello,world!
actix-web 是采用 Rust 开发的一个 Web 框架。它强大快速切于实际,是采用 Rust 进行 Web 开发的最佳选择之一——那还学学?
依照惯例,选择创建一个 hello_world 程序来初步了解下 actix-web。
首先使用 Cargo 创建一个名为 hello_world 新项目。
cargo new hello_world
cd hello_world
复制代码接着,在 hello_world 目录下的 Cargo.toml 中添加:
[dependencies]
actix-web = "3"
复制代码将 actix-web 添加为项目的依赖项。
我们逐步分析 Hello,world! 的代码
use actix_web::{get, App, HttpResponse, HttpServer, Responder};
//路由指定路径(以 get 的方式)
#[get("/")]
async fn hello() -> impl Responder {
    //返回报文主体为 Hello,world 的 Http 响应
    HttpResponse::Ok().body("Hello,world!")
}
//将 async main 函数标记为 actix 系统的入口点。 
#[actix_web::main]
async fn main() -> std::io::Result<()> {
    //创建 http 服务器
    HttpServer::new(|| {
        App::new()//新建一个应用
            .service(hello)//将 hello 函数作为服务
    })
    .bind("127.0.0.1:8080")?//绑定到指定的套接字地址
    .run()//开始监听
    .await
}
复制代码在 hello_world 目录下运行命令:cargo run,启动服务。
然后启动浏览器输入我们指定的套接字地址:127.0.0.1:8080。

FromRequest trait
当我们向一个地址发送请求时,往往都会伴随着一些其他信息,而 FromRequest trait 规定了一些格式,共我们去提取请求信息。
最为简单的是请求主体是段文本需要被接收:
use actix_web::{post, App, HttpResponse, HttpServer, Responder};
//路由 /post 的请求 
#[post("/post")]
async fn get_text(txt: String) -> impl Responder {
    HttpResponse::Ok().body(format!("成功接收到了:{}", txt))
}
//将 async main 函数标记为 actix 系统的入口点。
#[actix_web::main]
async fn main() -> std::io::Result<()> {
    //创建 http 服务器
    HttpServer::new(|| {
        App::new() //新建一个应用
            .service(get_text)
    })
    .bind("127.0.0.1:8080")? //绑定到指定的套接字地址
    .run() //开始监听
    .await
}
复制代码其它的格式可以查看 Trait actix_web::FromRequest
提交表单
构建页面
首先用 Html 构建一个基本的具有提交表单功能的页面。我们新建项目 form ,然后在 form 目录下新建文件夹 pages 并在里面新建文件 index.html。

添加依赖项:
[dependencies]
actix-web = "3"
serde = { version = "1", features = ["derive"] }
复制代码编写 Html :
<!DOCTYPE html>
<html>
<body>
    <h3>请问你是?</h3>
    <form action=/post method=POST>
        <button type=submit>我是:</button>
        <input name="name">
    </form>
</body>
</html>
复制代码很标准的提交表单:

接着我们逐步分析 Rust 代码:
use actix_web::{web, App, HttpResponse, HttpServer, Responder};
use serde::{Deserialize, Serialize};
//表单格式,对应 Html 中的 name
#[derive(Serialize, Deserialize)]
pub struct Person {
    name: String,
}
//显示初始(pages/index.html)页面
async fn index() -> HttpResponse {
    HttpResponse::Ok()
        .content_type("text/html; charset=utf-8")//格式
        .body(include_str!("../pages/index.html"))//读取文件作为相应主体
}
async fn post(p: web::Form<Person>) -> impl Responder {
    HttpResponse::Ok()
        .content_type("text/html; charset=utf-8")//防止乱码
        .body(format!("欢迎 {}", p.name))//读取表单内容
}
#[actix_web::main]
async fn main() -> std::io::Result<()> {
    HttpServer::new(|| {
        App::new()
            //以另一种方式实现 get 和 post 请求
            .service(web::resource("/").route(web::get().to(index)))//路由根目录
            .service(web::resource("/post").route(web::post().to(post)))//路由 /post 目录
    })
    .bind("127.0.0.1:8080")?
    .run()
    .await
}
复制代码接着运行,并提交:


欢迎大家评论交流!
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END
    





















![[桜井宁宁]COS和泉纱雾超可爱写真福利集-一一网](https://www.proyy.com/skycj/data/images/2020-12-13/4d3cf227a85d7e79f5d6b4efb6bde3e8.jpg)

![[桜井宁宁] 爆乳奶牛少女cos写真-一一网](https://www.proyy.com/skycj/data/images/2020-12-13/d40483e126fcf567894e89c65eaca655.jpg)
