|
|
@@ -1,33 +1,41 @@
|
|
|
package com.zhongzheng.common.utils.http;
|
|
|
|
|
|
-import java.io.BufferedReader;
|
|
|
-import java.io.IOException;
|
|
|
-import java.io.InputStream;
|
|
|
-import java.io.InputStreamReader;
|
|
|
-import java.io.PrintWriter;
|
|
|
-import java.net.ConnectException;
|
|
|
-import java.net.SocketTimeoutException;
|
|
|
-import java.net.URL;
|
|
|
-import java.net.URLConnection;
|
|
|
+import java.io.*;
|
|
|
+import java.net.*;
|
|
|
import java.security.cert.X509Certificate;
|
|
|
+import java.util.*;
|
|
|
import javax.net.ssl.HostnameVerifier;
|
|
|
import javax.net.ssl.HttpsURLConnection;
|
|
|
import javax.net.ssl.SSLContext;
|
|
|
import javax.net.ssl.SSLSession;
|
|
|
import javax.net.ssl.TrustManager;
|
|
|
import javax.net.ssl.X509TrustManager;
|
|
|
+
|
|
|
+
|
|
|
+import org.apache.http.NameValuePair;
|
|
|
+import org.apache.http.client.entity.UrlEncodedFormEntity;
|
|
|
+import org.apache.http.client.methods.CloseableHttpResponse;
|
|
|
+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.message.BasicNameValuePair;
|
|
|
+import org.apache.http.util.EntityUtils;
|
|
|
import org.slf4j.Logger;
|
|
|
import org.slf4j.LoggerFactory;
|
|
|
-import com.zhongzheng.common.constant.Constants;
|
|
|
+import org.apache.http.HttpEntity;
|
|
|
+
|
|
|
|
|
|
/**
|
|
|
* 通用http发送方法
|
|
|
- *
|
|
|
+ *
|
|
|
* @author zhongzheng
|
|
|
*/
|
|
|
public class HttpUtils
|
|
|
{
|
|
|
private static final Logger log = LoggerFactory.getLogger(HttpUtils.class);
|
|
|
+ private static final String UTF8 = "UTF-8";
|
|
|
+ private static final String APPLICATION_FORM_URLENCODED = "application/x-www-form-urlencoded; charset=UTF-8";
|
|
|
|
|
|
/**
|
|
|
* 向指定 URL 发送GET方法的请求
|
|
|
@@ -38,7 +46,7 @@ public class HttpUtils
|
|
|
*/
|
|
|
public static String sendGet(String url, String param)
|
|
|
{
|
|
|
- return sendGet(url, param, Constants.UTF8);
|
|
|
+ return sendGet(url, param, UTF8);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
@@ -103,6 +111,12 @@ public class HttpUtils
|
|
|
}
|
|
|
return result.toString();
|
|
|
}
|
|
|
+ public static String postFormBody(String url, Map<String, String> paramMap) throws IOException{
|
|
|
+ return post(url, paramMap, null);
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
|
|
|
/**
|
|
|
* 向指定 URL 发送POST方法的请求
|
|
|
@@ -259,4 +273,148 @@ public class HttpUtils
|
|
|
return true;
|
|
|
}
|
|
|
}
|
|
|
-}
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 公共数据解析接口
|
|
|
+ * @param <T>
|
|
|
+ */
|
|
|
+ private interface DataParse<T> {
|
|
|
+ /**
|
|
|
+ * 解析返回数据
|
|
|
+ * @param httpEntity 返回实体
|
|
|
+ * @param encoding 编码
|
|
|
+ * @return 实际解析返回内容
|
|
|
+ * @throws IOException io异常
|
|
|
+ */
|
|
|
+ T parseData(HttpEntity httpEntity, String encoding) throws IOException;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 将url与map拼接成HTTP查询字符串
|
|
|
+ * @param url 请求url
|
|
|
+ * @param paramMap 需要拼装的map
|
|
|
+ * @return 拼装好的url
|
|
|
+ */
|
|
|
+ public static String appendUrl(String url, Map<String, String> paramMap) throws UnsupportedEncodingException {
|
|
|
+ if (paramMap == null) {
|
|
|
+ return url;
|
|
|
+ }
|
|
|
+ StringBuffer paramStringBuffer = new StringBuffer();
|
|
|
+ Iterator<Map.Entry<String, String>> mapIterator = paramMap.entrySet().iterator();
|
|
|
+ while (mapIterator.hasNext()) {
|
|
|
+ Map.Entry<String, String> next = mapIterator.next();
|
|
|
+ paramStringBuffer.append(next.getKey()).append("=").append(URLEncoder.encode(next.getValue(), UTF8)).append("&");
|
|
|
+ }
|
|
|
+ String paramStr = paramStringBuffer.toString();
|
|
|
+// String paramStr = mapJoinNotEncode(paramMap);
|
|
|
+ if (paramStr != null && !"".equals(paramStr)) {
|
|
|
+ if (url.indexOf("?") > 0) {
|
|
|
+ if (url.endsWith("&")) {
|
|
|
+ url += paramStr.substring(0, paramStr.length() - 1);
|
|
|
+ } else {
|
|
|
+ url += "&" + paramStr.substring(0, paramStr.length() - 1);
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ url += "?" + paramStr.substring(0, paramStr.length() - 1);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return url;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 向url发送post请求表单提交数据
|
|
|
+ * @param url 请求url
|
|
|
+ * @param paramMap 表单数据
|
|
|
+ * @param encoding 编码
|
|
|
+ * @return 请求返回的数据
|
|
|
+ * @throws IOException 读写异常
|
|
|
+ */
|
|
|
+ private static String post(String url, Map<String, String> paramMap, String encoding) throws IOException {
|
|
|
+ log.debug("http 请求 url: {} , 请求参数: {}", url, appendUrl("", paramMap).replace("?", ""));
|
|
|
+ encoding = encoding == null ? UTF8 : encoding;
|
|
|
+ // 创建post方式请求对象
|
|
|
+ HttpPost httpPost = new HttpPost(url);
|
|
|
+ // 装填参数
|
|
|
+ List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
|
|
|
+ if (paramMap != null) {
|
|
|
+ for (Map.Entry<String, String> entry : paramMap.entrySet()) {
|
|
|
+ String value = entry.getValue();
|
|
|
+ //去掉如下判断会造成String类型的value为null时
|
|
|
+ if (value != null) {
|
|
|
+ nameValuePairs.add(new BasicNameValuePair(entry.getKey(), value));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // 设置参数到请求对象中
|
|
|
+ httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs, encoding));
|
|
|
+ // 设置header信息
|
|
|
+ // 指定报文头【Content-type】、【User-Agent】
|
|
|
+ httpPost.setHeader("Content-type", APPLICATION_FORM_URLENCODED);
|
|
|
+ return post(url, httpPost, encoding, new DataParse<String>() {
|
|
|
+ @Override
|
|
|
+ public String parseData(HttpEntity httpEntity, String encoding) throws IOException {
|
|
|
+ return EntityUtils.toString(httpEntity, encoding);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 向url发送post请求
|
|
|
+ * @param url 请求url
|
|
|
+ * @param httpPost httpClient
|
|
|
+ * @return 请求返回的数据
|
|
|
+ * @throws IOException 读写异常
|
|
|
+ */
|
|
|
+ private static <T> T post(String url, HttpPost httpPost, String encoding, DataParse<T> dataParse)
|
|
|
+ throws IOException {
|
|
|
+ T result = null;
|
|
|
+ CloseableHttpResponse response = null;
|
|
|
+ // 创建httpclient对象
|
|
|
+ CloseableHttpClient httpClient = HttpClientBuilder.create().build();
|
|
|
+
|
|
|
+ // 执行请求操作,并拿到结果(同步阻塞)
|
|
|
+ response = sendRequestAndGetResult(url, httpClient, httpPost);
|
|
|
+ // 获取结果实体
|
|
|
+ // 判断网络连接状态码是否正常(0--200都数正常)
|
|
|
+ if (null != response) {
|
|
|
+ result = dataParse.parseData(response.getEntity(), encoding);
|
|
|
+ log.debug("http 请求结果: {}", result);
|
|
|
+ }
|
|
|
+ try {
|
|
|
+ if (null != response) {
|
|
|
+ response.close();
|
|
|
+ }
|
|
|
+ } catch (IOException ex) {
|
|
|
+ log.error(ex.getMessage(), ex);
|
|
|
+ }
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 设置http头,发送http请求,打印请求耗时
|
|
|
+ * @param url 请求url
|
|
|
+ * @param httpClient httpClient
|
|
|
+ * @param httpUriRequest httpUriRequest
|
|
|
+ * @return 请求返回的数据
|
|
|
+ * @throws IOException 读写异常
|
|
|
+ */
|
|
|
+ private static CloseableHttpResponse sendRequestAndGetResult(String url, CloseableHttpClient httpClient,
|
|
|
+ HttpUriRequest httpUriRequest) throws IOException {
|
|
|
+ long startTime = System.currentTimeMillis();
|
|
|
+ CloseableHttpResponse response = httpClient.execute(httpUriRequest);
|
|
|
+ long endTime = System.currentTimeMillis();
|
|
|
+ collectAPISpendTime(url, startTime, endTime);
|
|
|
+ return response;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 打印请求信息
|
|
|
+ * @param url 请求url
|
|
|
+ * @param startTime 请求开始时间
|
|
|
+ * @param endTime 请求结束时间
|
|
|
+ */
|
|
|
+ private static void collectAPISpendTime(String url, long startTime, long endTime) {
|
|
|
+ log.debug("HTTP请求耗时分析,请求URL: {} , 耗时: {} ms", url, endTime - startTime);
|
|
|
+ }
|
|
|
+}
|