카테고리 없음

HttpClient - Backside Submit Form

znoflo 2008. 7. 21. 12:00
 
HttpClient - Backside Submit Form

 

 
 

SCENARIO

위 그림과 같이, 새로 개발한 사이트에 있는 자료를 클릭 한번으로 기존 사이트에 자료를 등록하려고 한다. 기존 사이트에 등록할 데이터를 가져와 화면에 보이지 않는 Form을 두고 클릭한번으로 데이터를 전송한다면 간단하게 해결 할 수 있겠다. 하지만 등록할 자료에 파일이 포함되어 있다면 얘기가 달라진다.

파일은 특성상 Hidden from으로 전송할 수 없다. 사용자 몰래 파일을 전송한다는 것은 불가능한 것이다. 이때부터 생각이 복잡해진다. 파일을 제외한 데이터는 폼으로 전송하고 파일은 ftp로 전송하는 방법? 좀 복잡하긴 하겠지만 가능한 방법이다. 하지만 데이터나 ftp파일전송중 둘중 하나에서 예외상황이 발생한다면 그때부터 데이터는 꼬이기 시작한다. 암튼 이리저리 머리를 굴려도 쉬운방법은 잘 보이지 않는다.

바로 이때 유용한 도구가 JAVA 프로그램 안에서 폼을 전송 할 수 있게 도와주는 도구인 HttpClient다. 물론 파일전송도 지원한다. 먼저 다음 소스를 보자.

  1. String strProtocol   = "http";        // 전송할 시스템의 프로토콜
    String strUrl        = "192.168.0.2"  // 전송할 시스템의 URL
    int intPortNo        = 80;            // 전송할 시스템의 포트번호
    String strPage       = "Get/sp1.jsp"  // 전송할 시스템의 페이지
  2. HttpClient client    = new HttpClient();
    client.getParams().setParameter("http.protocol.version", HttpVersion.HTTP_1_1);
    client.getParams().setParameter("http.socket.timeout", new Integer(5000));
  3. // 전송하는 페이지의 캐릭터셋을 설정한다
    client.getParams().setParameter("http.protocol.content-charset", "utf-8");
  4. client.getHostConfiguration().setHost(strUrl, intPortNo, strProtocol);
    client.getParams().setCookiePolicy(CookiePolicy.BROWSER_COMPATIBILITY);
    PostMethod filePost = new PostMethod(strPage + "?CAT=" + strCategory);
  5. // 전송할 파일의 파일 객체를 생성합니다.
    File sendFile = new File("C:\\SAMPLE.DAT");
  6. // 전송할 파라미터를 세팅합니다.    
    Part[] parts = {
  7.   // 세번째 인자인 인코딩은 전송할 시스템의 인코딩을 넣어준다
      new StringPart("PARAM1", "PARAMETER1", "euc-kr"),
      new StringPart("PARAM2", "PARAMETER2", "euc-kr"),
      new FilePart("FILENAME", sendFile, "text/html; charset=UTF-8", "euc-kr")
    }; 
  8. filePost.setRequestEntity(new MultipartRequestEntity(parts, filePost.getParams()));
  9. // 전송하는동안 기다리는 시간
  10. client.getHttpConnectionManager().getParams().setConnectionTimeout(10000);
  11. int status = client.executeMethod(filePost);
  12. if (status == HttpStatus.SC_OK) {
  13.   // 등록결과페이지의 Text전체를 받아온다.
      String strReturnValue = StrUtil.nvl(filePost.getResponseBodyAsString()); 
      if((strReturnValue).equals("SUCCESS")) isDoneTinfo = true;
      System.out.print("Upload complete, response=" + strReturnValue);
    } else {
      System.out.print("Upload failed, response=" + HttpStatus.getStatusText(status));
  14. }

위와같은 방법으로 비교적 간단히 파일을 포함한 데이터를 전송시킬 수 있다. 전송결과까지 가져오므로 이에대한 처리도 가능하다. 빨간색으로 강조한 부분은 전송하는 곳의 인코딩과 전송받는곳의 인코딩을 설정하는 부분으로 한글이 깨지는 문제 발생시 체크해 보아야 할 부분이다.

 

INSTALLATION

HttpClient이외에도 추가적으로 라이브러리를 다운로드 받아야한다.

commons-httpclient-3.1.jar : http://hc.apache.org/downloads.cgi

commons-codec.jar : http://commons.apache.org/codec
commons-logging.jar : http://commons.apache.org/logging
junit.jar : http://www.junit.org


REFERENCE