본문 바로가기
Flutter/Flutter FAQ

Flutter HTTPClient get() 요청에 대한 타임아웃 설정, Set timeout for HTTPClient get() request

by 베타코드 2023. 7. 19.
반응형

질문


이 방법은 간단한 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()에 서버 측에서 응답을 반환하기까지 기다릴 최대 시간을 설정할 수 있을까요?


답변


이 동작을 구성하는 두 가지 다른 방법이 있습니다

요청별 타임아웃 설정

Future를 사용하여 Future.timeout 메서드를 사용하여 임의의 Future에 타임아웃을 설정할 수 있습니다. 이렇게 하면 지정된 기간이 경과하면 TimeoutException이 발생하여 중단됩니다.

try {
  final request = await client.get(...);
  final response = await request.close()
    .timeout(const Duration(seconds: 2));
  // 나머지 코드
  ...
} on TimeoutException catch (_) {
  // 타임아웃이 발생했습니다.
} on SocketException catch (_) {
  // 다른 예외
}

HttpClient에 타임아웃 설정

HttpClient 자체에도 HttpClient.connectionTimeout을 사용하여 타임아웃을 설정할 수 있습니다. 이렇게 하면 타임아웃이 설정된 후 동일한 클라이언트에 의해 수행되는 모든 요청에 적용됩니다. 요청이 이 타임아웃을 초과하면 SocketException이 발생합니다.

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

댓글