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

解决Rust Hyper中make_service_fn的`&Target`类型注解缺失错误

Rust反向代理认证功能开发中的类型注解错误解决

学习Rust第20天,编写带认证功能的反向代理时,第30行遇到如下错误:

error[E0282]: type annotations needed for `&Target`

尝试按编译器提示给闭包参数添加显式类型注解后反而出现更多错误,现提供解决方案:

问题原因

make_service_fn的闭包参数conn的类型无法被编译器自动推导,导致后续整个类型链断裂,引发类型注解缺失的错误。这里conn的实际类型是hyper::server::conn::AddrStream(TCP传输下的连接类型),必须显式标注才能让编译器正确识别。

解决方案步骤

  1. 导入hyper::server::conn::AddrStream类型;
  2. 给make_service_fn的闭包参数conn添加显式类型注解;
  3. 确保异步闭包的返回类型推导清晰。

修改后的完整代码

use hyper::service::{make_service_fn, service_fn};
use hyper::{Body, Request, Response, Server};
use hyper::server::conn::AddrStream; // 新增导入
use std::convert::Infallible;
use std::net::{IpAddr, SocketAddr};

async fn authenticate(req: Request<Body>) -> Result<Request<Body>, Infallible> {
    // 在这里实现认证逻辑,比如检查请求头中的API密钥
    Ok(req)
}

async fn handle(client_ip: IpAddr, req: Request<Body>) -> Result<Response<Body>, Infallible> {
    let target_url = "http://127.0.0.1:13901";
    match hyper_reverse_proxy::call(client_ip, target_url, req).await {
        Ok(response) => Ok(response),
        Err(error) => {
            eprintln!("转发请求出错: {}", error);
            Ok(Response::builder()
                .status(hyper::StatusCode::INTERNAL_SERVER_ERROR)
                .body(Body::empty())
                .unwrap())
        }
    }
}

#[tokio::main]
async fn main() {
    // 给conn参数添加显式类型注解
    let make_service = make_service_fn(|conn: &AddrStream| async {
        let client_ip = conn.remote_addr().ip();
        Ok::<_, Infallible>(service_fn(move |req| {
            let client_ip = client_ip.clone();
            async {
                match authenticate(req).await {
                    Ok(req) => handle(client_ip, req).await,
                    Err(_) => {
                        eprintln!("认证失败");
                        Ok(Response::builder()
                            .status(hyper::StatusCode::UNAUTHORIZED)
                            .body(Body::empty())
                            .unwrap())
                    }
                }
            }
        }))
    });

    let bind_addr = "127.0.0.1:8000";
    let addr: SocketAddr = bind_addr.parse().expect("无法解析IP:端口");

    let server = Server::bind(&addr).serve(make_service);
    println!("反向代理运行于 {:?}", addr);

    if let Err(error) = server.await {
        eprintln!("服务器运行出错: {}", error);
    }
}

Cargo.toml配置(无需修改)

[dependencies]
hyper-reverse-proxy = "0.5"
hyper = { version = "0.14", features = ["full"] }
tokio = { version = "1", features = ["full"] }

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 04:46:48