Таймаут запроса в Dart
Долгий ответ можно оборвать по времени. У
Future, который возвращает http.get,
есть метод timeout с Duration -
счетчик идет на весь обмен, включая чтение тела.
Путь "/delay/1" на httpbin.org
ждет около секунды перед ответом. Лимит короче
этой паузы приводит к исключению:
import 'dart:async';
import 'package:http/http.dart' as http;
void main() async {
var uri = Uri.parse('https://httpbin.org/delay/1');
try {
await http.get(uri).timeout(
Duration(milliseconds: 300),
);
} on TimeoutException {
print('timeout');
}
}
Лимит задают отдельно для каждого вызова через
Duration. Для медленного ответа после
соединения нужен именно timeout на
Future запроса:
import 'package:http/http.dart' as http;
void main() async {
var limit = Duration(milliseconds: 400);
var uri = Uri.parse('https://httpbin.org/delay/1');
var response = await http.get(uri).timeout(limit);
print(limit.inMilliseconds);
print(response.statusCode);
}
Отправьте чтение на "/delay/1" с
лимитом 200 миллисекунд. Выведите
"timeout", если сработало
исключение по времени.
Выведите "ok", если запрос к
"/delay/1" успел завершиться при
лимите 3 секунды, и "timeout"
при более коротком лимите 100
миллисекунд - две строки подряд.