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