代码之家  ›  专栏  ›  技术社区  ›  SteAp

为httpclient get()请求设置超时

  •  7
  • SteAp  · 技术社区  · 7 年前

    此方法提交一个简单的HTTP请求并调用一个成功或错误回调,这很好:

      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() );
    
        }
      }
    

    如果服务器没有运行,Android应用程序或多或少会立即调用ErrorCallback。

    在iOS上,ErrorCallback需要很长的时间-超过20秒-直到调用任何回调。

    我可以为httpclient()设置等待服务器端返回答复的最长秒数吗?如果有的话?

    1 回复  |  直到 7 年前
        1
  •  10
  •   Jonah Williams    7 年前

    在DART中配置此行为有两种不同的方法

    设置每个请求超时

    您可以使用 Future.timeout 方法。这将在给定的持续时间过后通过抛出 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
    }
    

    在httpclient上设置超时

    还可以使用 HttpClient.connectionTimeout . 这将应用于设置超时后由同一客户端发出的所有请求。当一个请求超过这个超时时,一个 SocketException 被抛出。

    final client = new HttpClient();
    client.connectionTimeout = const Duration(seconds: 5);