我正在尝试将一个重要的经纱REST 应用程序构建到模块中,同时优雅地处理错误和拒绝。它没有按我预期的方式工作。考虑这个简单的应用程序:
main.rs
use warp_sample::routes;
#[tokio::main]
async fn main() {
warp::serve(routes::convert_route()).run(([127, 0, 0, 1], 8080)).await;
}
路线.rs
use warp::{Filter, Rejection, Reply};
use crate::handlers;
pub fn convert_route() -> impl Filter<Extract = impl Reply, Error = Rejection> + Clone {
warp::path("convert")
.and(warp::path::param::<String>())
.map(|v: String| {
handlers::convert_str(&v).or_else(|e| e)
})
}
处理程序.rs
use warp::{Reply, Rejection};
pub fn convert_str(s: &str) -> Result<impl Reply, Rejection>{
match s.parse::<i32>() {
Ok(s) => Ok(warp::reply()),
Err(_) => Err(warp::reject())
}
}
这不会编译,因为在 routes.rs 我试图在闭包中返回一个 Rejection 结构,它与返回类型不匹配impl Reply
。
我怎样才能让它工作?我试图更改的返回类型,convert_route
但这不适用于warp::serve
.
对于奖励分数,您能否告诉我如何在成功时在处理程序中包含纯文本响应,以及在出现错误时如何包含不同的状态代码?
这对奖金不起作用,但它向您展示了我的想法。
pub fn convert_str(s: &str) -> Result<impl Reply, Rejection>{
match s.parse::<i32>() {
Ok(s) => Ok(warp::body(s)),
Err(_) => Err(warp::Rejection {
reason: Reason::BadRequest,
})
}
}