Ktor 2.3.4因响应头Content-Type为text/html无法解析JSON求解决方案
解决Ktor解析Content-Type为text/html的JSON响应问题
针对你遇到的服务器返回JSON但Content-Type为text/html导致Ktor无法解析的问题,以下是几种可行的解决方案:
方案一:让Gson序列化器支持text/html类型
Ktor的ContentNegotiation默认只会让Gson处理application/json类型的响应,我们可以手动注册让Gson同时处理text/html类型,这样不管响应头是什么,只要内容是JSON就会被正确解析:
val client = HttpClient(OkHttp) { install(ContentNegotiation) { gson { register(ContentType.Text.Html, GsonConverter(this)) register(ContentType.Application.Json, GsonConverter(this)) } } }
方案二:使用Ktor客户端拦截器修改响应头
你之前用OkHttp引擎的拦截器无效,是因为Ktor的ContentNegotiation处理流程在OkHttp引擎返回响应后,且Ktor的响应对象与OkHttp的响应对象是分离的,修改OkHttp层面的头无法被Ktor的解析流程感知。改用Ktor自带的响应拦截器,在ContentNegotiation处理前修改响应头:
val client = HttpClient(OkHttp) { install(ContentNegotiation) { gson() } intercept(HttpResponsePipeline.Receive) { context -> val modifiedHeaders = context.response.headers.toMap().toMutableMap().apply { this["Content-Type"] = listOf("application/json; charset=utf-8") } context.response = context.response.copy(headers = Headers(modifiedHeaders)) proceed() } }
方案三:手动解析响应体
如果上面两种方案都不适用,可以直接跳过Ktor的自动解析,手动获取响应文本后用Gson解析:
val client = HttpClient(OkHttp) val responseText = client.get("你的API地址").bodyAsText() val result = Gson().fromJson(responseText, YourTargetClass::class.java)
内容的提问来源于stack exchange,提问作者gokhan
相关产品推荐
相关产品推荐

