flutter如何获取websocket握手response header

在Flutter中使用WebSocket连接时,如何获取握手阶段服务器返回的response header?官方文档似乎没有直接提供相关方法,是否有其他可行的方案或第三方库可以获取这些头部信息?

2 回复

在Flutter中,使用web_socket_channel库建立WebSocket连接后,可通过channel.stream监听握手响应头。握手完成后,响应头通常包含在连接建立时的初始消息中。

更多关于flutter如何获取websocket握手response header的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在 Flutter 中获取 WebSocket 握手响应头,可以使用 web_socket_channel 包。以下是实现步骤:

  1. 添加依赖:在 pubspec.yaml 中添加:

    dependencies:
      web_socket_channel: ^2.4.0
    
  2. 创建 WebSocket 连接并获取响应头

    import 'package:web_socket_channel/web_socket_channel.dart';
    import 'package:http/http.dart' as http;
    
    Future<Map<String, String>?> getWebSocketHandshakeHeaders(String url) async {
      try {
        // 发起 HTTP 请求以获取握手响应头
        final response = await http.get(Uri.parse(url.replaceFirst('ws://', 'http://').replaceFirst('wss://', 'https://')));
        
        if (response.statusCode == 101) { // 101 表示协议切换成功
          return response.headers; // 返回响应头
        } else {
          print('握手失败: ${response.statusCode}');
          return null;
        }
      } catch (e) {
        print('错误: $e');
        return null;
      }
    }
    
    // 使用示例
    void connectWebSocket() async {
      final headers = await getWebSocketHandshakeHeaders('ws://example.com/socket');
      if (headers != null) {
        print('握手响应头: $headers');
        
        // 建立 WebSocket 连接
        final channel = WebSocketChannel.connect(Uri.parse('ws://example.com/socket'));
        // 处理消息...
      }
    }
    

注意

  • 上述方法通过 HTTP GET 请求模拟握手,但实际中 WebSocket 握手是通过 HTTP Upgrade 请求完成的。若需精确获取,可能需要使用底层 dart:ioWebSocket 类(仅适用于非 Web 平台)。
  • 在 Web 平台,浏览器限制直接访问握手头,通常需后端转发。

替代方案(使用 dart:io,仅限非 Web 平台)

import 'dart:io';

Future<HttpClientResponse?> getHandshakeHeaders(String url) async {
  final HttpClient client = HttpClient();
  try {
    final request = await client.getUrl(Uri.parse(url));
    final response = await request.close();
    return response; // 包含响应头
  } catch (e) {
    print('错误: $e');
    return null;
  }
}

根据平台选择合适的方法,并处理可能的跨平台限制。

回到顶部