관리 메뉴

IT.FARMER

Apache HttpClient - Rest call Client 본문

JAVA

Apache HttpClient - Rest call Client

아이티.파머 2013. 5. 3. 12:13
반응형

다른 시스템에 접근하거나 결과값을 받아와 후처리를 해야 할경우, java.io.net 페키지에있는 URL 을 사용해도 좋으나,

오픈소스인 Apache HttpClient를 사용하여 구현해 보았다.

(Spring Framework 을사용중이라면 RestTemplate(http://blog.springsource.org/2009/03/27/rest-in-spring-3-resttemplate/) 을 사용할수도 있다.)




Method Type
HttpGet    : 데이터 조회
HttpHead   : 조회하고자 하는 데이터의 메타데이터나 인증정보, 혹은 세션값 확인
HttpPost   : 새로운 메타데이 수정 및 등록
HttpPut    : 새로운 데이터 생성시
HttpDelete : 데이터 삭제시


사용방법
pom.xml library 등록

  <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpcore</artifactId>
            <version>4.1</version>
        </dependency>
    
        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpclient</artifactId>
            <version>4.0.3</version>
        </dependency>


JavaCode

1. PostCall Sample
public boolean externalPostURLCall(String url , Map<Object,Object> parameters) throws Exception {
            HttpClient client = new DefaultHttpClient();
             try {
                  
                   if (parameters == null ) {
                        parameters = parameterMap ;    
                  }
                  
                  HttpPost httpPost = new HttpPost(url);
                  List<NameValuePair> paramList = super .parameterGenerator(parameters);
                  
                   //케릭터셋 인코딩 처리
                  httpPost.setEntity( new UrlEncodedFormEntity(paramList, charset ));
                  httpPost.addHeader( "Connection" "close" );

                   try {
                        
                         //ResponseHandler<String> responseHandler = new BasicResponseHandler();
                         //String responseBodyStr = client.execute(httpPost ,responseHandler);
                         //System.out.println(responseBodyStr);
                        
                        HttpContext localContext = new BasicHttpContext();
                         super .response   = client.execute(httpPost);
                        
                  } catch (HttpHostConnectException e) {
                         super .urlCall false;
                        System. out .println( super. response);
                         //서버가 동장되지 않는경우에도 재호출??
                         //throw new HttpClientError("");
                  }
                  
                  System. out .println("getStatusCode :: " super .response .getStatusLine().getStatusCode());
                  
                   if (super .response .getStatusLine().getStatusCode() != 200) {
                         super .urlCall false;
                         //실패시 3초간격으로 3번간 재호출 한다.
                         while (DEFAULT_CONNECTION_COUNT RECONNECT_COUNT ) {
                               RECONNECT_COUNT ++;
                               try {
                                    Thread. sleep(3000);
                                    System. out .println("========================method call is externalPostURLCall======================== \n\n\n");
                                    System. out .println("ExternalURLCallUtils.java  parameters : " + parameters.toString());
                                    System. out .println("ExternalURLCallUtils.java  setCharset : " charset );
                                    
                                    System. out .println("urlCall :: " super .urlCall );
                                     super .urlCall = externalPostURLCall(url, parameters);
                                    
                              } catch (InterruptedException e) {
                                    e.printStackTrace();
                              }
                              
                        }
                  } else {
                         super .urlCall true;
                  }
                  
            } catch (Exception e) {
                  e.printStackTrace();
            } finally {
                  client.getConnectionManager().closeExpiredConnections();
            }
            
             return super .urlCall ;
      }

2. parameter를 전송하기위한 NameValue List method
/**
       * 파라미터전송을 위한 NameValuePair List 제너레이터  
       * POST, PUT, DELETE method 에 사용된다.
       * @param parameters
       * @return
       */
       public List<NameValuePair> parameterGenerator(Map<Object,Object> parameters) throws Exception {

            List<org.apache.http.NameValuePair> paramList = new ArrayList<org.apache.http.NameValuePair>();
             for (@SuppressWarnings ( "unused") Entry<Object, Object> entry : parameters.entrySet()) {
                  paramList.add( new BasicNameValuePair((String)entry.getKey(), (String) entry.getValue()));
            }
            
             return paramList;
      }



3. 응답받은 response의 Entity Contents 확인하기.
     - response된 결과를 BufferReader를 이용하여, 페이지를 읽어 확인한다. 확인 전 Status 코드를 확인해도 된다.
     - org.apache.http.util.EntityUtils. toString(response.getEntity()); 와 같이 사용하여도 된다.  (BufferReader가 텍스트 읽을땐 제일 빠르다고 하니,, 여기선 BufferedReader를 구현해서 사용.)
     /**
       * 호출된 URL의 Contents 를 String 으로 Return
       * @param response
       * @return
       * @throws Exception
       */
       public String responseEntityStr(HttpResponse response) throws Exception {

            HttpEntity entity = response.getEntity();
            InputStream is = entity.getContent();
            StringBuilder sb = new StringBuilder();

             try {
             /** convert response to string */
            BufferedReader reader = new BufferedReader( new InputStreamReader(is/*, " iso-8859-1"*/ ), 8);
            String line = null ;
             while ((line = reader.readLine()) != null) {
                  sb.append(line).append( "\n" );
            }
            } catch (IOException e) {
                  e.printStackTrace();
            } finally {
                  is.close();
            }

             return sb.toString();
      }




Abstract Class와 implement Class는 첨부파일을 확인하세요.

Get Method 를 만들어 호출 할경우에는 ___________.do?parameter 을 보내면된다.
생성할때는 URIBuilder를 사용하면 좀더 편하게 사용할수 있다.










반응형

'JAVA' 카테고리의 다른 글

JAVA custom listener  (0) 2015.01.15
search Engine - sphinx  (0) 2013.05.21
Resfull 종류  (0) 2013.05.03
eclipse maven war  (0) 2012.07.24
Http Session  (0) 2011.08.29