View Javadoc
1   package org.oxerr.chbtc;
2   
3   import java.io.IOException;
4   import java.io.InputStream;
5   import java.net.URI;
6   import java.util.ArrayList;
7   import java.util.Arrays;
8   import java.util.Collection;
9   import java.util.List;
10  
11  import org.apache.http.Header;
12  import org.apache.http.NameValuePair;
13  import org.apache.http.StatusLine;
14  import org.apache.http.client.config.RequestConfig;
15  import org.apache.http.client.entity.UrlEncodedFormEntity;
16  import org.apache.http.client.methods.CloseableHttpResponse;
17  import org.apache.http.client.methods.HttpGet;
18  import org.apache.http.client.methods.HttpPost;
19  import org.apache.http.client.methods.HttpUriRequest;
20  import org.apache.http.impl.client.CloseableHttpClient;
21  import org.apache.http.impl.client.HttpClientBuilder;
22  import org.apache.http.impl.client.LaxRedirectStrategy;
23  import org.apache.http.message.BasicHeader;
24  import org.oxerr.chbtc.dto.valuereader.JsonValueReader;
25  import org.oxerr.chbtc.dto.valuereader.JsonValueTypeRefReader;
26  import org.oxerr.chbtc.dto.valuereader.ValueReader;
27  import org.slf4j.Logger;
28  import org.slf4j.LoggerFactory;
29  
30  import com.fasterxml.jackson.core.JsonParser.Feature;
31  import com.fasterxml.jackson.core.type.TypeReference;
32  import com.fasterxml.jackson.databind.ObjectMapper;
33  
34  public class HttpClient implements AutoCloseable {
35  
36  	/**
37  	 * Status code (200) indicating the request succeeded normally.
38  	 */
39  	private static final int SC_OK = 200;
40  
41  	private final Logger log = LoggerFactory.getLogger(HttpClient.class);
42  
43  	private final CloseableHttpClient httpClient;
44  
45  	private final ObjectMapper objectMapper;
46  
47  	public HttpClient(
48  			int socketTimeout,
49  			int connectTimeout,
50  			int connectionRequestTimeout) {
51  		HttpClientBuilder httpClientBuilder = HttpClientBuilder.create();
52  		httpClientBuilder.setRedirectStrategy(new LaxRedirectStrategy());
53  
54  		String userAgent = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_5) AppleWebKit/537.71 (KHTML, like Gecko) Version/6.1 Safari/537.71";
55  		httpClientBuilder.setUserAgent(userAgent);
56  
57  		Collection<Header> defaultHeaders = new ArrayList<>();
58  		defaultHeaders.add(new BasicHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"));
59  		httpClientBuilder.setDefaultHeaders(defaultHeaders);
60  
61  		RequestConfig defaultRequestConfig = RequestConfig.custom()
62  				.setSocketTimeout(socketTimeout)
63  				.setConnectTimeout(connectTimeout)
64  				.setConnectionRequestTimeout(connectionRequestTimeout)
65  				.build();
66  		httpClientBuilder.setDefaultRequestConfig(defaultRequestConfig);
67  
68  		httpClient = httpClientBuilder.build();
69  
70  		objectMapper = new ObjectMapper();
71  		objectMapper.configure(Feature.ALLOW_UNQUOTED_FIELD_NAMES, true);
72  	}
73  
74  	public <T> T get(URI uri, Class<T> valueType) throws IOException {
75  		return get(uri, new JsonValueReader<T>(objectMapper, valueType));
76  	}
77  
78  	public <T> T get(URI uri, TypeReference<T> valueTypeRef) throws IOException {
79  		return get(uri, new JsonValueTypeRefReader<T>(objectMapper, valueTypeRef));
80  	}
81  
82  	public <T> T get(URI uri, ValueReader<T> valueReader) throws IOException {
83  		return execute(valueReader, new HttpGet(uri));
84  	}
85  
86  	public <T> T post(URI uri, ValueReader<T> valueReader,
87  			NameValuePair... params) throws IOException {
88  		return post(uri, valueReader, Arrays.asList(params));
89  	}
90  
91  	public <T> T post(URI uri, ValueReader<T> valueReader,
92  			List<NameValuePair> params) throws IOException {
93  		HttpPost post = new HttpPost(uri);
94  		post.setEntity(new UrlEncodedFormEntity(params));
95  		return execute(valueReader, post);
96  	}
97  
98  	private <T> T execute(
99  			final ValueReader<T> valueReader,
100 			final HttpUriRequest request) throws IOException {
101 		log.debug("Executing: {}", request.getURI());
102 		try (CloseableHttpResponse response = httpClient.execute(request)) {
103 			final StatusLine statusLine = response.getStatusLine();
104 			if (statusLine.getStatusCode() == SC_OK) {
105 				try (InputStream content = response.getEntity().getContent()) {
106 					return valueReader.read(content);
107 				}
108 			} else {
109 				throw new IOException(statusLine.getReasonPhrase());
110 			}
111 		}
112 	}
113 
114 	/**
115 	 * {@inheritDoc}
116 	 */
117 	@Override
118 	public void close() throws IOException {
119 		httpClient.close();
120 	}
121 
122 }