HttpClient 사용하기 - Multipart Parameter 보내기

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 의 경우는 전송한 모든 문자를 인코딩하지 않은 형태로 보낸다.

의존성 추가하기

// https://mvnrepository.com/artifact/org.apache.httpcomponents/httpmime
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

Share