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

