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

如何在Poem框架中访问请求组件(含HTTP头等信息)

在Poem-OpenAPI端点中访问HTTP头

你可以通过以下几种方式在Poem-OpenAPI的端点函数中访问HTTP头信息:

1. 提取单个指定HTTP头

使用poem_openapi::param::Header类型作为端点函数的参数,直接获取某个特定的HTTP头。如果目标头可能不存在,用Option<T>包裹即可。

示例代码:

impl MyApi {
    #[oai(path = "/myapp/endpoint", method = "post")]
    async fn get_new_ssh_keys(
        &self,
        req: Json<MyReq>,
        // 提取Authorization头(允许不存在)
        auth_header: Header<Option<String>>,
        // 提取必填的自定义头X-Request-ID
        req_id: Header<String>
    ) -> Json<MyResp> {
        // 访问头值
        if let Some(auth) = auth_header.0 {
            println!("Authorization: {}", auth);
        }
        println!("X-Request-ID: {}", req_id.0);
        
        let resp = match MyResp::process(&req) { 
            // 你的业务处理逻辑
        };
        Json(resp)
    }
}

2. 获取全部HTTP头

如果需要访问所有请求头,使用poem::web::Headers类型作为参数,它包含了整个请求的头集合,支持按key查询或遍历所有头项。

示例代码:

use poem::web::Headers;

impl MyApi {
    #[oai(path = "/myapp/endpoint", method = "post")]
    async fn get_new_ssh_keys(
        &self,
        req: Json<MyReq>,
        headers: Headers
    ) -> Json<MyResp> {
        // 获取单个头
        if let Some(user_agent) = headers.get("user-agent") {
            println!("User-Agent: {}", user_agent.to_str().unwrap_or("invalid"));
        }
        
        // 遍历所有头
        for (name, value) in headers.iter() {
            println!("{}: {}", name, value.to_str().unwrap_or("invalid"));
        }
        
        let resp = match MyResp::process(&req) { 
            // 你的业务处理逻辑
        };
        Json(resp)
    }
}

3. 获取完整Request对象

如果除了头之外,还需要访问URL路径、查询参数等其他HTTP信息,可以直接将poem::Request作为参数传入端点函数,它包含了请求的所有细节。

示例代码:

use poem::Request;

impl MyApi {
    #[oai(path = "/myapp/endpoint", method = "post")]
    async fn get_new_ssh_keys(
        &self,
        req: Json<MyReq>,
        request: Request
    ) -> Json<MyResp> {
        // 访问HTTP头
        let headers = request.headers();
        // 访问URL路径
        let path = request.uri().path();
        // 访问查询参数
        let query_params = request.uri().query().unwrap_or("");
        
        println!("Path: {}", path);
        println!("Query params: {}", query_params);
        
        let resp = match MyResp::process(&req) { 
            // 你的业务处理逻辑
        };
        Json(resp)
    }
}

内容的提问来源于stack exchange,提问作者Rich C.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 09:34:55