개발에필요한연동법/스프링연동

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 개발로짜