
org.oxerr.huobi.rest.HttpClient Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of huobi-client-rest Show documentation
Show all versions of huobi-client-rest Show documentation
Client for <a href="https://www.huobi.com">Huobi</a> RESTful API.
The newest version!
package org.oxerr.huobi.rest;
import java.io.IOException;
import java.io.InputStream;
import java.net.URI;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import org.apache.http.Header;
import org.apache.http.NameValuePair;
import org.apache.http.StatusLine;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.impl.client.LaxRedirectStrategy;
import org.apache.http.message.BasicHeader;
import org.oxerr.huobi.rest.valuereader.JsonValueReader;
import org.oxerr.huobi.rest.valuereader.JsonValueTypeRefReader;
import org.oxerr.huobi.rest.valuereader.ValueReader;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.fasterxml.jackson.core.JsonParser.Feature;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
public class HttpClient implements AutoCloseable {
public static final String REFERER_HEADER_NAME = "Referer";
/**
* Status code (200) indicating the request succeeded normally.
*/
private static final int SC_OK = 200;
private final Logger log = LoggerFactory.getLogger(HttpClient.class);
private final CloseableHttpClient httpClient;
private final ObjectMapper objectMapper;
private HttpUriRequest lastRequest;
/**
* Interval between 2 requests.
*/
private long interval = 0;
private long lastRequestTime;
public HttpClient(
int socketTimeout,
int connectTimeout,
int connectionRequestTimeout,
long interval
) {
this(socketTimeout, connectTimeout, connectionRequestTimeout);
this.interval = interval;
}
public HttpClient(
int socketTimeout,
int connectTimeout,
int connectionRequestTimeout) {
HttpClientBuilder httpClientBuilder = HttpClientBuilder.create();
httpClientBuilder.setRedirectStrategy(new LaxRedirectStrategy());
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";
httpClientBuilder.setUserAgent(userAgent);
Collection defaultHeaders = new ArrayList<>();
defaultHeaders.add(new BasicHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"));
httpClientBuilder.setDefaultHeaders(defaultHeaders);
RequestConfig defaultRequestConfig = RequestConfig.custom()
.setSocketTimeout(socketTimeout)
.setConnectTimeout(connectTimeout)
.setConnectionRequestTimeout(connectionRequestTimeout)
.setStaleConnectionCheckEnabled(true)
.build();
httpClientBuilder.setDefaultRequestConfig(defaultRequestConfig);
httpClient = httpClientBuilder.build();
objectMapper = new ObjectMapper();
objectMapper.configure(Feature.ALLOW_UNQUOTED_FIELD_NAMES, true);
}
public T get(URI uri, Class valueType) throws IOException {
return get(uri, new JsonValueReader(objectMapper, valueType));
}
public T get(URI uri, TypeReference valueTypeRef) throws IOException {
return get(uri, new JsonValueTypeRefReader(objectMapper, valueTypeRef));
}
public T get(URI uri, ValueReader valueReader) throws IOException {
return execute(valueReader, new HttpGet(uri));
}
public T post(URI uri, ValueReader valueReader,
NameValuePair... params) throws IOException {
return post(uri, valueReader, Arrays.asList(params));
}
public T post(URI uri, ValueReader valueReader,
List params) throws IOException {
HttpPost post = new HttpPost(uri);
post.setEntity(new UrlEncodedFormEntity(params));
return execute(valueReader, post);
}
public T execute(
final ValueReader valueReader,
final HttpUriRequest request) throws IOException {
log.trace("Executing: {}", request);
sleep();
if (!request.containsHeader(REFERER_HEADER_NAME) && lastRequest != null) {
final String referer = lastRequest.getURI().toString();
log.debug("Setting header Referer: {}", referer);
request.setHeader(REFERER_HEADER_NAME, referer);
}
try (CloseableHttpResponse response = httpClient.execute(request)) {
final StatusLine statusLine = response.getStatusLine();
if (statusLine.getStatusCode() == SC_OK) {
this.lastRequest = request;
try (InputStream content = response.getEntity().getContent()) {
return valueReader.read(content);
}
} else {
throw new IOException(statusLine.getReasonPhrase());
}
} finally {
lastRequestTime = System.currentTimeMillis();
}
}
/**
* {@inheritDoc}
*/
@Override
public void close() throws IOException {
httpClient.close();
}
private void sleep() {
long millis = lastRequestTime + interval - System.currentTimeMillis();
if (millis > 0) {
log.debug("Sleeping {} millis.", millis);
try {
Thread.sleep(millis);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy