2016년 11월 29일

Apache HttpComponents 기반의 서버 사이트 HTTP 통신

과거 널리 자바에서 널리사용되었던 오픈소스 HttpClient 프로젝트가 종료되고 HttpClient와 HttpCore로 분리되어 더 나은 성능과 유연성을 제공하는 Apache HttpComponents 프로젝트로 대체되었으며 교체를 강력하게 권고 하고 있다.

문제는 대부분의 국내 기업형 문자 서비스 및 결제 등의 서비스 구현 예제가 과거 HttpClient 기반으로 되어 있어 실 개발에 적용하는 것에 있어 여러가지 불편함이 있다는 것이다.

실재로 근래 프로젝트 진행에 있어 서비스 업체에서 제공하는 예제가 모두 과거 HttpClient 코드로 되어 있어 이를 다시 최신 버전으로 개발하여 적용하고 있다. (코딩이 어려운 것이 아니기 때문에 업체에서 최신 코드를 적용하여 예제를 만들어 주었으면 하는 바램이 있다.)

1. Maven 에서 Apache HttpComponents 사용하기  

pom.xml 파일의 dependencies 항목에 아래와 같이 추가한다.


  org.apache.httpcomponents
  httpclient
  4.5.2



2. 자바에서 HTTP POST 통신하기

간단하게 서버 사이드에서 특정 URL 로 POST방식으로 통신하는 것을 구현하여 보자. 사실 과거 버전과 비교하면 엄청 간단해졌다. 또한 내부적으로 HTTP 통신에 있어 성능 개선을 위하여 POOL 기술을 사용하고 있다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
 
import org.apache.http.HttpException;
import org.apache.http.NameValuePair;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.message.BasicNameValuePair;
 
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
 
public class HttpUtil {
 
    private static final String DEFAULT_ENCODING = "euc-kr";
    private static final Logger log = LoggerFactory.getLogger(HttpUtil.class);
 
    public HttpUtil() {
    
    }
 
    public String processHTTP(Map<StringString> params , String url ) throws Exception
    {    
        
        int statusCode = 0;
        
        CloseableHttpClient httpclient = HttpClientBuilder.create().build();
        HttpPost httpPost = new HttpPost(url);                
        List<NameValuePair> nvps = makeParams(params);
        
        try {
            httpPost.setHeader("Content-Type""application/x-www-form-urlencoded; text/html; charset=euc-kr");
            httpPost.setHeader("Cache-Control""no-cache");
            
            // 한글 인코딩을 위하여 인코딩 정보를 설정한다.
            httpPost.setEntity(new UrlEncodedFormEntity(nvps, DEFAULT_ENCODING));
            
            CloseableHttpResponse response = httpclient.execute(httpPost);
            statusCode = response.getStatusLine().getStatusCode();
            
            log.debug("\nSending 'POST' request to URL : " + httpPost.getURI());            
            log.debug("Post parameters : " + httpPost.getEntity().toString());
            log.debug("Response Code : " + statusCode );            
 
            if( statusCode == 200){        
                // 정상인 경우 메시지를 읽어 들여 그 결과를 리턴한다. 
                BufferedReader rd = new BufferedReader( new InputStreamReader(response.getEntity().getContent()));
                StringBuffer result = new StringBuffer();
                String line = "";
                while ((line = rd.readLine()) != null) {
                    result.append(line);
                }    
                return result.toString();                
            }
            
        } catch (Throwable e) {
            throw new HttpException((new StringBuilder("오류가 발생하였습니다.")).append(statusCode).toString());    
        }        
 
        if( statusCode != 200)
        {        
            throw new HttpException((new StringBuilder("오류가 발생하였습니다.")).append(statusCode).toString());                
        }
        
    }
 
    public List<NameValuePair> makeParams(Map<String String> params) throws Exception {
        int hashSize = params.size();
        Iterator keyset = params.keySet().iterator();        
        List <NameValuePair> nvps = new ArrayList <NameValuePair>();
        for (int i = 0; i < hashSize; i++) {            
            String key = (String) keyset.next();
            nvps.add(new BasicNameValuePair(key, params.get(key)));
        }
        
        return nvps;
    }
 
}
 
cs

댓글 2개:

  1. import org.apache.http. 시 에러가 나는데요..
    import org.apache.http. 임포트는 어떻게 시키는지요?

    답글삭제
  2. Maven 을 사용하고 있다면 본문과 같이 라이브러리를 추가해주거나 직접 라이브러리를 다운로드하여 사용하면 됩니다.

    https://hc.apache.org/downloads.cgi

    답글삭제