import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.HashMap;
import java.util.Map;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpMethod;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.httpclient.NameValuePair;
import org.apache.commons.httpclient.URIException;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.methods.RequestEntity;
import org.apache.commons.httpclient.methods.StringRequestEntity;
import org.apache.commons.httpclient.params.HttpMethodParams;
import org.apache.commons.httpclient.util.URIUtil;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.exception.ExceptionUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.http.HttpEntity;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.utils.URIBuilder;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
/**
* http请求工具
*
*/
public class HttpTookit {
private static Log log = LogFactory.getLog(HttpTookit.class);
/**
* 执行一个HTTP GET请求,返回请求响应的HTML
*
* @param url
* 请求的URL地址
* @param queryString
* 请求的查询参数,可以为null
* @param charset
* 字符集
* @param pretty
* 是否美化
* @return 返回请求响应的HTML
*/
public static String doGet(String url, String queryString, String charset, boolean pretty) {
StringBuffer response = new StringBuffer();
HttpClient client = new HttpClient();
HttpMethod method = new GetMethod(url);
try {
if (StringUtils.isNotBlank(queryString)) {
// 对get请求参数做了http请求默认编码,好像没有任何问题,汉字编码后,就成为%式样的字符串
method.setQueryString(URIUtil.encodeQuery(queryString));
}
client.executeMethod(method);
if (method.getStatusCode() == HttpStatus.SC_OK) {
BufferedReader reader = new BufferedReader(new InputStreamReader(method.getResponseBodyAsStream(), charset));
String line;
while ((line = reader.readLine()) != null) {
if (pretty) {
response.append(line).append(System.getProperty("line.separator"));
} else {
response.append(line);
}
}
reader.close();
}
} catch (URIException e) {
log.error("执行HTTP Get请求时,编码查询字符串“" + queryString + "”发生异常!", e);
log.error(ExceptionUtils.getStackTrace(e));
} catch (IOException e) {
log.error("执行HTTP Get请求" + url + "时,发生异常!", e);
log.error(ExceptionUtils.getStackTrace(e));
} finally {
method.releaseConnection();
}
return response.toString();
}
/**
* 执行一个HTTP POST请求,返回请求响应的HTML
*
* @param url
* 请求的URL地址
* @param params
* 请求的查询参数,可以为null
* @param charset
* 字符集
* @param pretty
* 是否美化
* @return 返回请求响应的HTML
*/
public static String doPost(String url, Map<String, String> params, String charset, boolean pretty) {
StringBuffer response = new StringBuffer();
HttpClient client = new HttpClient();
PostMethod method = new PostMethod(url);
method.getParams().setParameter(HttpMethodParams.HTTP_CONTENT_CHARSET, "utf-8");
// 设置Http Post数据
if (params != null) {
NameValuePair[] nvp = new NameValuePair[params.size()];
int i = 0;
for (Map.Entry<String, String> entry : params.entrySet()) {
NameValuePair n = new NameValuePair();
n.setName(entry.getKey());
n.setValue(entry.getValue());
nvp[i] = n;
i++;
}
method.addParameters(nvp);
}
try {
client.executeMethod(method);
if (method.getStatusCode() == HttpStatus.SC_OK) {
BufferedReader reader = new BufferedReader(new InputStreamReader(method.getResponseBodyAsStream(), charset));
String line;
while ((line = reader.readLine()) != null) {
if (pretty) {
response.append(line).append(System.getProperty("line.separator"));
} else {
response.append(line);
}
}
reader.close();
} else {
log.info("执行HTTP Post请求" + url + "时,发生异常!");
log.info("method.getStatusCode() ==" + method.getStatusCode());
}
} catch (IOException e) {
log.error("执行HTTP Post请求" + url + "时,发生异常!", e);
log.error(ExceptionUtils.getStackTrace(e));
} finally {
method.releaseConnection();
}
return response.toString();
}
public static String doPost(String url, String xml, String charset) throws UnsupportedEncodingException {
StringBuffer response = new StringBuffer();
HttpClient client = new HttpClient();
PostMethod method = new PostMethod(url);
method.getParams().setParameter(HttpMethodParams.HTTP_CONTENT_CHARSET, "utf-8");
// 设置Http Post数据
if (xml != null) {
RequestEntity entity = new StringRequestEntity(xml, "application/json", "UTF-8");
method.setRequestEntity(entity);
}
try {
client.executeMethod(method);
if (method.getStatusCode() == HttpStatus.SC_OK) {
BufferedReader reader = new BufferedReader(new InputStreamReader(method.getResponseBodyAsStream(), charset));
String line;
while ((line = reader.readLine()) != null) {
response.append(line);
}
reader.close();
} else {
log.info("执行HTTP Post请求" + url + "时,发生异常!");
log.info("method.getStatusCode() ==" + method.getStatusCode());
}
} catch (IOException e) {
log.error("执行HTTP Post请求" + url + "时,发生异常!", e);
log.error(ExceptionUtils.getStackTrace(e));
} finally {
method.releaseConnection();
}
return response.toString();
}
public static String call(String url, String xml, String charset, String charsetReturn) throws URISyntaxException, ClientProtocolException, IOException {
String res = "";
String reqXml = xml;
CloseableHttpClient httpclient = HttpClients.createDefault();
CloseableHttpResponse response = null;
// 设置请求和传输超时时间
RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(30 * 1000).setSocketTimeout(30 * 1000).build();
// 尝试3次,最坏的情况是等待30+1+30+2+30=93秒之后还请求失败
for (int i = 0; i < 3; i++) {
try {
URI uri = new URIBuilder(url).build();
HttpPost httppost = new HttpPost(uri);
httppost.setConfig(requestConfig);
StringEntity s = new StringEntity(reqXml, charset);
s.setContentType("application/json");
httppost.setEntity(s);
// log.info("HttpPost StringEntity 中的XML:" +
// InputStreamUtils.InputStreamTOString(s.getContent(), "GBK"));
response = httpclient.execute(httppost);
HttpEntity entity = response.getEntity();
if (entity != null) {
res = EntityUtils.toString(entity, charsetReturn);
break;
}
} catch (RuntimeException e) {
if (i >= 2) {
break;
}
try {
Thread.sleep((i + 1) * 1000);
} catch (InterruptedException e1) {
log.error(ExceptionUtils.getStackTrace(e1));
}
} finally {
try {
response.close();
httpclient.close();
} catch (IOException e) {
log.error(ExceptionUtils.getStackTrace(e));
} catch (RuntimeException e) {
log.error(ExceptionUtils.getStackTrace(e));
}
}
}
return res;
}
public static String call(String url, String xml, String charset) throws URISyntaxException, ClientProtocolException, IOException {
String res = "";
String reqXml = xml;
CloseableHttpClient httpclient = HttpClients.createDefault();
CloseableHttpResponse response = null;
// 设置请求和传输超时时间
RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(30 * 1000).setSocketTimeout(30 * 1000).build();
// 尝试3次,最坏的情况是等待30+1+30+2+30=93秒之后还请求失败
for (int i = 0; i < 3; i++) {
try {
URI uri = new URIBuilder(url).build();
HttpPost httppost = new HttpPost(uri);
httppost.setConfig(requestConfig);
StringEntity s = new StringEntity(reqXml, charset);
s.setContentType("application/json");
httppost.setEntity(s);
// log.info("HttpPost StringEntity 中的XML:" +
// InputStreamUtils.InputStreamTOString(s.getContent(), "GBK"));
response = httpclient.execute(httppost);
HttpEntity entity = response.getEntity();
if (entity != null) {
res = EntityUtils.toString(entity, "utf-8");
break;
}
} catch (RuntimeException e) {
if (i >= 2) {
break;
}
try {
Thread.sleep((i + 1) * 1000);
} catch (InterruptedException e1) {
log.error(ExceptionUtils.getStackTrace(e1));
}
} finally {
try {
response.close();
httpclient.close();
} catch (IOException e) {
log.error(ExceptionUtils.getStackTrace(e));
} catch (RuntimeException e) {
log.error(ExceptionUtils.getStackTrace(e));
}
}
}
return res;
}
/**
* 补充空格 参数(str字符串,字段的长度)
*/
public static String formatStr(String str, int length) throws Exception {
if (str == null) {
return null;
}
// 空格的长度 = 20 - 字段的长度(GBK)。
int strLen = str.getBytes("UTF-8").length;
if (strLen == length) {
return str;
} else if (strLen < length) {
int temp = length - strLen;
String tem = "";
for (int i = 0; i < temp; i++) {
tem = tem + " ";
}
return str + tem;
} else {
return str.substring(0, length);
}
}
}