Cette méthode soumet une simple requête HTTP et appelle très bien un rappel de réussite ou d'erreur:
void _getSimpleReply( String command, callback, errorCallback ) async {
try {
HttpClientRequest request = await _myClient.get( _serverIPAddress, _serverPort, '/' );
HttpClientResponse response = await request.close();
response.transform( utf8.decoder ).listen( (onData) { callback( onData ); } );
} on SocketException catch( e ) {
errorCallback( e.toString() );
}
}
Si le serveur ne fonctionne pas, l'application Android appelle plus ou moins instantanément errorCallback.
Sur iOS, errorCallback prend une très longue période de temps - plus de 20 secondes - jusqu'à ce qu'un rappel soit appelé.
Puis-je définir pour HttpClient () un nombre maximum de secondes pour attendre que le côté serveur renvoie une réponse - le cas échéant?
Il existe deux façons différentes de configurer ce comportement dans Dart
Vous pouvez définir un délai d'expiration sur n'importe quel avenir à l'aide de Future.timeout
méthode. Cela court-circuitera une fois la durée donnée écoulée en lançant un TimeoutException
.
try {
final request = await client.get(...);
final response = await request.close()
.timeout(const Duration(seconds: 2));
// rest of the code
...
} on TimeoutException catch (_) {
// A timeout occurred.
} on SocketException catch (_) {
// Other exception
}
Vous pouvez également définir un délai d'expiration sur le HttpClient lui-même à l'aide de HttpClient.connectionTimeout
. Cela s'appliquera à toutes les demandes faites par le même client, une fois le délai d'expiration défini. Lorsqu'une demande dépasse ce délai, un SocketException
est lancé.
final client = new HttpClient();
client.connectionTimeout = const Duration(seconds: 5);