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等。这些为您做的更多,但您需要购买更多
- 正如你提到的那样。我没有使用过它,但可能是全功能的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
输入的内容关联起来。我