如何调用需携带认证头的EventSource API?
在Rust的eventsource和reqwest-eventsource中配置请求头(用于私有EventSource API)
使用reqwest-eventsource配置请求头
reqwest-eventsource基于reqwest封装,天然支持通过ClientBuilder配置自定义请求头,步骤很直接:
use reqwest_eventsource::{ClientBuilder, EventSource}; use reqwest::header::{AUTHORIZATION, HeaderValue}; #[tokio::main] async fn main() -> Result<(), Box<dyn std::error::Error>> { // 构建携带认证头和自定义头的客户端 let client = ClientBuilder::new() .header(AUTHORIZATION, HeaderValue::from_str("Bearer your_access_token")?) .header("X-App-Version", "1.0.0") .build()?; // 用配置好的客户端初始化EventSource let mut es = EventSource::new(client, "https://your-private-es-endpoint.com/stream")?; while let Some(event) = es.next().await { match event { Ok(event) => println!("Event received: {}", event.data), Err(err) => eprintln!("Stream error: {:?}", err), } } Ok(()) }
ClientBuilder和reqwest原生的ClientBuilder接口完全兼容,所有header相关方法都可以直接用,包括批量添加头、修改头逻辑等。
使用eventsource crate配置请求头
eventsource核心库没有直接暴露设置头的API,但可以通过实现自定义Client trait来注入请求头:
use eventsource::{Client, EventSource, Error, Request, Response}; use http::{header::{AUTHORIZATION, HeaderValue}, Request as HttpRequest}; use hyper::Client as HyperClient; // 自定义带认证的客户端 struct AuthClient { inner: HyperClient<hyper::client::HttpConnector>, auth_token: String, extra_headers: Vec<(http::header::HeaderName, HeaderValue)>, } impl Client for AuthClient { fn send(&self, mut req: Request) -> Result<Response, Error> { // 注入Authorization头 req.headers_mut().insert( AUTHORIZATION, HeaderValue::from_str(&format!("Bearer {}", self.auth_token)) .map_err(|e| Error::Http(e.into()))?, ); // 注入其他自定义头 for (name, value) in &self.extra_headers { req.headers_mut().insert(name.clone(), value.clone()); } // 调用底层hyper客户端发送请求 let res = self.inner.request(req.into()).map_err(|e| Error::Http(e.into()))?; Ok(res.into()) } } #[tokio::main] async fn main() -> Result<(), Box<dyn std::error::Error>> { let custom_headers = vec![ (http::header::HeaderName::from_static("x-custom-header"), HeaderValue::from_str("custom-data")?), ]; let auth_client = AuthClient { inner: HyperClient::new(), auth_token: "your_access_token".to_string(), extra_headers: custom_headers, }; // 用自定义客户端初始化EventSource let mut es = EventSource::new_with_client(auth_client, "https://your-private-es-endpoint.com/stream")?; while let Some(event) = es.next().await { match event { Ok(event) => println!("Event received: {}", event.data), Err(err) => eprintln!("Stream error: {:?}", err), } } Ok(()) }
通过new_with_client传入自定义Client实现,就能在每次请求前修改头信息。这里用hyper作为底层客户端,你也可以替换成其他符合Client trait要求的HTTP客户端。
内容的提问来源于stack exchange,提问作者Rafael R. Camargo
相关产品推荐
相关产品推荐

