마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

레트로핏, 코루틴 200일때 빈 response 내려오는경우

0 추천
현재까지 레트로핏 + 코루틴으로 받아왔었는데 200인데 response가 {} 이렇게 빈상태로 내려오는 api가 있어서 얘만 따로 그냥 코루틴 없이 기본 레트로핏형? apiService.apiMethod().enqueue 형태로 호출해서     

onresponse에서 response.body()를 라이브데이터에 넣고 해당 액티비티에서

 val source = it.source()
 source.request(Long.MAX_VALUE)
 val buffer = source.buffer
 val responseBodyString = buffer.clone().readString(Charset.forName("UTF-8"))

이런형태로 받아서 처리는 해놨는데요 얘도 코루틴으로 바꿔보고싶은데 어떻게 해야될까요?

response가 아무것도없이 {} 로 내려올수도 있고, 데이터가 있는 response로 내려올 수도있습ㄴ다
수원통학러 (3,570 포인트) 님이 2022년 3월 3일 질문

1개의 답변

0 추천
제가 보기에는 해당 API의 버그라고 생각되네요. 제일 좋은 해결책은 서버 API를 고치시는건데, 당장 안된다면, 모바일에서 할 수 있는 옵션은 다음과 같은 것들이 있을 듯 합니다.

1. {}가 리턴되는 것은 에러로 취급하고, OkHttp의 Interceptor를 이용해서 responseBody가 비어서 오면 exception을 떨구고 API 를 호출하는 쪽에서 try catch로 처리한다.

2. Retrofit의 API return 타입을 Response<String>이나 Response<Map<Any, Any>>로 변경한 다음, Gson이나 Moshi를 이용해 JSON String을 파싱 한다. String, Map<Any, Any>도 가능할 수도 있음.

3. 커스텀 JSON deserializer를 사용한다.

아이디어를 제시하는 거라 테스팅을 해봐야 정확한 거는 알 수 있을 듯 합니다.
spark (227,470 포인트) 님이 2022년 3월 3일 답변
spark님이 2022년 3월 3일 수정
1번은 Interceptor가 없어도 될 것 같네요. Retrofit API를 suspend function으로 만들고 리턴데이터타입을 주신 다음, 사용하는 쪽에서 try - catch로 JSON 파싱 에러를 잡으면 될 듯 합니다.
...