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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 14:55:20