OkHttp发送POST请求时Content-Type头部丢失致请求失败问题排查
解决方案:OkHttp3 4.10.0 POST请求丢失Content-Type头部问题
可能原因及对应解决办法
1. 避免重复设置Content-Type
OkHttp会优先使用RequestBody中指定的MediaType生成Content-Type头部,如果同时在Request.Builder中调用addHeader("Content-Type", ...),可能引发冲突或覆盖问题。正确做法是仅通过RequestBody指定MediaType:
// 正确示例:仅在RequestBody中声明MediaType MediaType mediaType = MediaType.parse("application/json; charset=utf-8"); RequestBody requestBody = RequestBody.create(jsonString, mediaType); Request request = new Request.Builder() .url(mongodbUrl) .post(requestBody) // 不要在此处添加Content-Type头部 .build();
2. 排查自定义拦截器的头部修改操作
如果OkHttpClient添加了自定义拦截器,需检查是否存在误删Content-Type的逻辑,比如request.headers().remove("Content-Type")。确保拦截器保留或正确设置该头部:
// 错误示例:拦截器中误删头部 Interceptor faultyInterceptor = chain -> { Request original = chain.request(); Request modified = original.newBuilder() .removeHeader("Content-Type") // 此处会导致头部丢失 .build(); return chain.proceed(modified); }; // 正确示例:拦截器中保留或正确修改头部 Interceptor validInterceptor = chain -> { Request original = chain.request(); Request modified = original.newBuilder() .header("Content-Type", original.header("Content-Type")) .build(); return chain.proceed(modified); };
3. 升级OkHttp版本至4.10.0以上
OkHttp 4.10.0存在已知bug:当RequestBody的MediaType包含charset参数时,可能导致Content-Type头部处理异常。升级到4.11.0及以上版本可修复该问题,更新依赖示例:
implementation 'com.squareup.okhttp3:okhttp:4.11.0'
4. 强制手动设置Content-Type
若上述方法无效,可尝试绕过OkHttp的自动头部生成逻辑,手动在Request.Builder中指定:
// 不通过RequestBody指定MediaType RequestBody requestBody = RequestBody.create(jsonString, null); Request request = new Request.Builder() .url(mongodbUrl) .post(requestBody) .header("Content-Type", "application/json; charset=utf-8") // 强制设置头部 .build();
验证手段
添加日志拦截器,在请求发送前确认Content-Type头部是否存在:
HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor(message -> { if (message.contains("Content-Type")) { Log.d("OkHttp", "请求头部Content-Type: " + message); } }); loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.HEADERS); OkHttpClient client = new OkHttpClient.Builder() .addInterceptor(loggingInterceptor) .build();
通过日志确认头部状态,再结合上述方案调试排查。
内容的提问来源于stack exchange,提问作者Syed Ali
相关产品推荐
相关产品推荐

