You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 00:42:15