如何使用http包异步读取flutter中API的传入流?

sauutmhj  于 2023-06-24  发布在  Flutter
关注(0)|答案(1)|浏览(143)

我正在开发一个Flutter应用程序,它需要以流的形式从API接收数据,并在接收到数据后立即对其进行处理。我的API以块形式发送数据,我希望在Flutter应用程序中读取这些数据,并在到达时打印块值。
我尝试使用http包来发出请求,但我不确定如何监听传入的流并实时处理分块数据。下面是我的当前代码:

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

void fetchData() async {
  final url = Uri.parse('http://my-api-server.com/stream');
  final client = http.Client();

  try {
    final request = http.Request('GET', url);
    final response = await client.send(request);

    // How to read and print the chunks from the response stream?
  } catch (e) {
    print("Error: $e");
  } finally {
    client.close();
  }
}

如何修改此代码以监听传入的流,在接收到的每个块时对其进行处理,并实时打印块值?任何帮助将不胜感激。

bmvo0sr5

bmvo0sr51#

要侦听传入的流并在Flutter中接收到的每个数据块时对其进行处理,可以利用http包的stream属性。下面是如何修改代码来实现这一点:

解决方案代码:

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

void fetchData() async {
  final url = Uri.parse('http://my-api-server.com/stream');
  final client = http.Client();

  try {
    final request = http.Request('GET', url);
    final response = await client.send(request);

    // Read and print the chunks from the response stream
    await for (var chunk in response.stream.transform(utf8.decoder)) {
      // Process each chunk as it is received
      print(chunk);
    }
  } catch (e) {
    print("Error: $e");
  } finally {
    client.close();
  }
}

在这段代码中,我们使用http.Response对象的stream属性,并使用utf8.decoder对其进行转换,以将传入的字节转换为可读的字符串。
通过使用await for循环,我们可以在块到达时对其进行实时迭代。在本例中,每个块都将使用print(chunk)进行处理和打印。您可以使用所需的逻辑来替换打印(块)行,以处理数据。
记住导入dart:convert包来访问utf8.decoder来解码传入的流。
通过这些修改,您的Flutter应用将能够从API接收数据块,并在它们到达时处理它们。
希望有帮助,让我知道你的反馈,谢谢,快乐编码..

相关问题