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

