如何简单地取一个URL体作为一个字符串同步(how to simply fetch an url b

2019-10-18 12:56发布

你会如何简单地实现这个功能:

String fetchUrlBodyAsString(String url) {
  ...
}

用法:

String schema = fetchUrlBodyAsString("http://json-schema.org/draft-04/schema#");

此线程使用镖下载文件解释了一个好办法,从主函数获取数据。 但是,如果你尝试,你看,离开主后的实际工作情况。 我认为,我想创建同步功能使用HttpClient的,因为它正在试图获得一个异步API来同步工作是困难的。 根据这一线索,可能是不可能的: https://groups.google.com/a/dartlang.org/d/msg/misc/kAgayQyaPhQ/wonJ776_FGIJ

什么是飞镖的方式在非浏览器/控制台设置来实现这一点?

Answer 1:

异步方法的使用是非常传染性。 一旦你开始使用Future的一个函数里,你必须返回一个Future的结果。 所以,你的fetchUrlBodyAsString功能可以关注一下:

import 'dart:io';
import 'dart:async';

Future<String> fetchUrlBodyAsString(String url) =>
  new HttpClient().getUrl(Uri.parse(url))
    .then((HttpClientRequest request) => request.close())
    .then((HttpClientResponse response) =>
        response.transform(new StringDecoder()).join());

main() {
  final url = "http://json-schema.org/draft-04/schema#";
  Future<String> schema = fetchUrlBodyAsString(url);
  schema.then(handleContent);
}

handleContent(String content) {
  print(content); // or do what you want with content.
}

async / await

import 'dart:io';
import 'dart:async';

Future<String> fetchUrlBodyAsString(String url) async {
  var request = await new HttpClient().getUrl(Uri.parse(url));
  var response = await request.close();
  return response.transform(new StringDecoder()).join();
}

main() async {
  final url = "http://json-schema.org/draft-04/schema#";
  handleContent(await fetchUrlBodyAsString(url));
}

handleContent(String content) {
  print(content); // or do what you want with content.
}


Answer 2:

您可以通过使用HttpRequest.open和异步设置为false,使同步HTTP请求。

https://api.dartlang.org/apidocs/channels/stable/dartdoc-viewer/dart-dom-html.HttpRequest#id_open

import 'dart:html';

String fetchUrlBodyAsString(String url) {

    var request = new HttpRequest()
        ..open('GET', url, async: false)
        ..send();

    return request.responseText;
}

String schema = fetchUrlBodyAsString("http://json-schema.org/draft-04/schema#");


Answer 3:

有没有办法把一个异步API为同步API; 一旦你有一个未来的结果,那就是你将不得不处理一下。

为了您的具体的例子,只有这样才能达到你想要的将是从地上爬起来建立自己的同步HTTP库。 以同步的方式使用异步的API是不可能的。



文章来源: how to simply fetch an url body as a string synchronously
标签: dart