Flutter - 同时请求多个 API 的最佳方式
Flutter - Best way to request Multiple APIs simultaneously
我有两个 URL,我正在使用 fetchData()
函数来解析 json。
Future<Iterable> fetchData() async {
var response = await http.get(firstUrl);
var listOne = List<Article>();
if (response.statusCode == 200) {
var notesJson = json.decode(response.body);
var bodyList = notesJson['items'];
for (var i in bodyList) {
listOne.add(Article.fromJson(i));
}
}
var resp = await http.get(secondUrl);
var listTwo = List<Article>();
if (resp.statusCode == 200) {
var notesJson = json.decode(resp.body);
var bodyList = notesJson['items'];
for (var i in bodyList) {
listTwo.add(Article.fromJson(i));
}
}
var newL = [...listOne, ...listTwo];
return newL;
}
我觉得这是多余的。我想知道这是否是正确的方法,或者我可以优化它吗?由于我正在查询两个 URL,我应该使用 compute()
吗?
Flutter 的 compute
产生了另一个 Isolate
(Dart 中类似线程的东西),这对于等待网络请求来说是相当耗费资源的。
令人高兴的是,Dart 是基于事件循环的,因此您可以通过简单地将两个网络请求 Future
包装在对 Future.wait
的调用中来同时等待两个请求。
有关 Dart 事件循环的更多信息,您可能需要查看 explanatory video about Futures on Flutter's YouTube channel.
Future<List<Article>> fetchData() async {
var responses = await Future.wait([
http.get(firstUrl),
http.get(secondUrl),
]);
return <Article>[
..._getArticlesFromResponse(responses[0]),
..._getArticlesFromResponse(responses[1]),
];
}
List<Article> _getArticlesFromResponse(http.Response response) {
return [
if (response.statusCode == 200)
for (var i in json.decode(response.body)['items'])
Article.fromJson(i),
];
}
如果你有动态列表,你可以使用Future.forEach
方法;
例如:
var list = ["https://first.api.url",
"https://second.api.url",
"https://third.api.url"];
void makeMultipleRequests(){
await Future.forEach(list, (url) async{
await fetchData(url);
});
}
Future<Iterable> fetchData(String url) async {
var response = await http.get(url);
print(response.body);
}
您可以使用 Dio 包。
response = await Future.wait([dio.post('/info'), dio.get('/token')]);
我有两个 URL,我正在使用 fetchData()
函数来解析 json。
Future<Iterable> fetchData() async {
var response = await http.get(firstUrl);
var listOne = List<Article>();
if (response.statusCode == 200) {
var notesJson = json.decode(response.body);
var bodyList = notesJson['items'];
for (var i in bodyList) {
listOne.add(Article.fromJson(i));
}
}
var resp = await http.get(secondUrl);
var listTwo = List<Article>();
if (resp.statusCode == 200) {
var notesJson = json.decode(resp.body);
var bodyList = notesJson['items'];
for (var i in bodyList) {
listTwo.add(Article.fromJson(i));
}
}
var newL = [...listOne, ...listTwo];
return newL;
}
我觉得这是多余的。我想知道这是否是正确的方法,或者我可以优化它吗?由于我正在查询两个 URL,我应该使用 compute()
吗?
Flutter 的 compute
产生了另一个 Isolate
(Dart 中类似线程的东西),这对于等待网络请求来说是相当耗费资源的。
令人高兴的是,Dart 是基于事件循环的,因此您可以通过简单地将两个网络请求 Future
包装在对 Future.wait
的调用中来同时等待两个请求。
有关 Dart 事件循环的更多信息,您可能需要查看 explanatory video about Futures on Flutter's YouTube channel.
Future<List<Article>> fetchData() async {
var responses = await Future.wait([
http.get(firstUrl),
http.get(secondUrl),
]);
return <Article>[
..._getArticlesFromResponse(responses[0]),
..._getArticlesFromResponse(responses[1]),
];
}
List<Article> _getArticlesFromResponse(http.Response response) {
return [
if (response.statusCode == 200)
for (var i in json.decode(response.body)['items'])
Article.fromJson(i),
];
}
如果你有动态列表,你可以使用Future.forEach
方法;
例如:
var list = ["https://first.api.url",
"https://second.api.url",
"https://third.api.url"];
void makeMultipleRequests(){
await Future.forEach(list, (url) async{
await fetchData(url);
});
}
Future<Iterable> fetchData(String url) async {
var response = await http.get(url);
print(response.body);
}
您可以使用 Dio 包。
response = await Future.wait([dio.post('/info'), dio.get('/token')]);