在Dart中处理HttpRequest的正文

时间:2015-05-02 22:26:04

标签: dart

我以前做过这样的事情:

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会为我处理这些东西吗?我要转到其中一个吗?现在,它都是本土的。

1 个答案:

答案 0 :(得分:3)

是的,因为您可以在https://github.com/dart-lang/shelf/blob/master/lib/src/message.dart#L136架子上看到默认为UTF-8

我可能有偏见,但我肯定会建议搬到货架上。根据您的喜好,您有多种选择,例如:

    你提到的
  • shelf_rpc。我还没有使用它,但很可能是全功能的API支持
  • shelf_bind如果您只想将处理函数参数绑定到JSON主体。这是较低级别,更灵活,更少规定,但做得更少。 e.g。

    router.post(&#39; / foo&#39;,(@ RequestBody()Foo foo)=&gt; ...)

  • shelf_rest。添加更高级别的更具规范性的API支持(类似于shelf_rpc)。

  • 像redstone,mojito等完整的框架。这些更适合你,但你需要购买更多