
HttpClient 사용하기 - Multipart Parameter 보내기
Client가 서버로 파일 을 전송하거나 한번에 여러개의 Form 데이터 를 보내기 위해 사용하는 방식이다.
이미지와 같은 Binary 데이터는 기존 application/x-www-form-urlencoded 나 application/json 과 같은 요청으로 적절치 않아 multipart/form-data 형태의 데이터로 요청을 보낸다.
- application/x-www-form-urlencoded 는 보내는 Paramater를 encoding 해서 전송한다.
 
- 데이터가 영숫자가 아닌 경우 3바이트로 표현하기 때문에 바이너리 파일을 전송할 경우 페이로드를 3배로 만들기 때문에 비효율 적이다.
 
- multipart/form-data 의 경우는 전송한 모든 문자를 인코딩하지 않은 형태로 보낸다.
 
의존성 추가하기
 implementation group: 'org.apache.httpcomponents', name: 'httpmime', version: '4.3.4'
 
  | 
 
MultipartEntityBuilder 를 이용해 HttpEntity 객체 생성
- MultipartEntityBuilder 를 이용해 쉽게 Text나 파일을 (Key, Value) 형태로 Request Body 에 넣을 수 있다.
 
- Text를 보낼때는 addTextBody 메소드를 이용해 값을 넣어주고
 
- 이미지나 파일 데이터를 보낼 때는 addBinaryBody 메소드를 이용해 Binary 파일 을 넣어주고 Content Type 으로 MULTIPART_FORM_DATA 를 명시해준다.
 
HttpEntity httpEntity = MultipartEntityBuilder.create()         .addTextBody("name", "Dongwoo")         .addTextBody("nickname", "Victor")         .addBinaryBody("file",         new File("/Users/dongwoo-yang/test.txt"),         ContentType.APPLICATION_OCTET_STREAM,         "test.txt")         .build();
   | 
 
전체 소스 코드
public class JavaHttpClientMultipart {     public static void main(String[] args) throws IOException {         String url = "http://localhost:8080/test/multipart";         CloseableHttpClient httpClient = HttpClients.createDefault();         HttpPost httpPost = new HttpPost(url);
          HttpEntity httpEntity = MultipartEntityBuilder.create()                 .addTextBody("name", "Dongwoo")                 .addTextBody("nickname", "Victor")                 .addBinaryBody("file",                 new File("/Users/dongwoo-yang/test.txt"),                 ContentType.MULTIPART_FORM_DATA,                 "test.txt")                 .build();
          httpPost.setEntity(httpEntity);
          CloseableHttpResponse response = httpClient.execute(httpPost);
 
          System.out.println("=========================== start ============================");         System.out.println("Status Code: " + response.getStatusLine().getStatusCode());         System.out.println("============================ end =============================");         httpClient.close();     } }
  | 
 
Paramater 요청 받을 수 있는 Back-end 코드
- Spring 에서는 Multipart 요청을 쉽게 처리하기 위해서 MultipartFile 클래스를 제공한다.
 
- MultipartFile 객체로부터 입력 스트립을 받아와 전송된 파일 내용을 읽어온다.
 
@PostMapping(value ="/test/multipart") public ResponseEntity testMultipart(MultipartFile file) throws Exception {     if(file == null){         throw new Exception();     }
      String line;     BufferedReader br = new BufferedReader(new InputStreamReader(file.getInputStream()));     while((line = br.readLine()) != null){         log.info(line);     }
      return  ResponseEntity.ok().build(); }
   | 
 
참고
http://tcpschool.com/html-tag-attrs/form-enctype