[도토링] retrofit으로 통신하기
에코노베이션의 최종 발표인 SummerDev가 다가오며 개발 마지막 단계로 백엔드와의 통신을 진행하였다.
급하게 개발을 진행하여 먼저, 사용할 부분만 공부하기로 했다.
먼저, 모든 요청에 대한 성공적 응답값은
{ "success" : , "response" : , "error" : } 로 받아온다.
로그인을 예시로 들면
성공 시 Response는
{ "success" : true, "response" : null, "error" : null }
실패 시 Response는
{ "success" : false, "response" : null, "error" : { "message" : "존재하지 않는 아이디입니다 :loginId", "code" : null "status" : 400 } }
가 된다.
다음은 서버에 요청을 보내고 응답값을 받아오는 코드이다.
override fun enqueue(callback: Callback<Result<T>>) {
delegate.enqueue(
object : Callback<T> {
override fun onResponse(call: Call<T>, response: Response<T>) {
}
override fun onFailure(call: Call<T>, t: Throwable) {
}
}
)
}
enqueue가 뭘까?
서버에서 응답값을 받아올 때 값이 아직 도착하지 않았는데 다음 코드가 실행된다면 응답값이 null로 들어가 에러가 날 것이다. 이러한 상황을 해결해주기 위해서 비동기 메소드인 enqueue를 사용한다.
enqueue로 불러오게 된다면 onResponse에서는 응답값이 도착했을때 실행되게 되며 네트워크 오류나 api 호출이 실패하여 응답값이 돌아오지 않을 경우에는 onFailure가 실행된다,
여기서 착각하면 안될 것이 onFailure는 !네트워크 오류나 api 호출이 실패할 경우에! 호출되므로 오류 메세지를 받았을 경우에는 onResponse로 값이 들어오기 때문에 이에대한 에러처리는 onResponse에서 해줘야 한다.
그래서,
응답이 성공일 경우에는 response.isSuccessful() 을 조건으로 주어서 이에대한 내용을 처리하고 에러에 대한 처리는 이후 else문에서 처리한다.
마지막 통신에서 response값이 담겨오지 않는 오류가 발생하였는데 이에대한 내용은 다음 포스팅에서 작성해보겠다.