我以前做过这样的事情:
HttpResponse res = req.response;
String dataReceived;
await req.listen((List<int> buffer) {
dataReceived = new String.fromCharCodes(buffer);
}).asFuture();
Map data = JSON.decode(dataReceived);
当我需要UTF8支持时,我将其修改为:
Map data = JSON.decode(await new Utf8Codec().decodeStream(request));
Kevin Moore建议像这样编码/解码:
https://dartpad.dartlang.org/1d229cfdc1c1fd2ab877
所以我得到了:
Map data;
await request.listen((List<int> buffer) {
data = JSON.fuse(UTF8).decode(buffer);
}).asFuture();
不确定我是否需要asFuture()
:
Map data;
await request.listen((List<int> buffer) => data = JSON.fuse(UTF8).decode(buffer));
还是我?这种方法要求我在客户端将其编码为字节:
sendData: new JsonUtf8Encoder().convert({'model': message, 'authToken': app.authToken}))
这有什么好处?是不是通过电线发送更多?
我相信Shelf和/或新的RPC lib会为我处理这些东西吗?我要转到其中一个吗?现在,它都是本土的。
答案 0 :(得分:3)
是的,因为您可以在https://github.com/dart-lang/shelf/blob/master/lib/src/message.dart#L136架子上看到默认为UTF-8
我可能有偏见,但我肯定会建议搬到货架上。根据您的喜好,您有多种选择,例如:
shelf_bind如果您只想将处理函数参数绑定到JSON主体。这是较低级别,更灵活,更少规定,但做得更少。 e.g。
router.post(&#39; / foo&#39;,(@ RequestBody()Foo foo)=&gt; ...)
shelf_rest。添加更高级别的更具规范性的API支持(类似于shelf_rpc)。