package com.github.ouyangbob.http;
import java.io.IOException;
import java.net.URI;
import java.util.List;
import java.util.Map;
import org.apache.commons.lang3.StringUtils;
import org.apache.http.Consts;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.StatusLine;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpResponseException;
import org.apache.http.client.ResponseHandler;
import org.apache.http.client.fluent.Request;
import org.apache.http.client.utils.URIBuilder;
import org.apache.http.entity.ContentType;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.common.base.Function;
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
/**
* http 工具类
* @author ouyangbob
*
*/
public class HttpUtil {
private static final Logger logger = LoggerFactory.getLogger(HttpUtil.class);
private static final Function<Map.Entry<String, String>, NameValuePair> nameValueTransformFunction = new Function<Map.Entry<String, String>, NameValuePair>() {
public NameValuePair apply(final Map.Entry<String, String> input) {
return new BasicNameValuePair(input.getKey(), input.getValue());
}
};
public static final int CONNECT_TIMEOUT = 2000;
public static final int SOCKET_TIMEOUT = 2000;
/**
* handle response's entity to utf8 text
*/
public static final ResponseHandler<String> UTF8_CONTENT_HANDLER = new ResponseHandler<String>() {
public String handleResponse(HttpResponse response) throws ClientProtocolException, IOException {
final StatusLine statusLine = response.getStatusLine();
if (statusLine.getStatusCode() >= 300) {
throw new HttpResponseException(statusLine.getStatusCode(), statusLine.getReasonPhrase());
}
final HttpEntity entity = response.getEntity();
if (entity != null) {
return EntityUtils.toString(entity, "UTF-8");
}
return StringUtils.EMPTY;
}
};
public static URI buildURI(String url, Map<String, String> paramMap) {
List<NameValuePair> nameValuePairs = Lists.newArrayList();
if (paramMap != null) {
Iterables.addAll(nameValuePairs, Iterables.transform(paramMap.entrySet(), nameValueTransformFunction));
}
try {
return new URIBuilder(url).setParameters(nameValuePairs).build();
} catch (Exception e) {
logger.error("build URI ERROR: url:{},params:{}",url,nameValuePairs,e);
return null;
}
}
public static String getRequest(String url, Map<String, String> paramMap) {
URI uri = buildURI(url, paramMap);
try {
String content = Request.Get(uri)
.connectTimeout(CONNECT_TIMEOUT)
.socketTimeout(SOCKET_TIMEOUT)
.execute().handleResponse(HttpUtil.UTF8_CONTENT_HANDLER);
logger.debug("{},result:{}",uri,content);
return content;
} catch (Exception e) {
logger.error("getRequest:{},error:{}",uri,e);
return null;
}
}
public static String postRequest(String url, Map<String, String> paramMap) {
URI uri = buildURI(url, paramMap);
try {
String content = Request.Post(uri)
.connectTimeout(CONNECT_TIMEOUT)
.socketTimeout(SOCKET_TIMEOUT)
.execute().handleResponse(HttpUtil.UTF8_CONTENT_HANDLER);
logger.debug("{},result:{}",uri,content);
return content;
} catch (Exception e) {
logger.error("postRequest:{},error:{}",uri,e);
return null;
}
}
public static String postBodyRequest(String url, Map<String, String> paramMap,String body) {
URI uri = buildURI(url, paramMap);
try {
String content = Request.Post(uri)
.connectTimeout(CONNECT_TIMEOUT)
.socketTimeout(SOCKET_TIMEOUT)
.bodyString(body, ContentType.create("text/html", Consts.UTF_8))
.execute().handleResponse(HttpUtil.UTF8_CONTENT_HANDLER);
logger.debug("{},result:{}",uri,content);
return content;
} catch (Exception e) {
logger.error("postBodyRequest:{},error:{}",uri,e);
return null;
}
}
}