gpt4 book ai didi

dart - 如何使用流发送http响应

转载 作者:行者123 更新时间:2023-12-03 02:58:27 33 4
gpt4 key购买 nike

我想在我的http服务器中使用简单的API,因此每次写HttpResponse时都使用流。

所以我将所有对象都转换为流,即object-> json-> stream

Stream<List<int>> toStream(Object value) {
var json = JSON.encode(value);
var controller = new StreamController<List<int>>(onListen: () => UTF8.encode(json));
return controller.stream;
}

然后

(response as HttpResponse).addStream(toStream({"a": 1, "B": 2})
.then(() => response.flush())
.catchError((e, stack) {
_logger.error("Handling ${context.path} finished with an error: $e");
_logger.debug(stack.toString());
})
.whenComplete(() => response.close());

但我得到错误

Uncaught Error: Bad state: StreamSink is bound to a stream
Stack Trace:
#0 _StreamSinkImpl.close (io_sink.dart:122)
#1 _HttpOutboundMessage.close (http_impl.dart:481)

我不确定我在做什么错。我看到了一些示例,其中File的输入流通过管道传递给响应,但我也无法使其正常工作。

任何帮助表示赞赏!

最佳答案

这里有几件事要注意:

首先,当您调用encode()时,JSON和UTF8编码器将生成单个值,因此您将创建仅单个值的Stream。我想知道您从中获得了多少值(value)。

其次,您的Stream实际上没有任何值。当第一个侦听器订阅时,会调用onListen,但是从onListen返回的任何值都不会被使用。要从单个值创建流,您可能需要使用new Stream.fromIterable():

<List<int>> toStream(Object value) =>
new Stream.fromIterable([UTF8.encode(JSON.encode(value))])

因此,这应该使值实际进入Stream中,并注意您的错误。我认为错误的根源是没有关闭输入流,并且当Iterable耗尽时,从Iterable创建它会关闭Stream。
pipe()现在也应该可以使用,因此您可以尝试以下操作:

toStream({"a": 1, "B": 2}).pipe(response)
.then((_) {
print("done");
});

所有人都说,我看不出有什么比以下更好的了:

response
..write(JSON.encode(value))
..close();

关于dart - 如何使用流发送http响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21835259/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com