Postman上传文件成功但Apache HttpClient调用REST接口失败,OkHttp可正常运行
问题原因
你的Apache HttpClient代码错误点非常明确:手动硬编码设置了Content-type: multipart/form-data请求头,缺失了multipart请求必须的boundary分隔符参数。
当你使用MultipartEntityBuilder构建请求实体时,HttpClient会自动生成随机的boundary分隔符,并且自动给请求添加带boundary参数的Content-Type头,格式类似:Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW。你手动设置的头直接覆盖了这个自动生成的合法头,服务端拿到没有boundary的请求头,根本无法解析multipart表单里的文件内容,自然返回文件解析失败的错误。
而你写的OkHttp代码没有手动设置Content-Type头,框架自动完成了头和boundary的匹配,所以可以正常调用。
修复方案
直接删除手动设置Content-Type的那行代码即可:
// 删掉这行冗余配置 // request.setHeader("Content-type", "multipart/form-data");
如果有特殊场景需要指定boundary,也可以用下面的方式显式配置,不要手动写死头:
MultipartEntityBuilder builder = MultipartEntityBuilder.create(); // 显式指定boundary(非必须,默认会自动生成随机值) builder.setBoundary("your-custom-boundary"); builder.addPart("file", fileBody); HttpEntity entity = builder.build(); request.setEntity(entity); // 从构建好的entity里获取Content-Type设置到请求头,保证boundary一致 request.setHeader(entity.getContentType());
内容的提问来源于stack exchange,提问作者NDY
相关产品推荐
相关产品推荐

