jsonrestspring-bootpostman

How to send the Multipart file and json data to spring boot


I have the POST request api call to accept the json body request parameters and multipart file from client side(postman or java client).

I want to pass both the json data and multipart file in single request.

I have written the code like below.

@RequestMapping(value = "/sendData", method = RequestMethod.POST, consumes = "multipart/form-data")
public ResponseEntity<MailResponse> sendMail(@RequestPart MailRequestWrapper request) throws IOException

But, i could not accomplish it using postman rest client.

I'm using spring boot on server side.

Could anyone suggest me on this question.

Thanks in advance,


Solution

  • You cat use @RequestParam and Converter for JSON objects
    simple example :

    @SpringBootApplication
    public class ExampleApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(ExampleApplication.class, args);
        }
    
        @Data
        public static class User {
            private String name;
            private String lastName;
        }
    
        @Component
        public static class StringToUserConverter implements Converter<String, User> {
    
            @Autowired
            private ObjectMapper objectMapper;
    
            @Override
            @SneakyThrows
            public User convert(String source) {
                return objectMapper.readValue(source, User.class);
            }
        }
    
        @RestController
        public static class MyController {
    
            @PostMapping("/upload")
            public String upload(@RequestParam("file") MultipartFile file, 
                                 @RequestParam("user") User user) {
                return user + "\n" + file.getOriginalFilename() + "\n" + file.getSize();
            }
    
        }
    
    }
    

    and postman: enter image description here

    UPDATE apache httpclient 4.5.6 example:

    pom.xml dependency:

        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpclient</artifactId>
            <version>4.5.6</version>
        </dependency>
        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpmime</artifactId>
            <version>4.5.6</version>
        </dependency>
    
       <!--dependency for IO utils-->
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.6</version>
        </dependency>
    

    service will be run after application fully startup, change File path for your file

    @Service
    public class ApacheHttpClientExample implements ApplicationRunner {
    
        private final ObjectMapper mapper;
    
        public ApacheHttpClientExample(ObjectMapper mapper) {
            this.mapper = mapper;
        }
    
        @Override
        public void run(ApplicationArguments args) {
            try (CloseableHttpClient client = HttpClientBuilder.create().build()) {
                File file = new File("yourFilePath/src/main/resources/foo.json");
                HttpPost httpPost = new HttpPost("http://localhost:8080/upload");
    
                ExampleApplication.User user = new ExampleApplication.User();
                user.setName("foo");
                user.setLastName("bar");
                StringBody userBody = new StringBody(mapper.writeValueAsString(user), MULTIPART_FORM_DATA);
                FileBody fileBody = new FileBody(file, DEFAULT_BINARY);
    
                MultipartEntityBuilder entityBuilder = MultipartEntityBuilder.create();
                entityBuilder.addPart("user", userBody);
                entityBuilder.addPart("file", fileBody);
                HttpEntity entity = entityBuilder.build();
                httpPost.setEntity(entity);
    
                HttpResponse response = client.execute(httpPost);
                HttpEntity responseEntity = response.getEntity();
    
                // print response
                System.out.println(IOUtils.toString(responseEntity.getContent(), UTF_8));
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
    }
    

    console output will look like below:

    ExampleApplication.User(name=foo, lastName=bar)
    foo.json
    41