@RequestPart 요청을 RestTemplate으로 보내기

ljk·2023년 8월 27일
0
post-thumbnail

**미리적는 결론: multipart파일은 multipart/form-data를 content-type으로 지정한 header를 이용해서 httpEntity를 생성해서 multuvalueMap에 add해주고,

일반 객체는 application/json을 content-type으로 지정해서 생성한 httpEntity를 multivalueMap에 add해서 request를 보낸다.**

해결하다 보니 밤이 늦어져서 두서없이 적어본다.

맨 처음 구성한 RestTemplate 로직은

multiPartFile따로, Object따로 요청을 보내 커넥션이 두개 생기는 상황이였다.

처음에 아예 서로 로직이 따로 분리되어있어 아무 생각없이 그 방법대로 resttemplate으로 옮기기만 했는데, 해당 부분을 좀 더 분석해보니
처음부터 fileList와 Object를 같이 보내고 해결 할 수 있었다.

그래서 그 두개를 합치는 개 뻘짓을 시작했고...

맨 처음에 그 두개를 합치는 방법을 구현한것은,

MultivalueMap에 Byte[]와 Object의 field를 풀어서 하나씩 담아서 보내고, 받는 spring server쪽에서 @ModelAttribute와 @RequestParam으로 받았다.

근데 Spring Server에서 받는 부분이 restApi부분이라

굳이 Model을 생성하는 ModelAttribute를 쓰는것도 별로고,
MultipartFile을 RequestParam으로 받는것도 마음에 들지 않았다.

그래서 RequestPart를 사용해서 받는 방식으로 바꾸기로 했다.

일단 처음에는

MultiValueMap을 만들고, server측에서 받을 name을 똑같이 지정한 후, 객체를 그대로 add했다.

그랬더니 Could not write request: no suitable HttpMessageConverter found for request type [java.util.LinkedHashMap]

이 에러가 발생...

아 객체 자체를 보내면 안되나? 해서

new ObjectMapper().writeValueAsString을 사용해서 보내보았다.

그랬더니 이번에는 server측에서 415error가 떴다.

정확히 메세지는 기억이 안나는데 text/plain뭐시기였던거 같다.

아무튼 그래서 어? 보낼 때 multipart/form-data로 지정해서 보내줬는데 왜 method가 마음대로 바뀌었지?

라는 생각을 바로는 못하고 한참을 삽질하다가...

MultipartBodyBuilder를 발견했다.

근데 문제는 현재 프로젝트에서는 지원을 안해서 pom.xml에 의존성을 주입해야 했는데, 나 혼자하는 프로젝트도 아니고 해서 함부로 의존성을 주입하기 좀 그랬다.

그래서 MultipartBodyBuilder동작방식을 좀 더 찾아보니,

설정을 다 설정하고 마지막에 build()를 하면,

MultiValueMap<String, HttpEntity>를 반환하더라.

그래서 그대로 만들어서 보내봤는데 또

http 415 error -> text/plain뭐시기 지원안함 에러가 떴다.

그래서 더 찾아보니 multipart파일을 보낼때는 multipart/form-data를 content-type으로 지정한 header를 이용해서 httpEntity를 생성해서 multuvalueMap에 add해주고,

일반 객체를 보낼때는 application/json을 content-type으로 지정해서 생성한 httpEntity를 multivalueMap에 add해서 request를 보내니

드디어!!!!!! server측에서 @RequestPart로 값을 받았다.

뿌듯한 하루다.

0개의 댓글