如何使用RestAssured发送多部分请求?

时间:2016-12-13 15:08:58

标签: java spring multipartform-data multipart rest-assured

我有@Controller方法,签名方式如下:

@PostMapping
@ResponseBody
public ResponseEntity<Result> uploadFileAndReturnJson(@RequestParam("file") MultipartFile file) {}

我想在没有物理创建任何文件的情况下构建多部分请求。我尝试这样做:

private MultiPartSpecification getMultiPart() {
    return new MultiPartSpecBuilder("111,222")
            .mimeType(MimeTypeUtils.MULTIPART_FORM_DATA.toString())
            .controlName("file")
            .fileName("file")
            .build();
}

Response response = RestAssured.given(this.spec)
            .auth().basic("admin", "admin")
            .multiPart(getMultiPart())
            .when().post(URL);

不幸的是我收到了回复:

  

必填请求部分&#39;文件&#39;不存在

我试着看看RestAssured单元测试,似乎我正确地做了。如果我尝试传递byte []或InputStream而不是String,则抛出异常:

  

无法使用不可重复的请求实体重试请求。

感谢您的帮助。

2 个答案:

答案 0 :(得分:4)

您的代码看起来很好,它应该与byte []一起使用。您可以使用下面的MultiPartSpecBuilder(byte[] content)

private MultiPartSpecification getMultiPart() {
         return new MultiPartSpecBuilder("Test-Content-In-File".getBytes()).
                fileName("book.txt").
                controlName("file").
                mimeType("text/plain").
                build();
   }

https://github.com/rest-assured/rest-assured/issues/507提供了您使用byte []获得的错误详情。根据这个,你应该尝试使用prempmptive basic auth,如下所示。

.auth().preemptive.basic("admin", "admin")

答案 1 :(得分:0)

try {

    RestAssured.given()
            .header(new Header("content-type", "multipart/form-data"))
            .multiPart("file",new File( "./src/main/resources/test.txt"))
            .formParam("description", "This is my doc")
            .auth().preemptive().basic(loginModel.getUsername(), loginModel.getPassword())
            .when()
            .post(URL)
            .then()
            .assertThat()
            .body(matchesJsonSchemaInClasspath("schemas/members/member-document.json"));
}
catch(Exception e) {
    Assert.assertEquals(false, true);
    logger.error(e.getMessage(), e);
}