如何在 actix-web 中定义 URL 参数?

How do I define URL parameters in actix-web?

在 NodeJS 中,路由可以这样定义:

app.get('/:x', (req, res) => {
  console.log(req.params.x)
  res.sendStatus(200)
});

是否有等效的 actix-web 或更好的推荐方法?

我想上传一个带有 id 标识符的文件,这样就可以写入类似 img.save(format!("{}.png", id)); 的内容。

我当前的代码:

use actix_multipart::Multipart;
use actix_web::{web, App, HttpServer, Responder};
use futures_util::{StreamExt, TryStreamExt};
use serde::Deserialize;
use image::ImageFormat;

async fn get() -> impl Responder {
    web::HttpResponse::Ok()
        .content_type("text/html; charset=utf-8")
        .body(include_str!("../page.html"))
}

async fn post(mut payload: Multipart) -> impl Responder {
    if let Ok(Some(mut field)) = payload.try_next().await {
        println!("field: {:.?}", field);

        let content_type = field.content_disposition();
        println!("content_type: {:.?}", content_type);

        if let Some(filename) = content_type.unwrap().get_filename() {
            println!("filename: {:.?}", filename);
        }

        let mut full_vec: Vec<u8> = Vec::new();
        while let Some(Ok(chunk)) = field.next().await {
            full_vec.append(&mut chunk.to_vec());
        }
        println!("full_vec: {}", full_vec.len());

        let img = image::load_from_memory_with_format(&full_vec, ImageFormat::Png)
            .expect("Image load error");
        img.save("img.png");
    }
    web::HttpResponse::Ok().finish()
}

#[actix_web::main]
async fn main() -> std::io::Result<()> {
    println!("Started.");

    // Starts server
    HttpServer::new(move || {
        App::new()
            // Routes
            .route("/", web::get().to(get))
            .route("/", web::post().to(post))
    })
    .bind("127.0.0.1:8080")?
    .run()
    .await
}

HTML 将被模板化为在表单操作中包含 ID(在更一般的用例中,它们可能是具有不同 ID 的多个表单)。

<!DOCTYPE html>
<html>
  <body>
    <!-- <form id="form" action="/<% id %>" method="post"> -->
    <form id="form" action="/" method="post">
      <input type="file" name="file" required><br>
      <input type="submit" value="Submit">
    </form>
  </body>
</html>

使用 https://actix.rs/docs/extractors/.

变化:

  1. async fn post(mut payload: Multipart)async fn post(path: web::Path<String>, mut payload: Multipart)
  2. .route("/", web::post().to(post)).route("/{id}", web::post().to(post))
  3. <form id="form" action="/" method="post"><form id="form" action="/someTestId" method="post">