728x90
아래와 같이 api 호출 인터페이스를 구성하여 서버와의 통신을 시도했는데, EOFException이 발생했다.
interface TestApi {
@PUT("/api/test")
fun update(
@HeaderMap headers: HashMap<String, String>,
@Body request: BodyRequest
): Call<NormalResponse>
}
java.io.EOFException: End of input at line 1 column 1 path
통신 후, Response를 반환하는데 Empty Response를 반환하고 있었다.
하지만 내가 작업하면서 NormalResponse Type으로 반환되도록 구성하면서 발생하는 것이 원인이었다.
이 경우 2가지 해결 방법이 존재했다.
1. NormalResponse가 아니라 Unit으로 반환하기
): Call<Unit>
즉, 아무것도 반환하지 않는 것이나 마찬가지다.
2. nullOnEmptyConverterFactory 추가하기
private val nullOnEmptyConverterFactory = object : Converter.Factory() {
fun converterFactory() = this
override fun responseBodyConverter(
type: Type,
annotations: Array<out Annotation>,
retrofit: Retrofit
) = object : Converter<ResponseBody, Any?> {
val nextResponseBodyConverter =
retrofit.nextResponseBodyConverter<Any?>(converterFactory(), type, annotations)
override fun convert(value: ResponseBody) =
if (value.contentLength() != 0L) nextResponseBodyConverter.convert(value) else null
}
}
반환된 response data의 length가 0이면 자동으로 null을 반환하도록 처리해 주는 converter다.
이제 구현한 converter를 Retrofit에 add한다.
return Retrofit.Builder()
.baseUrl(url)
.client(getClient())
.addConverterFactory(GsonConverterFactory.create())
.addConverterFactory(nullOnEmptyConverterFactory)
.build()
.create(apiClass)
물론 해당 converter를 사용하게 되면 api 구성 로직에서 null 처리에 대해 별도로 추가를 해주어야 한다.
728x90