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

Retrofit POST请求中字符串转Unicode问题求助

问题排查与解决方案

核心问题:Gson配置未正确关联到Retrofit

你遇到的字符串转Unicode问题,大概率是自定义Gson实例没有被Retrofit正确使用——即便你调用了disableHtmlEscaping(),如果这个Gson没传给Retrofit的转换器,依然会用默认Gson实例(默认会转义部分字符)。

1. 检查Dagger-Hilt中Retrofit的配置

确保你把自定义Gson实例传入GsonConverterFactory.create(),而不是用无参的GsonConverterFactory.create()(无参会创建默认Gson)。

示例代码:

// 提供自定义Gson实例
@Provides
@Singleton
fun provideCustomGson(): Gson {
    return GsonBuilder()
        .disableHtmlEscaping() // 禁用HTML转义,包括=等字符
        .create()
}

// 提供Retrofit时注入自定义Gson
@Provides
@Singleton
fun provideRetrofit(okHttpClient: OkHttpClient, customGson: Gson): Retrofit {
    return Retrofit.Builder()
        .baseUrl("你的BaseUrl")
        .client(okHttpClient)
        .addConverterFactory(GsonConverterFactory.create(customGson)) // 关键:传入自定义Gson
        .build()
}

2. 排除其他转换器的干扰

如果你的Retrofit配置中添加了其他ConverterFactory(比如ScalarsConverterFactory、MoshiConverterFactory),要确保GsonConverterFactory的顺序正确——如果是JSON请求体,它应该是处理该类型的首要转换器。

3. 验证实际发送的请求体(不要只信Logcat)

有时候Logcat会对输出的字符串做转义显示,但实际发送的内容是正确的。建议添加OkHttp日志拦截器,直接查看原始请求体:

@Provides
@Singleton
fun provideOkHttpClient(): OkHttpClient {
    val loggingInterceptor = HttpLoggingInterceptor().apply {
        level = HttpLoggingInterceptor.Level.BODY // 打印完整请求/响应体
    }
    return OkHttpClient.Builder()
        .addInterceptor(loggingInterceptor)
        .build()
}

查看拦截器输出的Request Body部分,确认字符串是否真的被转义。

4. 特殊情况:非JSON请求体

如果你的POST接口用的是@FormUrlEncoded或@Multipart(表单提交),而非JSON请求体,那么Gson的配置完全不生效。此时需要确保表单参数的编码正确:

  • 用@Field注解时,默认会做URL编码,若要保留原始字符串,可以手动处理编码或使用encoded = true参数:
@FormUrlEncoded
@POST("your-endpoint")
suspend fun postData(@Field(value = "key", encoded = true) value: String): Response<YourResponse>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 06:02:50