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

如何修改Ktor对查询参数中空格的编码方式?

让Ktor始终将查询参数空格编码为%20的解决方案

默认Ktor会把查询参数中的空格编码为+,要强制替换为%20,可以通过以下几种方式实现:

1. 手动编码单个参数(适合个别请求)

定义自定义编码函数,覆盖默认的空格转换逻辑,然后在添加参数时使用编码后的值:

// 自定义编码函数:将默认编码后的+替换为%20
fun encodeParamWithPercent20(value: String): String {
    return encodeURLQueryComponent(value).replace("+", "%20")
}

// 使用示例
val client = HttpClient(OkHttp)
val response = client.get("https://your-target-api.com/api/endpoint") {
    url {
        // 使用appendEncoded添加已编码的参数值
        parameters.appendEncoded("query", encodeParamWithPercent20("hello world"))
    }
}

2. 扩展UrlBuilder实现全局便捷调用

如果多个请求需要该逻辑,可以扩展UrlBuilder,封装参数添加逻辑:

fun UrlBuilder.appendQueryParam(name: String, value: String) {
    val encodedValue = encodeURLQueryComponent(value).replace("+", "%20")
    parameters.appendEncoded(name, encodedValue)
}

// 使用示例
val response = client.get("https://your-target-api.com/api/endpoint") {
    url {
        appendQueryParam("query", "hello world")
    }
}

3. 全局替换URL编码策略(所有请求生效)

通过自定义UrlSerializer,全局修改所有请求的URL编码逻辑,自动将查询参数中的+替换为%20:

val customUrlSerializer = object : UrlSerializer {
    override fun serializeUrl(url: Url): String {
        val originalUrl = DefaultUrlSerializer.serializeUrl(url)
        // 仅替换查询参数部分的+为%20,避免影响URL其他部分
        return originalUrl.replace(Regex("(\\?|&)([^&=]+)=([^&]*)")) { match ->
            val key = match.groupValues[2]
            val processedValue = match.groupValues[3].replace("+", "%20")
            "${match.groupValues[1]}$key=$processedValue"
        }
    }

    override fun parseUrl(url: String): Url {
        return DefaultUrlSerializer.parseUrl(url)
    }
}

// 配置HttpClient时启用自定义序列化器
val client = HttpClient(OkHttp) {
    install(UrlSerializer) {
        urlSerializer = customUrlSerializer
    }
}

以上三种方式可以根据需求选择:个别请求用手动编码,多个请求用扩展方法,全局生效则用自定义UrlSerializer。

内容的提问来源于stack exchange,提问作者Southpaw1496

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 19:15:56