프로젝트 #3에서 사용된 AuthenticationRepository를 살펴보며 Flutter 앱에서 서버와 통신을 어떻게 구현할 수 있는지 알아봅시다.

아래의 예시 코드를 통해 이해할 수 있습니다:

dynamic response = await _authenticationRepository.passGet(MyEnv.ipRiot,
          '/tft/summoner/v1/summoners/by-name/$encodedSummonerName?api_key=${MyEnv.riotKey}');

위 코드처럼 AuthenticationRepository는 passGet 및 passPost 메서드를 제공하여 서버와의 HTTP GET 및 POST 요청을 수행합니다.

repository/authentication_repository.dart

class AuthenticationRepository {
  Future<dynamic> passGet(
    String myAuthority,
    String unencodedPath,
  ) async {
    Uri url = Uri.parse('https://$myAuthority$unencodedPath');
    debugPrint(url.toString());
    try {
      http.Response response = await http.get(url, headers: {
        'Content-Type': 'application/json',
        "Accept": "application/json",
      });

      return jsonDecode(utf8.decode(response.bodyBytes));
    } catch (e) {
      debugPrint(']-----] e : ${e.toString()} [-----[');
    }
  }

  Future<dynamic> passPost(
      String myAuthority, String unencodedPath, Object body) async {
    Uri url = Uri.parse('https://$myAuthority$unencodedPath');
    try {
      debugPrint("$url $body PassPost Url Body");
      http.Response response = await http.post(
        url,
        headers: {
          'Content-Type': 'application/json',
          "Accept": "application/json",
          // 'Content-Length': '<calculated when request is sent>',
          // 'Host': '<calculated when request is sent>'
        },
        body: utf8.encode(jsonEncode(body)),
      );

      return jsonDecode(utf8.decode(response.bodyBytes));
    } catch (e) {
      // _controller.add(AuthenticationStatus.unauthenticated);
      debugPrint(']-----] e passPost : ${e.toString()} [-----[');
    }
  }
}

이런식으로 세팅했습니다 관련 로직을 하나씩 보자면

1.passGet 메서드:

  • passGet 메서드는 HTTP GET 요청을 수행합니다.
  • 매개변수로는 서버의 Authority(도메인) 및 요청 경로(unencodedPath)를 받습니다.
  • Uri 클래스를 사용하여 주어진 Authority와 경로를 합쳐서 URL을 생성합니다.
  • 생성된 URL을 디버그 출력으로 확인합니다.
  • http.get 함수를 사용하여 서버에 GET 요청을 보냅니다.
    요청 시에는 JSON 형식의 데이터를 기대하며, 해당 요청에 대한 응답을 받으면 바이트로 된 응답 데이터를 디코딩하여 반환합니다.
  • 예외가 발생하면 디버그 출력에 해당 예외를 기록합니다.

2.passPost 메서드:

  • passPost 메서드는 HTTP POST 요청을 수행합니다.
  • 매개변수로는 서버의 Authority(도메인), 요청 경로(unencodedPath), 그리고 전송할 데이터(body)를 받습니다.
  • Uri 클래스를 사용하여 주어진 Authority와 경로를 합쳐서 URL을 생성합니다.
  • 생성된 URL과 전송할 데이터를 디버그 출력으로 확인합니다.
  • http.post 함수를 사용하여 서버에 POST 요청을 보냅니다.
  • 요청 시에는 JSON 형식의 데이터를 전송하며, 데이터는 UTF-8로 인코딩되어 전송됩니다.
  • 응답을 받으면 바이트로 된 응답 데이터를 디코딩하여 반환합니다.
  • 예외가 발생하면 디버그 출력에 해당 예외를 기록합니다.

이렇게 구현된 AuthenticationRepository는 Flutter 앱에서 간편하게 서버 통신을 관리할 수 있도록 도와줍니다.

이런식으로 이때까지 적었던 코드를 중간에 한번 정리해야겠다 생각해서 적어봤습니다. 이제 프로젝트를 다시 진행하로 가야겠네요 다음에는 새로운 내용으로 다시오겠습니다~

profile
크로스플랫폼 클라이언트 개발자(Flutter) 1년차

0개의 댓글