web-dev-qa-db-fra.com

Définir le délai d'expiration de la requête getClient HTTPClient

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?

11
SteAp

Il existe deux façons différentes de configurer ce comportement dans Dart

Définir un délai d'expiration par demande

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
}

Définir un délai d'expiration sur HttpClient

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);
25
Jonah Williams