Search code examples
javaspringmultipartform-datamultipartrest-assured

How to send a multipart request with RestAssured?


I have @Controller with method with signature like this:

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

I want to construct multipart request without physically creating any file. I tried doing it like this:

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);

Unfortunately I received response:

Required request part 'file' is not present

I tried looking at RestAssured unit tests and it seems I'm doing it correctly. If I try to pass byte[] or InputStream instead of String, an exception is thrown:

Cannot retry request with a non-repeatable request entity.

Thanks for help.


Solution

  • Your code looks fine and it should work with byte[]. You can use MultiPartSpecBuilder(byte[] content) like below.

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

    The details for error you are getting with byte[] is available at https://github.com/rest-assured/rest-assured/issues/507. According to this you should try with preemptive basic auth like below.

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