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

