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

如何调用需携带认证头的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 15:36:34