2
我想在我的http服务器中有简单的API,所以每次我写入HttpResponse时都使用流。如何使用流发送http响应
,所以我将所有对象转换成数据流,即对象 - > json->流
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的输入流被传送给响应的例子,但我也无法使其工作。
任何帮助赞赏!
很好,但有总是返回流的简单API更好,如果你想添加文件和其他东西,实际上可以产生大块数据。如果我在流上工作,我可以在服务器的其他部分转换它(即Gzip),我错了吗? 例如我有一个用例,我发送像70MB这样的大型JSON对象!疯狂:) – kamiseq
你是对的,我不知何故错过了使用controller.add(UTF8.encode(json))的非常重要的事情; controller.close();如此处所述https://www.dartlang.org/articles/creating-streams/ – kamiseq