从外部访问http响应正文

时间:2015-03-21 19:01:12

标签: dart dart-async dart-http

import 'package:http/http.dart' as http;

main() {

  String esearch = "http://eutils.ncbi.nlm.nih.gov/entrez/eutils/esearch.fcgi?db=nucleotide&term=Paenibacillus";
  var uidList = [];

  http.get(esearch).then((response) {

    var pattern = new RegExp(r"<Id>(.*?)</Id>");
    var hits = pattern.allMatches(response.body);


    hits.forEach((hit) {
      print("whole match: " + hit[0] + " first match " + hit[1]);
      uidList.add(hit[1]);
    });
  });

  print(uidList.length); // empty, because main thread is faster than query
}

大家好,

我有一天会和Dart一起玩,想知道它是否适合我的需要。在我附加的代码中,我想访问http查询块之外的正文结果。这是不可能的。在这里的另一个问题,有人写这是因为Darts异步概念。

有没有办法从外面访问。这是导入的,因为我必须用结果数据触发几个htttp请求,并且不要将它们全部嵌套在http块中。

或其他任何建议?

非常感谢。

1 个答案:

答案 0 :(得分:2)

这不会以这种方式工作,因为异步调用(http.get())被安排用于以后执行,而不是执行下一行。您的printhttp.get()开始连接之前执行。你需要随后链接所有连续的调用。 如果您有最新的Dart版本,则可以使用async / await,这样可以更轻松地使用异步调用。

import 'package:http/http.dart' as http;

main() {

  String esearch = "http://eutils.ncbi.nlm.nih.gov/entrez/eutils/esearch.fcgi?db=nucleotide&term=Paenibacillus";
  var uidList = [];

  return http.get(esearch).then((response) {

    var pattern = new RegExp(r"<Id>(.*?)</Id>");
    var hits = pattern.allMatches(response.body);


    hits.forEach((hit) {
      print("whole match: " + hit[0] + " first match " + hit[1]);
      uidList.add(hit[1]);
    });
    return uidList;
  }).then((uidList) {
    print(uidList.length); 
  });
}

异步/ AWAIT

import 'package:http/http.dart' as http;

main() async {

  String esearch = "http://eutils.ncbi.nlm.nih.gov/entrez/eutils/esearch.fcgi?db=nucleotide&term=Paenibacillus";
  var uidList = [];

  var response = await http.get(esearch);
  var pattern = new RegExp(r"<Id>(.*?)</Id>");
  var hits = pattern.allMatches(response.body);

  hits.forEach((hit) {
    print("whole match: " + hit[0] + " first match " + hit[1]);
    uidList.add(hit[1]);
  });
  print(uidList.length); 
}