지금 회사에서 플러터를 거의 마무리하면서,
내가 토이 프로젝트를 하지 않는 이상 이제
플러터와는 살짝 멀어지면서,
네이티브에 더 집중할 것으로 예상이 된다.
오늘은 이전 글이었던,
2021.10.04 - [Programing/Android Studio With Kotlin] - flutter/dart /JSON과 직렬화 api 서버통신 자동으로 만들기 / retrofit, dio, retrofit_generator, build_runner, json_serializable /TIL # 64
Json 직렬화를 하고 api 서버통신을 도와주었던,
retrofit2 패키지에 대해 이야기하고자 한다.
기존에 http 통신을 사용하면, response.body를 통해서
statusCode가 200인지 400인지 500인지 등등 알 수 있었다.
그렇다면 retrofit2는 어떻게 알 수 있을까?
우리나라에서 지금 시각을 기준으로 retrofit에 대한 많은 자료가 없어
정보를 얻기 까다로웠지만, 다행히 알아내었다.
retrofit과 같이 사용되는 dio패키지를 이용하면 된다.
해결법
@RestApi(baseUrl: 'api 베이스주소')
abstract class UserGetGenerator {
factory UserGetGenerator(Dio dio, {String baseUrl}) = _UserGetGenerator;
@Headers(<String, String>{'Content-Type': 'application/json'})
@GET('api 주소')
Future duplicateEmail(@Query('email') String email);
}
class UserGet {
late UserGetGenerator client;
Dio dio = Dio();
UserGet() {
client = UserGetGenerator(dio);
}
Future<bool?> duplicateEmail({
required String email,
}) async {
print('email : => $email');
try {
dynamic result = await client.duplicateEmail(email);
print('result ==> ${result['exist']}');
return result['exist'];
} on DioError catch (e) {
print('에러 로그33 : ${e.response?.statusCode}');
return null;
}
}
}
우선 UserGetGenerator를 build_runner패키지를 이용해
자동 완성을 해주었고,
다음과 같이 UserGet 클래스를 싱글톤으로 만들어
UserGetGenerator에 인스턴스를 한 번만 호출하여,
client 변수에 넣어주고,
이곳에서 api에서 받아온 데이터에 가공을 하여 반환할 수 있게 만들었다.
중요한 것은
try {
dynamic result = await client.duplicateEmail(email);
print('result ==> ${result['exist']}');
return result['exist'];
} on DioError catch (e) {
print('에러 로그33 : ${e.response?.statusCode}');
return null;
}
이 부분이다.
client.duplicateEmail() 메서드를 통해,
서버에서 맵을 반환받고,
그 맵에서 exist키에 해당하는 불값을 반환하는 것이다.
여기까지에 과정을 try에 넣어주고,
아래에는 on DioError catch (e) {}를 넣어준다.
그렇다면 예외상황이 발생할 때, 서버에서 받아온 statusCode를 알 수 있게 된다.
e(DioErrorType).reponse?.statusCode
이런 식으로 말이다.