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

如何在Retrofit的POST请求中传递URL避免字符转义?

Retrofit POST请求中避免URL参数被转义的解决方法

你遇到的问题本质是JSON序列化过程中自动转义了URL里的特殊字符(比如=被转成\u003d、&被转成\u0026),根源在于手动拼接JSON字符串再序列化的方式,触发了序列化工具的默认转义规则。以下是几种实用的解决办法:

方法一:用数据类代替手动拼接JSON(推荐)

手动拼接JSON字符串不仅容易出错,还会导致不必要的字符转义。直接定义对应的数据类,让序列化工具自动处理请求体,能从根源解决问题。

// 定义与请求体结构匹配的数据类
data class PostRequest(
    val uuid: String, // 根据实际类型调整,比如如果是Long就改成Long
    val image_url: String
)

// 重构后的调用代码
val postRequest = PostRequest(uuid = uuid, image_url = url)
val retroService = RetroInstance().getInstance(randomUrl)?.create(ApiService::class.java)
callPostResponse = retroService?.getPostResponse(postRequest)

这种方式下,Jackson会直接序列化数据类,不会对URL中的合法特殊字符进行转义。

方法二:配置Jackson禁用不必要的字符转义

如果必须保留手动拼接JSON的方式,可以通过配置ObjectMapper,让它只转义JSON语法必需的字符(比如双引号),不对URL中的=、&等字符转义。

val mapper = jacksonObjectMapper().apply {
    // 禁用非ASCII字符转义,仅保留JSON语法必要的转义
    configure(JsonGenerator.Feature.ESCAPE_NON_ASCII, false)
    // 允许未转义的控制字符(适配URL中的特殊符号)
    configure(JsonParser.Feature.ALLOW_UNQUOTED_CONTROL_CHARS, true)
}

val finalInput = JSONObject("{\"uuid\":${uuid},\"image_url\":\"${url}\"}")
val requestBody = mapper.readValue(finalInput.toString(), Any::class.java)

val retroService = RetroInstance().getInstance(randomUrl)?.create(ApiService::class.java)
callPostResponse = retroService?.getPostResponse(requestBody)

注意:这种方式仍存在手动拼接JSON的潜在风险(比如uuid包含特殊字符时会破坏JSON结构),仅作为临时方案使用。

方法三:检查Retrofit的Converter配置

确保Retrofit使用的JacksonConverterFactory没有额外的强制转义配置。如果你的Retrofit实例初始化时自定义了ObjectMapper,确认其规则是否合理:

val retrofit = Retrofit.Builder()
    .baseUrl(baseUrl)
    // 使用默认或配置正确的ObjectMapper
    .addConverterFactory(JacksonConverterFactory.create(jacksonObjectMapper()))
    .build()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 22:30:53