Android端Ktor Client发起POST请求无响应及JSON构建问题
问题根源
你生成的请求体根本不是标准JSON格式——报错日志里的{country=Philippines}是Map默认toString()的输出,而服务器需要的是{"country": "Philippines"}这种带双引号、用冒号分隔键值的标准JSON。问题出在代码里多做了一步query.toMap().toString(),把Map转成了非JSON字符串,再传给Json.encodeToJsonElement,自然不符合服务器的请求格式要求。
修复代码
直接把Map对象传给序列化方法即可,不需要先转成字符串:
override suspend fun getFlag(url: String, query: MutableMap<String, String>): FlagResponse { Log.d("Flag Requested", "getFlag: $query") return client.post(url) { contentType(ContentType.Application.Json) body = Json.encodeToJsonElement(query.toMap()) } }
更简洁的写法:Ktor Client支持直接把Map作为JSON请求体,无需手动调用序列化方法:
override suspend fun getFlag(url: String, query: MutableMap<String, String>): FlagResponse { Log.d("Flag Requested", "getFlag: $query") return client.post(url) { contentType(ContentType.Application.Json) body = query.toMap() } }
额外检查
确保你的Ktor Client已经配置了JSON序列化插件,否则无法正确处理JSON的序列化与反序列化:
val client = HttpClient(OkHttp) { install(ContentNegotiation) { json(Json { prettyPrint = true isLenient = true ignoreUnknownKeys = true }) } }
内容的提问来源于stack exchange,提问作者Jitendra Prajapati
相关产品推荐
相关产品推荐

