Rest-Assured中multipart/mixed音频上传测试异常求助
排查Rest-Assured中multipart/mixed音频上传请求的问题
我看了你的问题描述、原始请求示例和测试代码,发现几个关键问题导致Rest-Assured无法正确构建符合要求的multipart/mixed请求,下面帮你逐一排查并给出修正方案:
核心问题分析
1. 边界值格式错误
你设置的contentType中,boundary的写法不符合HTTP规范:
- 原始请求里的格式是
multipart/mixed; boundary="====outer123==" - 你的代码写成了
boundary=====outer123==,既缺少引号包裹,等号数量也和原始请求不一致,这会导致Rest-Assured无法正确分割多部分请求内容。
2. MultiPart构建逻辑混乱
- 多余的
multiPart项:代码里的multiPart("text", dataProvider.getAudioAttachment())是原始请求里没有的额外部分,会干扰服务器对请求的解析。 - JSON请求体构建错误:你把
Content-Disposition放进了jsonRequestMap中,这完全错误——这个Header属于multipart部分的头部,不是JSON内容的一部分。你应该直接传入JSON内容,由MultiPartSpecBuilder处理部分头部。 - 音频部分构建错误:用
jsonAttachmentMap来构建音频部分的方式不对,音频部分需要传入实际的音频文件内容(字节流/File/InputStream),而非把头部参数放进Map。
3. 路径参数误用
你的PUT请求路径包含{msisdn}占位符,但代码里用了queryParam("msisdn", ...),这会把msisdn作为查询参数拼在URL后,和原始请求的路径参数结构不符。
修正后的测试代码
@Test public void uploadAudio() { // 1. 构建和原始请求一致的JSON请求体(复杂结构建议用POJO+ObjectMapper生成) String jsonRequestBody = "{\n" + " \"object\": {\n" + " \"parentFolderPath\": \"Media/VR\",\n" + " \"attributes\": {\n" + " \"attribute\": [\n" + " {\n" + " \"name\": \"Date\",\n" + " \"value\": \"2014-03-17T12:37:59Z\"\n" + " },\n" + " {\n" + " \"name\": \"Message-Id\",\n" + " \"value\": \"950124.162336@example.com\"\n" + " }\n" + " ]\n" + " }\n" + " }\n" + "}"; // 2. 获取音频文件内容(确保返回byte[]/File/InputStream类型) Object audioContent = dataProvider.getAudioAttachment(); given() // 设置正确的Content-Type,包含带引号的边界值 .contentType("multipart/mixed; boundary=\"====outer123==\"") // 第一部分:JSON请求体 .multiPart(new MultiPartSpecBuilder(jsonRequestBody) .controlName("request") .mimeType("application/json; charset=UTF-8") .build()) // 第二部分:音频文件 .multiPart(new MultiPartSpecBuilder(audioContent) .controlName("attachment") .emptyFileName() // 匹配原始请求的filename="" .header("Content-ID", "duicw78fhage7f") // 设置音频部分的Content-ID .mimeType("audio/wav") .build()) // 替换路径中的msisdn占位符 .pathParam("msisdn", "14565894558") .header("Authorization", "Basic xxxxxxxx") .header("Cache-Control", "no-cache") .when() // 发起PUT请求,使用路径参数 .put("https://<host>/<service>/v1/audio/{msisdn}") .then() .statusCode(200); }
额外排查建议
- 启用Rest-Assured的日志功能,打印出生成的请求详情,和原始请求对比,方便定位差异:
given() .log().all() // 打印完整请求信息 // ... 其他配置 .when() .put(...) .then() .log().all(); // 打印完整响应信息 - 如果JSON结构复杂,建议用POJO类构建对象,再通过Jackson/Gson转成字符串,避免手动拼接JSON出错。
内容的提问来源于stack exchange,提问作者amelongo
相关产品推荐
相关产品推荐

