Android OkHttp3 POST请求因Content-Type不符致400错误求助
解决方案:OkHttp POST请求Content-Type匹配问题
核心问题
你的服务器代码中使用严格全等判断req.headers['content-type'] === 'application/json'验证请求头,但Android端设置的MediaType是application/json; charset=utf-8,导致请求头里的Content-Type带了charset参数,服务器判定不匹配,返回400错误。
修复步骤
1. 修正Android端MediaType声明
把带charset的MediaType改为纯application/json,确保请求头与服务器判断逻辑一致:
RequestBody requestBody = RequestBody.create( jsonObject.toString(), MediaType.parse("application/json") );
或者使用OkHttp内置常量更规范:
RequestBody requestBody = RequestBody.create( jsonObject.toString(), MediaType.get("application/json") );
2. 修复Response.body().string()重复调用问题
response.body().string()只能调用一次,因为流会被直接消耗,第二次调用会返回空字符串。修改代码复用已获取的响应内容:
String responseBody = response.body().string(); Log.d("NetworkRequest", "Response Body: " + responseBody); if (response.isSuccessful()) { Log.d("NetworkRequest", "POST was correct"); Log.d("NetworkRequest", responseBody); // 直接使用已获取的responseBody } else { Log.e("NetworkRequest", "something went wrong"); }
额外优化建议
- 优先使用异步请求避免主线程阻塞:
Android主线程不允许同步网络请求,建议切回enqueue()异步方式,防止ANR:
client.newCall(postRequest).enqueue(new Callback() { @Override public void onFailure(@NonNull Call call, @NonNull IOException e) { Log.e("NetworkRequest", "请求失败", e); } @Override public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException { String responseBody = response.body().string(); Log.d("NetworkRequest", "状态码: "+response.code()); Log.d("NetworkRequest", "响应内容: " + responseBody); if (response.isSuccessful()) { Log.d("NetworkRequest", "POST请求成功"); } else { Log.e("NetworkRequest", "请求出错"); } } });
- 优化服务器端Content-Type判断逻辑:
服务器可以放宽判断条件,检查Content-Type是否包含application/json,提升兼容性:
// 替换原有严格全等判断 if (req.headers['content-type']?.includes('application/json')) { // 原有解析逻辑 }
内容的提问来源于stack exchange,提问作者Alberto Palladipelo
相关产品推荐
相关产品推荐

