Today I Learn

[TIL] Android - java.io.EOFException: End of input at line 1 column 1 path $ 대응

SeungYong.Lee 2024. 1. 4. 12:22
반응형

아래와 같이 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 처리에 대해 별도로 추가를 해주어야 한다.

 

반응형