개발에필요한연동법/스프링연동
Spring3 MVC + HttpClient를 이용하여 GET/POST/Multipart API 웹서버 구축해보기
개발로짜
2014. 12. 7. 17:30
이번 포스팅은 Spring MVC 와 HttpClient 라이브러리를 연동하여 API 웹서버 예를 들어보도록 하겠습니다.
HttpClient는 주로 api호출을 하여 서버로부터 받은 데이터(JSON 또는 XML)를
클라이언트(웹 또는 안드로이드)에서 응답받아서 화면에 파싱작업을 진행을 할때 주로 사용합니다.
GET/POST/Multipart(파일처리) 이 3가지에 대하여 알아보도록 하겠습니다.
응답데이터는 JSON 규격으로 클라이언트로 보내는걸로 진행 하겠습니다.
API 서버코드 (GET/POST/MultipartFile)
//GET 방식 @RequestMapping(value="/getServer", method=RequestMethod.GET) public @ResponseBody Map<String, Object> getServer(HttpServletRequest request, HttpServletResponse response) { System.out.println("GET Server Response"); Map<String, Object> map = new HashMap<String, Object>(); //클라이언트 페이지로 부터 Httpclient로 받은 parameter값 map.put("param1", request.getParameter("param1")); map.put("param2", request.getParameter("param2")); map.put("flag", "get"); map.put("success", true); return map; } //POST 방식 @RequestMapping(value="/postServer", method=RequestMethod.POST) public @ResponseBody Map<String, Object> postServer(HttpServletRequest request, HttpServletResponse response) { System.out.println("POST Server Response"); Map<String, Object> map = new HashMap<String, Object>(); //클라이언트 페이지로 부터 Httpclient로 받은 parameter값 map.put("param1", request.getParameter("param1")); map.put("param2", request.getParameter("param2")); map.put("flag", "post"); map.put("success", true); return map; } //MultipartFile 방식 @RequestMapping(value="/multipartServer", method=RequestMethod.POST) public @ResponseBody Map<String, Object> multipartServer(Vo vo,HttpServletRequest request) { System.out.println("Multipart Server Response"); Map<String, Object> map = new HashMap<String, Object>(); //클라이언트 페이지로 부터 Httpclient로 받은 parameter값 map.put("txt", request.getParameter("txt")); //클라이언트 페이지로 부터 Httpclient로 받은 multipart parameter값 map.put("filename", vo.getFileupload().getOriginalFilename()); map.put("filesize", vo.getFileupload().getSize()); map.put("flag", "multipart"); map.put("success", true); return map; }
MultipartFile을 받기위한 Vo 클래스
public class Vo { private MultipartFile fileupload; public MultipartFile getFileupload() { return fileupload; } public void setFileupload(MultipartFile fileupload) { this.fileupload = fileupload; } }
다음은 클라이언트 페이지에서 HttpClient를 이용하여
API 서버를 호출하는 라이브러리 추가 및 샘플코드를 다음과 같이 작성해보도록 합니다.
HttpClient 관련 라이브러리 Pom.xml 추가
<!-- HttpClient 라이브러리 설정 --> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.3.6</version> </dependency> <!-- HttpClient - Multipart를 위한 라이브러리 설정 --> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpmime</artifactId> <version>4.3.6</version> </dependency>
사용자페이지 샘플 컨트롤러
//Get방식 호출을 위한 샘플폼화면 @RequestMapping(value="/getForm") public String getForm(HttpServletRequest request, HttpServletResponse response) { return "getForm"; } //Post방식 호출을 위한 샘플폼화면 @RequestMapping(value="/postForm") public String postForm(HttpServletRequest request, HttpServletResponse response) { return "postForm"; } //Multipart방식 호출을 위한 샘플폼화면 @RequestMapping(value="/multipartForm") public String multipartForm(HttpServletRequest request, HttpServletResponse response) { return "multipartForm"; }
getForm.jsp샘플코드
<form action="/getSubmit" method="get"> <input type="text" name="param1" /><br/> <input type="text" name="param2" /><br/> <input type="submit" value="GET전송"/> </form>
postForm.jsp샘플코드
<form action="/postSubmit" method="post"> <input type="text" name="param1" /><br/> <input type="text" name="param2" /><br/> <input type="submit" value="POST전송"/> </form>
multipartForm.jsp샘플코드
<form action="/multipartSubmit" method="post" enctype="multipart/form-data"> <input type="file" name="fileupload" /><br/> <input type="text" name="txt" /><br/> <input type="submit" value="POST전송"/> </form>
HttpClient 호출 GET
//Get Submit @RequestMapping(value="/getSubmit") public void getSubmit(HttpServletRequest request) { try { CloseableHttpClient httpclient = HttpClients.createDefault(); //GET 방식으로 parameter를 전달 HttpGet httpGet = new HttpGet("http://localhost:7070/getServer?param1="+request.getParameter("param1")+"¶m2="+request.getParameter("param2")); CloseableHttpResponse response = httpclient.execute(httpGet); try { System.out.println(response.getStatusLine()); //API서버로부터 받은 JSON 문자열 데이터 System.out.println(EntityUtils.toString(response.getEntity())); HttpEntity entity = response.getEntity(); EntityUtils.consume(entity); } finally { response.close(); } } catch (Exception e) { e.printStackTrace(); } }
HttpClient 호출 POST
//Post Submit @RequestMapping(value="/postSubmit") public void postSubmit(HttpServletRequest request) { try { CloseableHttpClient httpclient = HttpClients.createDefault(); HttpPost httpPost = new HttpPost("http://localhost:7070/postServer"); //전달하고자 하는 PARAMETER를 List객체에 담는다 List <NameValuePair> nvps = new ArrayList >NameValuePair>(); nvps.add(new BasicNameValuePair("param1", request.getParameter("param1"))); nvps.add(new BasicNameValuePair("param2", request.getParameter("param2"))); //UTF-8은 한글 httpPost.setEntity(new UrlEncodedFormEntity(nvps,"UTF-8")); CloseableHttpResponse response = httpclient.execute(httpPost); try { System.out.println(response.getStatusLine()); //API서버로부터 받은 JSON 문자열 데이터 System.out.println(EntityUtils.toString(response.getEntity())); HttpEntity entity = response.getEntity(); EntityUtils.consume(entity); } finally { response.close(); } } catch (Exception e) { e.printStackTrace(); } }
HttpClient 호출 Multipart
//파일첨부 MultipartFile Submit @RequestMapping(value="/multipartSubmit") public void multipartSubmit(HttpServletRequest request, Vo vo) { CloseableHttpClient httpclient = HttpClients.createDefault(); try { HttpPost httppost = new HttpPost("http://localhost:7070/multipartServer"); File convFile = new File(vo.getFileupload().getOriginalFilename()); vo.getFileupload().transferTo(convFile); FileBody multipart = new FileBody(convFile); //Charset.forName("UTF-8") : 한글깨짐 방지를위함 StringBody txt = new StringBody(request.getParameter("txt"), Charset.forName("UTF-8")); //API 서버에 전달하고자하는 PARAMETER HttpEntity reqEntity = MultipartEntityBuilder.create().addPart("fileupload", multipart).addPart("txt", txt).build(); httppost.setEntity(reqEntity); CloseableHttpResponse response = httpclient.execute(httppost); try { System.out.println(response.getStatusLine()); //API서버로부터 받은 JSON 문자열 데이터 System.out.println(EntityUtils.toString(response.getEntity())); HttpEntity resEntity = response.getEntity(); if (resEntity != null) { System.out.println("Response content length: " + resEntity.getContentLength()); } EntityUtils.consume(resEntity); } finally { response.close(); } } catch(Exception e){ e.printStackTrace(); }finally { try { httpclient.close(); } catch (IOException e) {} } }
위와같이 코드를 작성하였다면 각 폼컨트롤러 호출을 하여
실행테스트를 해보도록 하겠습니다.
/getForm 실행결과(화면)
/getForm 실행결과(콘솔)
/postForm 실행결과(화면)
/postForm 실행결과(콘솔)
/multipartForm 실행결과(화면)
/multipartForm 실행결과(콘솔)
위와같이 정상적으로 API서버에 PARAMETER 또는 MultipartFile 전송 후
응답값을 받아오는 것을 확인 할 수 있었습니다.
안드로이드 API 서버 구축시 또는 외부 API 서버로부터 API 호출할 경우가 생긴다면
해당 샘플을 응용하여 사용하시면 되겠습니다.
by 개발로짜