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

如何在Axum中读取sec-websocket-protocol请求头?

在Axum的WebSocket处理函数中读取sec-websocket-protocol请求头

你可以直接通过WebSocketUpgrade提供的request()方法访问原始请求对象,进而获取sec-websocket-protocol请求头,这是最简便的实现方式。

修改后的代码示例

use axum::{
    extract::{ConnectInfo, WebSocketUpgrade},
    response::IntoResponse,
};
use std::net::SocketAddr;

async fn ws_handler(
    ws: WebSocketUpgrade,
    ConnectInfo(addr): ConnectInfo<SocketAddr>,
) -> impl IntoResponse {
    // 获取sec-websocket-protocol请求头
    let sub_protocols = ws.request().headers().get("sec-websocket-protocol");
    
    // 解析并处理子协议(支持多个用逗号分隔的协议值)
    if let Some(protocols) = sub_protocols {
        if let Ok(protocols_str) = protocols.to_str() {
            let protocol_list: Vec<&str> = protocols_str.split(',').map(|s| s.trim()).collect();
            println!("客户端请求的子协议: {:?}", protocol_list);
        }
    }

    ws.on_upgrade(move |socket| handle_socket(socket, addr))
}

// 示例WebSocket连接处理函数
async fn handle_socket(socket: axum::extract::ws::WebSocket, addr: SocketAddr) {
    // 编写你的WebSocket业务逻辑
}

补充说明

  • 若客户端请求了多个子协议,sec-websocket-protocol头的值会以逗号分隔,你可以按需求分割解析。
  • 如果需要在多个处理函数中复用子协议提取逻辑,也可以自定义Axum提取器,但直接通过WebSocketUpgrade::request()的方式已经足够轻量高效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 05:27:02