我正在使用 Actix-Web v1.0.7 在 Rust 中编写一个 Web 应用程序。我正在尝试创建一个可以访问路径参数并解析请求的 JSON 正文的路由处理程序。但是,到目前为止,我还没有这样做。
我尝试声明一个可以接受actix_web::HttpRequest
作为参数的处理函数。match_info
这使我可以毫无问题地使用方法访问路径参数。然后我尝试使用actix_web::web::Json::from_request
方法(来自actix_web::FromRequest
trait 实现)解析 JSON 主体,该方法需要 2 个参数:
&actix_web::HttpRequest
&mut actix_web::dev::Payload
我的问题是获取actix_web::dev::Payload
. 我尝试使用该actix_web::HttpRequest::take_payload
方法(来自actix_web::HttpMessage
特征实现),但特征实现将单位值声明为Stream
有效负载内部,这意味着我被卡住了。我认为这是由于框架的异步特性,并且可能在调用处理程序时尚未收到请求正文。然而,这只是一个假设。
#[derive(Deserialize)]
struct Thing {
// ...
}
type JsonThing = Json<Thing>;
fn handle(req: HttpRequest) -> impl IntoFuture {
let id = req.match_info().query("id").parse::<usize>().unwrap();
let mut payload = req.take_payload();
JsonThing::from_request(&req, &mut payload)
.and_then(|thing| {
// ...
HttpResponse::Ok().finish()
})
}
fn main() {
let address = String::from("127.0.0.1:8080");
let scope = web::scope("/scope")
.route("/{id:\\d+}/path", web::put().to_async(handle));
HttpServer::new(|| App::new().service(scope))
.bind(address)
.unwrap()
.run()
.unwrap();
}
我知道上面的代码片段无法编译并包含其他问题,但它传达了总体思路。我希望有一种方法可以从路径中获取 ID 参数的值,并且还能够解析同一请求的 JSON 正文,但到目前为止我还没有找到。