flutter如何实现SSE请求

在Flutter中如何实现SSE(Server-Sent Events)请求?我尝试使用http包和dart:ioHttpClient,但无法持续接收服务器推送的事件流。请问有没有现成的Flutter插件或最佳实践来实现SSE?需要处理连接中断重连和事件解析,求具体代码示例或实现思路。

2 回复

在Flutter中,使用http库发起SSE请求。创建Client,发送GET请求并设置Accept头为text/event-stream。通过监听响应流解析事件数据。

更多关于flutter如何实现SSE请求的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter中实现SSE(Server-Sent Events)请求,可以通过以下两种常用方式:

1. 使用 http 包 + 流处理

import 'dart:async';
import 'package:http/http.dart' as http;

class SSEClient {
  static Stream<String> subscribeToSSE(String url) async* {
    final client = http.Client();
    final request = http.Request('GET', Uri.parse(url));
    
    // 设置SSE相关headers
    request.headers['Accept'] = 'text/event-stream';
    request.headers['Cache-Control'] = 'no-cache';
    
    try {
      final response = await client.send(request);
      
      await for (var chunk in response.stream.transform(utf8.decoder)) {
        final lines = chunk.split('\n');
        
        for (var line in lines) {
          if (line.startsWith('data: ')) {
            final data = line.substring(6).trim();
            if (data.isNotEmpty) {
              yield data;
            }
          }
        }
      }
    } finally {
      client.close();
    }
  }
}

// 使用示例
void startSSE() {
  SSEClient.subscribeToSSE('https://api.example.com/events')
    .listen((data) {
      print('收到事件: $data');
      // 处理数据
    }, onError: (error) {
      print('SSE错误: $error');
    });
}

2. 使用专门的 sse_client 包

首先添加依赖:

dependencies:
  sse_client: ^2.0.0

然后使用:

import 'package:sse_client/sse_client.dart';

class SSEManager {
  late SseClient client;
  
  Future<void> connect(String url) async {
    client = SseClient.connect(url);
    
    client.stream.listen((message) {
      print('收到消息: $message');
      // 处理消息
    }, onError: (error) {
      print('连接错误: $error');
    }, onDone: () {
      print('连接关闭');
    });
  }
  
  void disconnect() {
    client.close();
  }
}

主要特点:

  • 自动重连:可以添加重连逻辑
  • 错误处理:监听连接错误和完成事件
  • 内存管理:及时关闭连接避免内存泄漏
  • 数据解析:正确处理SSE格式(data: 前缀)

推荐使用专门的 sse_client 包,它封装了更多SSE协议细节,使用更简单可靠。

回到顶部