본문 바로가기

Android/Troubleshooting

Ktor text/html content-type 반환으로 인한 문제 해결

Response header `ContentType: text/html; charset=utf-8`
Request header `Accept: application/json`

 

안드로이드에서 Ktor를 사용하다가 보면 마주칠 수 있는 문제다.

보통 원인은 아래의 둘 중 하나이다.

 

1. Response 타입 불일치 

클라이언트가 서버에게 특정 형식의 응답(ex. application/json)을 기대하고 있지만, 서버는 'text/html; charset=utf-8' 형식으로 응답하는 경우

 

2. Converter의 부재

현재 Ktor Client 설정에 "text/html" 형식의 응답을 처리할 수 있는 컨텐츠 컨버터(Content Converter)가 없는 경우

이 경우, HTML 형식을 처리할 수 없어 NoTransformationFoundException 오류가 발생할 수 있다.

 

본인은 Gson을 사용중이라 의외로 간단하게 해결했다.

install(ContentNegotiation) {
    register(ContentType.Text.Html, GsonConverter(GsonBuilder().create()))
    gson()
}

 

위 코드 스니펫처럼 Html에 대응되는 컨버터를 별도로 추가해 줬다.

만약 Gson이 아닌 kotlinx.serialization을 사용한다면

install(ContentNegotiation) {    
	json(contentType = ContentType.Any, json = Json {
        // 아래와 같은 kotlinx.serialization 구성 추가
        // isLenient = true
        // ignoreUnknownKeys = true
    })
}

 

이렇게 해주면 된다.


Ref.

 

Ktor fails to parse json for api response because of "text/html" content-type at response header

I use Ktor (2.3.4) to send an api request to a server that returns json data. Unfortunately, the server put content-type "text/html" instead of "application/json" at headers which

stackoverflow.com