OkHttp3.9.1请求返回400但Postman返回201的排查求助
排查OkHttp 3.9.1请求返回400但Postman正常的问题
嘿,我之前也碰到过类似的诡异问题,咱们一步步拆解看看:
首先你贴的OkHttp请求开头有一串乱码:8G^|E@@}P~r#]'z@ m'<8`,这绝对不是HTTP请求的正常起始内容——这说明你的请求在发送前就被混入了垃圾数据,这很可能就是API返回400的核心原因。
下面是具体的排查和解决方向:
1. 先确认请求构建阶段的问题
别光看Wireshark的抓包,先给OkHttp加个日志拦截器,打印完整的请求内容(包括请求头和请求体),和Postman导出的原始请求文本做对比:
// 添加日志拦截器,需要引入对应的依赖 HttpLoggingInterceptor logging = new HttpLoggingInterceptor(); logging.setLevel(HttpLoggingInterceptor.Level.BODY); OkHttpClient client = new OkHttpClient.Builder() .addInterceptor(logging) .build();
如果日志里的请求开头就有那串乱码,那问题出在本地代码构建请求的环节,和网络传输无关。
2. 排查可能的垃圾数据来源
- 拦截器污染:检查你有没有自定义拦截器,是不是在拦截器里不小心向请求流中写入了多余内容(比如日志输出时误操作了请求体流)。
- 请求体构建错误:如果是手动拼接
MultipartBody,检查有没有在part的内容或边界里混入了不可见字符;如果用addFormDataPart,确认参数值里没有意外的转义或特殊字符。 - 连接复用残留:OkHttp默认会复用连接,如果之前的请求有未完全关闭的流,可能会导致残留数据被带到下一个请求里。试试在构建
OkHttpClient时禁用连接复用测试:OkHttpClient client = new OkHttpClient.Builder() .connectionPool(new ConnectionPool(0, 1, TimeUnit.NANOSECONDS)) .build();
3. 考虑版本bug的可能性
OkHttp 3.9.1是2018年的老版本,存在一些已知的multipart请求相关的小bug。建议升级到3.x分支的最后一个稳定版(3.14.9),很多旧版本的奇怪问题都会被修复。
4. 核对multipart请求的细节
即使Wireshark说没差异,也再仔细核对这几点:
Content-Type里的boundary值,是否和请求体中实际使用的分隔线完全一致(包括大小写、连字符)。- 每个multipart part的
Content-Disposition、Content-Type头,是否和Postman的请求完全匹配(比如有没有少引号、参数拼写错误)。
按这个流程排查下来,应该能定位到问题所在——大概率是请求构建时混入了多余字符,或者老版本的OkHttp在处理multipart时的小bug。
内容的提问来源于stack exchange,提问作者atom-22
相关产品推荐
相关产品推荐

