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; } } }