You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Haskell中结合Warp实现每次HTTP请求重执行getJSON的最优方案

如何在Warp中实现每次HTTP请求重新执行getJSON

核心思路非常直接:不要提前加载并缓存JSON数据,而是把getJSON的调用嵌入到每个请求的处理流程里。Warp的过滤器是惰性执行的,只有当请求到达时才会触发对应的处理代码,刚好能满足我们的需求。

假设你的getJSON是异步操作(比如从文件/外部API获取数据),用and_then过滤器就能轻松实现最简洁的方案:

use warp::{Filter, Reply};

// 模拟你的异步getJSON函数
async fn get_json() -> Result<YourJsonStruct, Box<dyn std::error::Error>> {
    // 这里写你的JSON获取逻辑:读文件、发HTTP请求等
    let fresh_json = /* 最新的JSON数据 */;
    Ok(fresh_json)
}

// 你的计算逻辑函数
fn compute_result(data: &YourJsonStruct) -> CalculationOutput {
    // 根据JSON数据执行计算
}

#[tokio::main]
async fn main() {
    // 定义路由:每次请求/calculate时,都会重新获取JSON并计算结果
    let calculate_route = warp::path("calculate")
        .and_then(|_| async {
            get_json()
                .await
                .map(|json_data| warp::reply::json(&compute_result(&json_data)))
                // 把获取JSON时的错误转换成Warp能处理的Rejection
                .map_err(warp::reject::custom)
        });

    warp::serve(calculate_route).run(([127, 0, 0, 1], 3030)).await;
}

如果你的getJSON是同步操作(比如从本地刷新内存数据),直接用map过滤器更简单:

let calculate_route = warp::path("calculate")
    .map(|_| {
        match get_json() {
            Ok(json_data) => warp::reply::json(&compute_result(&json_data)),
            Err(e) => warp::reply::with_status(e.to_string(), warp::http::StatusCode::INTERNAL_SERVER_ERROR),
        }
    });

关键要点

  • 绝对不要在启动服务时就调用getJSON并缓存结果——这种写法只会执行一次,后续请求都会复用旧数据。
  • and_then专门处理异步逻辑,map处理同步逻辑,两者都是每次请求触发时才执行,保证每次都能拿到最新的JSON数据。
  • 错误处理要跟上:异步场景用map_err转成Warp的Rejection,同步场景可以直接返回错误响应。

内容的提问来源于stack exchange,提问作者SparklingWater

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 08:35:05