아파치에서 배포하는 HttpClient 3.x 를 이용해 네트워크 데이터 전송 |
개발환경 : JDK 1.5, window XP |
여기에서 설명할 HttpClient 는 안드로이드 API 에 포함된 org.apache.http.client.HttpClient
가 아니다. org.apache.commons.httpclient.HttpClient 를 사용한다. 흔히 웹어플리케이션에서
가장 많이 쓰이며 Http 프로토콜을 사용해 네트워크로 데이터 전송하고 받는 역할을 한다.
HTTP 관련 아파치 사이트는 다음과 같다. http://hc.apache.org/httpclient-3.x/tutorial.html
HttpClient 의 주요 기능은 다음과 같다.
@ HTTP 버전 1.0, 1.1 을 사용한다.
@ HTTP 에서 GET, POST, PUT, DELETE, HEAD, OPTIONS, TRACE 등의 모든 것을 사용가능하다.
@ 커뮤니케이션시 HTTPS 와 HTTP 프록시를 통해 데이터를 주고 받을수 있다.
@ 쿠키의 제어가 가능하다.
(1) POST 로 전송하는 간단한 예제 |
이 예제는 POST 로 데이터를 전송하는 간단한 내용이다. 파라미터로 데이터를 넘기며
리턴받은 데이터를 BufferedReader 로 한줄씩 읽어 들인다. 그리고 마지막에는
releaseConncetion() 호출하여 연결을 끊어준다 .
import org.apache.commons.httpclient.HttpClient; import org.apache.commons.httpclient.HttpStatus; import org.apache.commons.httpclient.methods.PostMethod; import java.io.BufferedReader; import java.io.InputStreamReader; public class PostMethodExample { public static void main(String args[]) { HttpClient client = new HttpClient(); client.getParams().setParameter("http.useragent", "Test Client"); BufferedReader br = null; PostMethod method = new PostMethod("http://search.yahoo.com/search"); method.addParameter("p", "\"java2s\""); try{ int returnCode = client.executeMethod(method); if(returnCode == HttpStatus.SC_NOT_IMPLEMENTED) { System.err.println("The Post method is not implemented by this URI"); // still consume the response body method.getResponseBodyAsString(); } else { br = new BufferedReader(new InputStreamReader(method.getResponseBodyAsStream())); String readLine; while(((readLine = br.readLine()) != null)) { System.err.println(readLine); } } } catch (Exception e) { System.err.println(e); } finally { method.releaseConnection(); if(br != null) try { br.close(); } catch (Exception fe) {} } } }
(2) GET 메소드를 사용해 가장 일반적인 HTTP 데이터 전송 |
이 예제는 GET 메소드를 사용해 데이터를 보내고 요청하는 예제이다. 이것을 통해
HTTP 프로토콜에서 request 와 response 를 얼마나 쉽게 사용할수 있는지 알수있다.
HTTPClient 는 유명한 웹 단위테스트 프레임웍인 HTMLUnit 에서도 사용되고 있다.
그리고 상세한 메뉴얼은 자카르타 홈페이지에서 참고 하도록 한다.
import java.io.FileOutputStream; import java.io.IOException; import org.apache.commons.httpclient.*; import org.apache.commons.httpclient.methods.GetMethod; public class SubmitHttpForm { private static String url = "http://localhost:8080/validatorStrutsApp/userInfo.do"; public static void main(String[] args) { //Instantiate an HttpClient HttpClient client = new HttpClient(); //Instantiate a GET HTTP method HttpMethod method = new GetMethod(url); //Define name-value pairs to set into the QueryString NameValuePair nvp1= new NameValuePair("firstName","fname"); NameValuePair nvp2= new NameValuePair("lastName","lname"); NameValuePair nvp3= new NameValuePair("email","email@email.com"); method.setQueryString(new NameValuePair[]{nvp1,nvp2, nvp3}); try{ int statusCode = client.executeMethod(method); System.out.println("QueryString>>> "+method.getQueryString()); System.out.println("Status Text>>>" +HttpStatus.getStatusText(statusCode)); //Get data as a String System.out.println(method.getResponseBodyAsString()); //OR as a byte array byte [] res = method.getResponseBody(); //write to file FileOutputStream fos= new FileOutputStream("donepage.html"); fos.write(res); //release connection method.releaseConnection(); } catch(IOException e) { e.printStackTrace(); } } }
(3) 쿠키관리를 위한 HttpClient 사용 |
3HttpClient 에서는 프로그램에서 어떻게 쿠키를 효과적으로 관리할수 있을지에 대한
방법을 제공한다. 아래 예제는 쿠키정보를 requst 로 서버에 보내고 있으며 JSP
페이지에서 쿠키 세부정보에 대해 리스트를 보여준다.
import org.apache.commons.httpclient.Cookie; import org.apache.commons.httpclient.HttpClient; import org.apache.commons.httpclient.HttpState; import org.apache.commons.httpclient.cookie.CookiePolicy; import org.apache.commons.httpclient.methods.GetMethod; public class CookiesTrial { private static String url = "http://127.0.0.1:8080/HttpServerSideApp/CookieMgt.jsp"; public static void main(String[] args) throws Exception { //A new cookie for the domain 127.0.0.1 //Cookie Name= ABCD Value=00000 Path=/ MaxAge=-1 Secure=False Cookie mycookie = new Cookie("127.0.0.1", "ABCD", "00000", "/", -1, false); //Create a new HttpState container HttpState initialState = new HttpState(); initialState.addCookie(mycookie); //Set to COMPATIBILITY for it to work in as many cases as possible initialState.setCookiePolicy(CookiePolicy.COMPATIBILITY); //create new client HttpClient httpclient = new HttpClient(); //set the HttpState for the client httpclient.setState(initialState); GetMethod getMethod = new GetMethod(url); //Execute a GET method int result = httpclient.executeMethod(getMethod); System.out.println("statusLine>>>"+getMethod.getStatusLine()); //Get cookies stored in the HttpState for this instance of HttpClient Cookie[] cookies = httpclient.getState().getCookies(); for (int i = 0; i < cookies.length; i++) { System.out.println("nCookieName="+cookies[i].getName()); System.out.println("Value="+cookies[i].getValue()); System.out.println("Domain="+cookies[i].getDomain()); } getMethod.releaseConnection(); } }
JSP 페이지에서 클라이언트에서 서버로 전송된 쿠키들에 대한 세부정보를 보여주는 예제이다.
참고로 HttpClient 에서는 org.apache.commons.httpclient.Cookie 클래스를 쓰며
JSP 나 Servlet 에서는 javax.servlet.http.Cookie 클래스를 사용한다.
<% Cookie[] cookies= request.getCookies(); for (int i = 0; i < cookies.length; i++) { System.out.println(cookies[i].getName() +" = "+cookies[i].getValue()); } //Add a new cookie response.addCookie(new Cookie("XYZ","12345")); %>
(4) 파일 업로드를 위한 HttpClient 사용 |
이번에는 2가지 파일 업로드 예제이다. 첫번째는 일반적인 HTML form 에서 파일컨트롤을
이용해 업로드 하는 방법이며 HttpClient 를 사용하지 않았다. 2번쨰는 HttpClient 를 이용해
업로드하는 java application 이다. 두 방법다 ProcessFileUpload.jsp를 이용한다
(1) 일반적인 HTML 폼을 이용한 파일 업로드
UploadFiles.html
Upload Files
ProcessFileUpload.jsp
<%@ page contentType="text/html;charset=windows-1252"%> <%@ page import="org.apache.commons.fileupload.DiskFileUpload"%> <%@ page import="org.apache.commons.fileupload.FileItem"%> <%@ page import="java.util.List"%> <%@ page import="java.util.Iterator"%> <%@ page import="java.io.File"%> html> <% System.out.println("Content Type ="+request.getContentType()); DiskFileUpload fu = new DiskFileUpload(); // If file size exceeds, a FileUploadException will be thrown fu.setSizeMax(1000000); List fileItems = fu.parseRequest(request); Iterator itr = fileItems.iterator(); while(itr.hasNext()) { FileItem fi = (FileItem)itr.next(); //Check if not form field so as to only handle the file inputs //else condition handles the submit button input if(!fi.isFormField()) { System.out.println("nNAME: "+fi.getName()); System.out.println("SIZE: "+fi.getSize()); //System.out.println(fi.getOutputStream().toString()); File fNew= new File(application.getRealPath("/"), fi.getName()); System.out.println(fNew.getAbsolutePath()); fi.write(fNew); } else { System.out.println("Field ="+fi.getFieldName()); } } %> Upload Successful!!
(2) HttpClient 를 이용해 다중파일 업로드
HTML 이 아닌 java application 에서 파일을 다중으로 업로드 할 때 사용되는 방식이다.
파일을 다중으로 올릴수 있도록 제공해주는 클래스는
org.apache.commons.httpclient.methods.MultipartPostMethod 이다. 그리고
HttpClient 를 이용해 멀티폼 전송을 할 때 주로 참조하는 클래스들은
org.apache.commons.httpclient.methods.multipart 패키지에 존재한다.
import java.io.File; import java.io.IOException; import org.apache.commons.httpclient.HttpClient; import org.apache.commons.httpclient.methods.MultipartPostMethod; public class HttpMultiPartFileUpload { private static String url = "http://localhost:8080/HttpServerSideApp/ProcessFileUpload.jsp"; public static void main(String[] args) throws IOException { HttpClient client = new HttpClient(); MultipartPostMethod mPost = new MultipartPostMethod(url); client.setConnectionTimeout(8000); // Send any XML file as the body of the POST request File f1 = new File("students.xml"); File f2 = new File("academy.xml"); File f3 = new File("academyRules.xml"); System.out.println("File1 Length = " + f1.length()); System.out.println("File2 Length = " + f2.length()); System.out.println("File3 Length = " + f3.length()); mPost.addParameter(f1.getName(), f1); mPost.addParameter(f2.getName(), f2); mPost.addParameter(f3.getName(), f3); int statusCode1 = client.executeMethod(mPost); System.out.println("statusLine>>>" + mPost.getStatusLine()); mPost.releaseConnection(); } }
위의 예제를 통해 HttpClient 와 FileUpload 컴퍼넌트를 어떻게 사용하는지
알았을 것이다. HttpClient 는 HTTP 프로토콜을 사용해 커뮤니케이션을 하고자
하는 어떤 프로그램에서도 손쉽게 사용할수 있다는 걸 알수 있다.
좀더 세밀한 제어는 자카르타 홈페이지에 들어 매뉴얼을 참고하고 앞으로
진행할 프로젝트등에 유용하게 사용하기 바란다'자바(JAVA)' 카테고리의 다른 글
SQL Statement Log 를 보기위한 log4jdbc 사용법 (1) | 2010.08.02 |
---|---|
Controller 영역인 브라우저에서의 단위테스트를 위한 HtmlUnit 사용하기 (0) | 2010.08.02 |
Ajax 을 사용하여 Form 데이터를 POST 전송하고자 할 때 (4) | 2010.08.02 |
swing 으로 제작되었으며 아파치의 HttpClient 를 이용한 웹서비스에 파일 업로드하기 (7) | 2010.07.30 |
JAVA 에서 데이터 교환을 위해 JSON 사용하기 (0) | 2010.07.20 |
google SMTP 를 이용해서 java 에서 Email 보내기 테스트 (1) | 2010.07.19 |
Spring 에서 트랜잭션 설정시 NoClassDefFoundError TransactionManager 에러 (0) | 2010.07.18 |
PreparedStatement 사용한 like % 쿼리 문자열 합치기 (0) | 2010.07.06 |