如何在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.
相关产品推荐
相关产品推荐

