반응형
서버와의 협업 중, 어떤 사유로 반환 값이 empty body가 수신될 때, 제목과 같은 Exception이 발생했다.
명시한 data class와 별개로 해당 상황에 대한 response body convert 처리가 필요한 것으로 파악된다.
따라서 다음과 같이 Custom Converter Factory를 생성하여 Retrofit Builder에 반영해주어야한다.
class EmptyResponseConverterFactory : Converter.Factory() {
override fun responseBodyConverter(
type: Type,
annotations: Array<out Annotation>,
retrofit: Retrofit
): Converter<ResponseBody, *> {
val delegate = retrofit.nextResponseBodyConverter<Any>(this, type, annotations)
return Converter<ResponseBody, Any> {
if (it.contentLength() == 0L) return@Converter ""
delegate.convert(it)
}
}
}
명시적으로 ""라는 빈 문자열 값으로 Convert 하도록 한다.
return Retrofit.Builder()
.baseUrl(url)
.client(getClient())
.addConverterFactory(EmptyResponseConverterFactory())
.addConverterFactory(GsonConverterFactory.create())
.build()
.create(apiClass)
새로운 ConverterFactory에 Class를 추가한 뒤,
if (response.body().toString().isEmpty()) {
Log.d("TEST", "response body is empty!")
}
다음과 같은 형태로 확인 가능했다.
반응형
반응형
서버와의 협업 중, 어떤 사유로 반환 값이 empty body가 수신될 때, 제목과 같은 Exception이 발생했다.
명시한 data class와 별개로 해당 상황에 대한 response body convert 처리가 필요한 것으로 파악된다.
따라서 다음과 같이 Custom Converter Factory를 생성하여 Retrofit Builder에 반영해주어야한다.
class EmptyResponseConverterFactory : Converter.Factory() {
override fun responseBodyConverter(
type: Type,
annotations: Array<out Annotation>,
retrofit: Retrofit
): Converter<ResponseBody, *> {
val delegate = retrofit.nextResponseBodyConverter<Any>(this, type, annotations)
return Converter<ResponseBody, Any> {
if (it.contentLength() == 0L) return@Converter ""
delegate.convert(it)
}
}
}
명시적으로 ""라는 빈 문자열 값으로 Convert 하도록 한다.
return Retrofit.Builder()
.baseUrl(url)
.client(getClient())
.addConverterFactory(EmptyResponseConverterFactory())
.addConverterFactory(GsonConverterFactory.create())
.build()
.create(apiClass)
새로운 ConverterFactory에 Class를 추가한 뒤,
if (response.body().toString().isEmpty()) {
Log.d("TEST", "response body is empty!")
}
다음과 같은 형태로 확인 가능했다.
반응형