You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动