我如何从Dart中的客户端,服务器上读取POST方法发送的HttpRequest数据?
我从客户端发送一条消息,如下所示:
HttpRequest request = new HttpRequest();
var url = "http://127.0.0.1:8081";
request.open("POST", url, async: false);
String data = 'hello from client';
request.send(data);
Run Code Online (Sandbox Code Playgroud)
在服务器上,我正在捕获这样的请求:
HttpServer.bind('127.0.0.1', 8081).then((server) {
server.listen((HttpRequest request) {
//DATA SHOULD BE READ HERE
});
});
Run Code Online (Sandbox Code Playgroud)
但我无法弄清楚如何实际读取数据... HttpRequest中没有数据属性也没有其他任何东西......
编辑这是我现在得到答案的方式:
HttpServer.bind('127.0.0.1', 8081).then((server) {
server.listen((HttpRequest request) {
//DATA SHOULD BE READ HERE
print("got it");
print(request.method);
if(request.method == "POST") {
print("got it 2");
List<int> dataBody = new List<int>();
request.listen(dataBody.addAll, onDone: () {
var postData = new String.fromCharCodes(dataBody);
print(postData);
});
}
});
});
Run Code Online (Sandbox Code Playgroud)
但由于某种原因,request.method不是"POST"而是"OPTIONS",如果我改为if(request.method == "OPTIONS"),那么print(postData)仍然不会返回任何内容......
目前,POST 数据的处理有点困难。但本质上 HttpRequest 本身必须被“监听”。HttpRequest 本身就是一个流。特别是它是一个Stream<List<int>>. 所以基本上你的数据可能会作为多个传递给你的 HttpRequest List<int>。因此,我们需要重建数据,然后将其转换为字符串(假设您需要字符串,而不是二进制数据等)。这或多或少是我所做的:
HttpServer.bind('127.0.0.1', 8081).then((server) {
server.listen((HttpRequest request) {
if(request.method == "POST") {
List<int> dataBody = new List<int>();
request.listen(dataBody.addAll, onDone: () {
var postData = new String.fromCharCodes(dataBody);
// Do something with the data now.
});
}
request.response.close();
});
Run Code Online (Sandbox Code Playgroud)
请注意,每次数据发送到服务器时,request.listen(dataBody.AddAll, ...)基本上都会调用List.addAll() (在数据较大或多部分表单的情况下,它可能不会一次全部发送)。这确保我们缓冲所有数据,直到流指示它已“完成”。在这种情况下,我们现在可以对收到的数据执行某些操作,例如将其转换为字符串。