Dart HTTP server and Futures
我试图编写简单的HTTP服务器来解析client.getUrl()的结果。 除了无法写回http请求对象(打印到控制台工作正常)以外,我已完成所有工作。
相关代码为:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | main() { HttpServer.bind(InternetAddress.ANY_IP_V4, 4040) .then((HttpServer server) { print('listening on localhost, port ${server.port}'); server.listen((HttpRequest request) { Future loadedContent = loadUrl(furl); loadedContent.then((content) => print(content)); // loadedContent.then((content) => request.response.write(content)); request.response.close(); print ("response closed"); }); }).catchError((e) => print(e.toString())); } |
问题是主要功能在我从Future获得结果之前就结束了(通过打印" response close"(在结果之前排第二位)来解决)。 是否可以在主函数中等待结果?
编辑:它与Dart HttpRequest返回将来有关
我将重写我的代码,但是如果有一种方法可以在主函数中等待getUrl Future,我会更喜欢它。
编辑:我的loadUrl
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | Future loadUrl(String url) { final c = new Completer(); HttpClient client = new HttpClient(); client.addCredentials( Uri.parse("https://*****.tpondemand.com/api"), "tprealm", new HttpClientBasicCredentials("*****","*****")); client.getUrl(Uri.parse(url)) .then((HttpClientRequest request) { // Optionally set up headers... // Optionally write to the request object... // Then call close. return request.close(); }) .then((HttpClientResponse response) { // Process the response. //print(response.reasonPhrase); response.transform(UTF8.decoder).listen((contents) { // handle data Map parsedMap = JSON.decode(contents); c.complete(parsedMap); //req.response.write(parsedMap["Items"][0]); }); }); return c.future; } |
最后编辑:这是工作代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | import 'dart:io'; import 'dart:async'; import 'package:http_server/http_server.dart'; import 'dart:convert'; final furl ="https://***.tpondemand.com"; Future loadUrlBody(String url) { final c = new Completer(); HttpClient client = new HttpClient(); client.addCredentials(Uri.parse("https://***.tpondemand.com/api"),"tprealm", new HttpClientBasicCredentials("user","password")); client.getUrl(Uri.parse(url)) .then((HttpClientRequest response) => response.close()) .then(HttpBodyHandler.processResponse) .then((HttpClientResponseBody body) { c.complete(body); }); return c.future; } main() { final filter ="/api/v1/Userstories?format=json&where=(Team.Id+eq+111111)&include=[Name,CreateDate,ModifyDate,LastCommentDate]&take=1000"; HttpServer.bind(InternetAddress.ANY_IP_V4, 4040).then((HttpServer server) { print('listening on localhost, port ${server.port}'); server.listen((HttpRequest request) { print(request.connectionInfo.remoteAddress); loadUrlBody(furl + filter).then((content) { Map parsedMap = content.body; //print("Map parsed"); request.response.write(parsedMap["Items"]); request.response.close(); //print("response closed"); }).catchError((e) => print(e.toString())); }); }).catchError((e) => print(e.toString())); } |
当您的
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | main() { HttpServer.bind(InternetAddress.ANY_IP_V4, 4040) .then((HttpServer server) { print('listening on localhost, port ${server.port}'); server.listen((HttpRequest request) { loadUrl(furl).then(() { // loadedContent.then((content) => print(content)); loadedContent.then((content) => request.response.write(content)); request.response.close(); print ("response closed"); }); }); }).catchError((e) => print(e.toString())); } |
更新
您需要修改
1 2 3 4 5 | Future getData(HttpRequest request) { // added return type 'Future' (not necessary) return dao.findAll().then((value) { // added 'return' print(value); }); } |
更新2
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | Future loadUrl(String url) { // final c = new Completer(); // <== commented out HttpClient client = new HttpClient(); client.addCredentials( Uri.parse("https://*****.tpondemand.com/api"), "tprealm", new HttpClientBasicCredentials("*****","*****")); return client.getUrl(Uri.parse(url)) // <== added return .then((HttpClientRequest request) { // Optionally set up headers... // Optionally write to the request object... // Then call close. return request.close(); }) .then((HttpClientResponse response) { // Process the response. //print(response.reasonPhrase); return response.transform(UTF8.decoder).listen((contents) { // <== added return // handle data Map parsedMap = JSON.decode(contents); // c.complete(parsedMap); // <== commented out //req.response.write(parsedMap["Items"][0]); }).asFuture(); // <== added `.asFuture()` }); // return c.future; // <== commented out } |
通常,在每次调用返回Future的方法之前添加一个