Dart 处理HttpRequest';飞镖的身体

Dart 处理HttpRequest';飞镖的身体,dart,Dart,我曾经做过这样的事情: import 'dart:async'; import 'dart:convert'; main() async { var input = {'a':1, 'b':2}; var decoder = JSON.fuse(UTF8).decoder; var json = await decoder.bind(toByteStream(input)).single; print(json); } Stream<List<int>

我曾经做过这样的事情:

import 'dart:async';
import 'dart:convert';

main() async {
  var input = {'a':1, 'b':2};

  var decoder = JSON.fuse(UTF8).decoder;

  var json = await decoder.bind(toByteStream(input)).single;

  print(json);
}

Stream<List<int>> toByteStream(json) =>
   _encoder.bind(new Stream.fromIterable([json]));


final _encoder = new JsonUtf8Encoder();
HttpResponse res=req.response;
接收到字符串数据;
等待请求侦听((列表缓冲区){
dataReceived=新字符串。fromCharCodes(缓冲区);
}).asFuture();
Map data=JSON.decode(dataReceived);
当我需要UTF8支持时,我将其修改为:

Map data=JSON.decode(等待新的Utf8Codec().decodeStream(请求));
Kevin Moore建议这样编码/解码:

import 'dart:async';
import 'dart:convert';

main() async {
  var input = {'a':1, 'b':2};

  var decoder = JSON.fuse(UTF8).decoder;

  var json = await decoder.bind(toByteStream(input)).single;

  print(json);
}

Stream<List<int>> toByteStream(json) =>
   _encoder.bind(new Stream.fromIterable([json]));


final _encoder = new JsonUtf8Encoder();

所以我有:

地图数据;
等待请求。侦听((列表缓冲区){
data=JSON.fuse(UTF8).decode(缓冲区);
}).asFuture();
不确定我是否需要
asFuture()

地图数据;
等待请求。侦听((列表缓冲区)=>data=JSON.fuse(UTF8)。解码(缓冲区));
还是我?这个方法需要在客户端将其编码为字节:

sendData:new JsonUtf8Encoder().convert({'model':message'authToken':app.authToken}))
这有什么好处?不是更需要通过电线发送吗

我相信Shelf和/或新的RPC库可以为我处理这些东西?我可以换一个吗?现在,它都是国产的。

是的,正如您可以看到的,货架上的默认值为UTF-8

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

  • 正如你提到的那样。我没有使用过它,但可能是全功能的API支持
  • 如果只想将处理程序函数参数绑定到JSON主体,请使用shelf_bind。这是一个较低的层次,更灵活,更少的规定,但做得更少。e、 g

    router.post('/foo',(@RequestBody()foo-foo)=>…)

  • 搁架休息。添加更高级别更规范的API支持(类似于shelf_rpc)

  • 完整的框架,如redstone、mojito等。这些为您做的更多,但您需要购买更多
是,正如您可以看到的,货架上的默认值为UTF-8

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

  • 正如你提到的那样。我没有使用过它,但可能是全功能的API支持
  • 如果只想将处理程序函数参数绑定到JSON主体,请使用shelf_bind。这是一个较低的层次,更灵活,更少的规定,但做得更少。e、 g

    router.post('/foo',(@RequestBody()foo-foo)=>…)

  • 搁架休息。添加更高级别更规范的API支持(类似于shelf_rpc)

  • 完整的框架,如redstone、mojito等。这些为您做的更多,但您需要购买更多

HttpRequest
是一个
。您不想使用
listen
,因为您只能获得第一个“块”数据

相反,您需要执行以下操作:

import 'dart:async';
import 'dart:convert';

main() async {
  var input = {'a':1, 'b':2};

  var decoder = JSON.fuse(UTF8).decoder;

  var json = await decoder.bind(toByteStream(input)).single;

  print(json);
}

Stream<List<int>> toByteStream(json) =>
   _encoder.bind(new Stream.fromIterable([json]));


final _encoder = new JsonUtf8Encoder();
导入'dart:async';
导入“dart:convert”;
main()异步{
变量输入={a':1,'b':2};
var decoder=JSON.fuse(UTF8).decoder;
var json=await decoder.bind(toByteStream(input)).single;
打印(json);
}
流到字节流(json)=>
_bind(新的Stream.fromIterable([json]);
最终编码器=新的JsonUtf8Encoder();

HttpRequest
是一个
。您不想使用
listen
,因为您只能获得第一个“块”数据

相反,您需要执行以下操作:

import 'dart:async';
import 'dart:convert';

main() async {
  var input = {'a':1, 'b':2};

  var decoder = JSON.fuse(UTF8).decoder;

  var json = await decoder.bind(toByteStream(input)).single;

  print(json);
}

Stream<List<int>> toByteStream(json) =>
   _encoder.bind(new Stream.fromIterable([json]));


final _encoder = new JsonUtf8Encoder();
导入'dart:async';
导入“dart:convert”;
main()异步{
变量输入={a':1,'b':2};
var decoder=JSON.fuse(UTF8).decoder;
var json=await decoder.bind(toByteStream(input)).single;
打印(json);
}
流到字节流(json)=>
_bind(新的Stream.fromIterable([json]);
最终编码器=新的JsonUtf8Encoder();

与凯文聊天,以便更好地理解他的答案,并认为最好将我学到的知识作为一个新答案分享


HttpRequest
始终是一个
——一个整数流列表。这些整数是字节码,通常称为ByTestStream。您可以确保,无论您使用什么API通过网络发送数据,它都是作为ByTestStream发送的

HttpRequest.request()
方法以多种形式接受
sendData

   * If specified, `sendData` will send data in the form of a [ByteBuffer],
   * [Blob], [Document], [String], or [FormData] along with the HttpRequest.
资料来源:

…但这些只是抽象,最终您的数据将作为
ByTestStream发送

因此,我们首先在服务器上设置一个
解码器
,该解码器将对JSON和UTF8进行解码(用于正确的字符处理),然后将其绑定到
HttpRequest
请求,这是一个ByTestStream。我认为
single
可以确保我们在收到多个数据事件时抛出异常。下面是解释
HttpRequest
所需的所有代码:

import 'dart:async';
import 'dart:convert';

static handleRequest(HttpRequest request) async {
  var decoder = JSON.fuse(UTF8).decoder;
  var data = await decoder.bind(request).single;

  print('The decoded data received is:\n\n$data');
}

与Kevin进行了一次聊天,以便更好地理解他的答案,并认为最好将我学到的知识作为一个新答案分享


HttpRequest
始终是一个
——一个整数流列表。这些整数是字节码,通常称为ByTestStream。您可以确保,无论您使用什么API通过网络发送数据,它都是作为ByTestStream发送的

HttpRequest.request()
方法以多种形式接受
sendData

   * If specified, `sendData` will send data in the form of a [ByteBuffer],
   * [Blob], [Document], [String], or [FormData] along with the HttpRequest.
资料来源:

…但这些只是抽象,最终您的数据将作为
ByTestStream发送

因此,我们首先在服务器上设置一个
解码器
,该解码器将对JSON和UTF8进行解码(用于正确的字符处理),然后将其绑定到
HttpRequest
请求,这是一个ByTestStream。我认为
single
可以确保我们在收到多个数据事件时抛出异常。下面是解释
HttpRequest
所需的所有代码:

import 'dart:async';
import 'dart:convert';

static handleRequest(HttpRequest request) async {
  var decoder = JSON.fuse(UTF8).decoder;
  var data = await decoder.bind(request).single;

  print('The decoded data received is:\n\n$data');
}

无法将
输入与通过
HttpRequest
输入的内容关联起来。我