Multipart-form-data请求报400错误:手机通讯录同步接口问题
问题排查与修复方案
我仔细对比了你的服务端、客户端代码以及Postman的正常请求,找到了几个关键问题,逐个修复后应该就能解决400错误:
1. 表单字段名拼写不匹配
你的服务端代码里用的是@FormDataParam("filed1")(注意这里是filed1,少了一个字母'e'),但客户端调用addFormField("field1","test")传的是field1,字段名完全不匹配,服务端无法解析到对应的参数,直接返回400。
修复服务端代码:把filed1改成field1:
public Response handleUpload(@FormDataParam("field1") InputStream stream) { // 原有逻辑不变 }
2. 客户端MultiPartReq的表单字段格式错误
你的addFormField方法生成的multipart格式不符合HTTP规范,主要有两个问题:
- 写完
Content-Disposition头之后,没有添加空行就直接写字段值(HTTP头和内容之间必须有一个空行分隔) - 方法末尾错误地添加了
--boundary,这会提前结束字段,导致整个请求格式混乱
修复客户端addFormField方法:
public void addFormField(String name, String value) { writer.append("--").append(boundary).append(LINE_FEED); writer.append("Content-Disposition: form-data; name=\"").append(name).append("\"") .append(LINE_FEED); // 新增:添加空行分隔头和内容 writer.append(LINE_FEED); writer.append(value).append(LINE_FEED); // 移除末尾多余的--boundary,这个应该在finish方法里统一处理 writer.flush(); }
3. 请求URL格式错误
客户端发起请求的URL里多了一个冒号:http://35.200.xx.xx:/example,正确的格式应该是http://35.200.xx.xx/example,这个错误会导致请求地址无效,也是400错误的潜在原因。
修复URL:
String url="http://35.200.xx.xx/example";
4. Finish方法的边界符格式优化
你的finish方法里,在添加结束边界符之前的逻辑可以调整得更规范,确保格式完全符合multipart标准:
public List<String> finish() throws IOException { List<String> response = new ArrayList<String>(); // 先添加一个空行,分隔最后一个字段和结束边界 writer.append(LINE_FEED).flush(); // 结束边界必须是--boundary-- writer.append("--").append(boundary).append("--").append(LINE_FEED); writer.close(); // 原有状态码检查和响应读取逻辑不变 }
额外建议:添加内容类型头(可选)
如果后续你要上传JSON格式的通讯录数据,最好给表单字段添加Content-Type头,明确告知服务端数据格式,比如:
public void addJsonFormField(String name, String jsonValue) { writer.append("--").append(boundary).append(LINE_FEED); writer.append("Content-Disposition: form-data; name=\"").append(name).append("\"") .append(LINE_FEED); writer.append("Content-Type: application/json; charset=").append(charset).append(LINE_FEED); writer.append(LINE_FEED); writer.append(jsonValue).append(LINE_FEED); writer.flush(); }
把这些问题逐个修复后,再测试请求,应该就能正常返回200了。
内容的提问来源于stack exchange,提问作者prem jangir




