如何修改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
相关产品推荐
相关产品推荐

