본문 바로가기

JAVA

[JAVA] 아파치에서 제공하는 HttpComponents로 Http Client 만들기

아파치에서 제공하는 HttpComponents로 Http Client 만들기

 

패드용 웹 화면을 제작하고 그 화면에 생성된 16개의 버튼을 클릭했을때 원격 서비스가 제어되는 프로젝트를 만들어야 합니다.

1. Maven

첫번째로 Maven 설정이 필요합니다. HttpComponents만 필요한게 아니라 기재된 아래의 라이브러리도 필요합니다.

안그럼 보낼때 에러가 나더라구요.

ClassNotFoundException 이라고 지겨운 ㅡ,.ㅡ 가끔 왜 나는지 원인불명의 에러 특히 라이브러리를 쓰는데 이런 에러가 나면 찾기 곤란해여..

<!-- HTTP COMPONENTS -->
  <dependency>
   <groupId>org.apache.httpcomponents</groupId>
   <artifactId>httpclient</artifactId>
   <version>4.5.1</version>
  </dependency>
  <dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpmime</artifactId>
    <version>4.5.1</version>
  </dependency>
  <dependency>
   <groupId>org.apache.httpcomponents</groupId>
   <artifactId>httpcore</artifactId>
   <version>4.4.4</version>
  </dependency>

 

2. JAVA

A. postHandler Method 정의

 /**
     * POST HANDLER 포스트의 실질적인 요청
     * @author GOEDOKID
     * @category method
     * @since 2016.01.20
     * @param url       요청할 HTTP URL
     * @param params    ? 이하 A=A 형식의 파라미터
     * @param encoding  파라미터 인코딩 형식
     * @return 응답받을 문자열 (String)
     * @throws Exception
     */
    public String postHandler(String url, Map<String, String> params, String encoding) throws Exception {

     //클라이언트 생성
     CloseableHttpClient httpClient = HttpClients.createDefault();


     //설정 커스텀 빌더 생성(타입아웃 등)
     Builder builder = RequestConfig.custom();
     builder.setConnectionRequestTimeout(4000);
     builder.setSocketTimeout(4000);
     RequestConfig config = builder.build();
  
        try{

            //HttpPost 생성
            HttpPost post = new HttpPost(url);

            //Map형태의 파라미터 정보를 NameValuePair List 형태로 변환
            List<NameValuePair> paramList = convertParam(params);

            //파라미터 셋팅
            post.setEntity(new UrlEncodedFormEntity(paramList, encoding));

            //빌더 설정 SET
            post.setConfig(config);

            //Response Handler 정의
            ResponseHandler<String> rh = new HttpHandler();

            //전송 및 return
            return httpClient.execute(post, rh);
        }catch(ConnectTimeoutException CTE){
         CTE.getStackTrace();
         throw new ConnectTimeoutException("CTE");
        }catch(SocketTimeoutException STE){
         STE.getStackTrace();
         throw new SocketTimeoutException("STE");
        }catch(IOException IOE) {
         IOE.getStackTrace();
         throw new IOException("IOE");
        }finally{
         try {
    httpClient.close();
   } catch (IOException IOE) {
    IOE.getStackTrace();
    throw new IOException("IOE");
   }
        }
    }

B. convertParam Method 정의

Map형태의 파라미터 Map을 List<NameValuePair>형태로 변환

 /**
  * 파라미터 NameValuePair로 변환
  * @author GOEDOKID
  * @category method
  * @since 2016.01.20
  * @param params
  * @return List<NameValuePair>
  */
 private List<NameValuePair> convertParam(Map<String, String> params){
        List<NameValuePair> paramList = new ArrayList<NameValuePair>();
        for(Map.Entry<String, String> entry : params.entrySet()) {
         paramList.add(new BasicNameValuePair(entry.getKey(), entry.getValue()));
  }
        return paramList;
    }

 

B. HttpHandler Class 정의

AbstractResponseHandler를 상속하여 ResponseHandler 클래스 생성

일케 생성하지 않고 제공되는 기본 Handler를 사용하니 response로 아무것도 안받았을때 NullException 에러가 발생하여 정의해서 사용함.

import java.io.IOException;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpResponseException;
import org.apache.http.impl.client.AbstractResponseHandler;
import org.apache.http.util.EntityUtils;

/**
 * HttpResponse Handler Class
 * @category Class
 * @author GOEDOKID
 * @since 2016.01.20
 */
public class HttpHandler extends AbstractResponseHandler<String> {
 
 /**
 * HandlerEntity
 * @author GOEDOKID
 * @category Method
 * @since 2016.01.20
 */
 @Override
 public String handleEntity(final HttpEntity entity) throws IOException {
     return EntityUtils.toString(entity);
 }

 /**
 * handleResponse
 * @author GOEDOKID
 * @category Method
 * @since 2016.01.20
 */
 @Override
 public String handleResponse(
         final HttpResponse response) throws HttpResponseException, IOException {
     return super.handleResponse(response);
 }
}