You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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放进了jsonRequest Map中,这完全错误——这个Header属于multipart部分的头部,不是JSON内容的一部分。你应该直接传入JSON内容,由MultiPartSpecBuilder处理部分头部。
  • 音频部分构建错误:用jsonAttachment Map来构建音频部分的方式不对,音频部分需要传入实际的音频文件内容(字节流/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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 06:53:58