HttpClientUtils.java 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629
  1. package com.cybertogether.wx.notice.infrastructure;
  2. import com.alibaba.fastjson.JSONObject;
  3. import org.apache.commons.logging.Log;
  4. import org.apache.commons.logging.LogFactory;
  5. import org.apache.http.Consts;
  6. import org.apache.http.HttpEntity;
  7. import org.apache.http.HttpHeaders;
  8. import org.apache.http.NameValuePair;
  9. import org.apache.http.client.config.RequestConfig;
  10. import org.apache.http.client.entity.UrlEncodedFormEntity;
  11. import org.apache.http.client.methods.*;
  12. import org.apache.http.config.*;
  13. import org.apache.http.conn.socket.ConnectionSocketFactory;
  14. import org.apache.http.conn.socket.PlainConnectionSocketFactory;
  15. import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
  16. import org.apache.http.entity.ContentType;
  17. import org.apache.http.entity.StringEntity;
  18. import org.apache.http.entity.mime.HttpMultipartMode;
  19. import org.apache.http.entity.mime.MultipartEntityBuilder;
  20. import org.apache.http.impl.client.CloseableHttpClient;
  21. import org.apache.http.impl.client.HttpClients;
  22. import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
  23. import org.apache.http.message.BasicNameValuePair;
  24. import org.apache.http.ssl.SSLContexts;
  25. import org.apache.http.util.EntityUtils;
  26. import javax.net.ssl.SSLContext;
  27. import javax.net.ssl.TrustManager;
  28. import javax.net.ssl.X509TrustManager;
  29. import java.io.File;
  30. import java.io.IOException;
  31. import java.io.UnsupportedEncodingException;
  32. import java.net.URLEncoder;
  33. import java.nio.charset.CodingErrorAction;
  34. import java.security.KeyManagementException;
  35. import java.security.cert.CertificateException;
  36. import java.security.cert.X509Certificate;
  37. import java.util.*;
  38. /**
  39. * @description:
  40. * @author: TanJingyu
  41. * @create:2023-06-14 14:11:21
  42. **/
  43. public class HttpClientUtils {
  44. static Log log = LogFactory.getLog(HttpClientUtils.class);
  45. private static CloseableHttpClient client;
  46. private static RequestConfig requestConfigDefault;
  47. private static PoolingHttpClientConnectionManager connManager = null;
  48. // 默认请求获取数据的超时时间
  49. private static Integer readTimeoutDefault = 15000;
  50. // 默认连接超时时间
  51. private static Integer connectTimeoutDefault = 5000;
  52. // 默认从connectManager获取Connection超时时间
  53. private static Integer getConnectionTimeoutDefault = 1000;
  54. // 默认的字符集
  55. private static String charsetDefault = "UTF-8";
  56. public static final String contentTypeJson = "application/json";
  57. public static final String contentTypeXml = "application/xml";
  58. private enum MethodType {
  59. GET, POST
  60. }
  61. static {
  62. try {
  63. SSLContext sslContext = SSLContexts.createDefault();
  64. sslContext.init(null, new TrustManager[]{new X509TrustManager() {
  65. public void checkClientTrusted(X509Certificate[] arg0, String arg1)
  66. throws CertificateException {
  67. }
  68. public void checkServerTrusted(X509Certificate[] arg0, String arg1)
  69. throws CertificateException {
  70. }
  71. public X509Certificate[] getAcceptedIssuers() {
  72. return null;
  73. }
  74. }}, null);
  75. Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory>create()
  76. .register("http", PlainConnectionSocketFactory.INSTANCE)
  77. .register("https", new SSLConnectionSocketFactory(sslContext)).build();
  78. connManager = new PoolingHttpClientConnectionManager(socketFactoryRegistry);
  79. SocketConfig socketConfig = SocketConfig.custom().setTcpNoDelay(true).build();
  80. connManager.setDefaultSocketConfig(socketConfig);
  81. MessageConstraints messageConstraints = MessageConstraints.custom().build();
  82. ConnectionConfig connectionConfig = ConnectionConfig.custom()
  83. .setMalformedInputAction(CodingErrorAction.IGNORE)
  84. .setUnmappableInputAction(CodingErrorAction.IGNORE).setCharset(Consts.UTF_8)
  85. .setMessageConstraints(messageConstraints).build();
  86. connManager.setDefaultConnectionConfig(connectionConfig);
  87. connManager.setMaxTotal(1000);
  88. connManager.setDefaultMaxPerRoute(500);
  89. connManager.setValidateAfterInactivity(3000);
  90. } catch (KeyManagementException e) {
  91. log.error(e);
  92. }
  93. requestConfigDefault = RequestConfig.custom().setConnectionRequestTimeout(getConnectionTimeoutDefault)
  94. .setConnectTimeout(connectTimeoutDefault).setSocketTimeout(readTimeoutDefault).build();
  95. client = HttpClients.custom().useSystemProperties().setConnectionManager(connManager).setDefaultRequestConfig(requestConfigDefault)
  96. .build();
  97. }
  98. /**
  99. * get请求
  100. *
  101. * @param url 请求的url
  102. * @return HttpResponseContent对象,如果http请求出现异常,返回null
  103. */
  104. public static HttpResponseContent get(String url) {
  105. return get(url, null, connectTimeoutDefault, readTimeoutDefault, null);
  106. }
  107. /**
  108. * @param url 请求的url
  109. * @param headers 请求需要携带的header信息
  110. * @return HttpResponseContent对象,如果http请求出现异常,返回null
  111. */
  112. public static HttpResponseContent get(String url, Map<String, String> headers) {
  113. return get(url, null, connectTimeoutDefault, readTimeoutDefault, headers);
  114. }
  115. /**
  116. * get请求
  117. *
  118. * @param url 请求的url
  119. * @param contentType contentType,例如:text/plain
  120. * @return HttpResponseContent对象,如果http请求出现异常,返回null
  121. */
  122. public static HttpResponseContent get(String url, String contentType) {
  123. return get(url, contentType, connectTimeoutDefault, readTimeoutDefault, null);
  124. }
  125. /**
  126. * get请求
  127. *
  128. * @param url 请求的url
  129. * @param connectTimeout 连接超时设置,毫秒
  130. * @param readTimeout 读取超时设置,毫秒
  131. * @return HttpResponseContent对象,如果http请求出现异常,返回null
  132. */
  133. public static HttpResponseContent get(String url, int connectTimeout, int readTimeout) {
  134. return get(url, null, connectTimeout, readTimeout, null);
  135. }
  136. /**
  137. * get请求
  138. *
  139. * @param url 请求的url
  140. * @param contentType contentType,例如:text/plain
  141. * @param connectTimeout 连接超时设置,毫秒
  142. * @param readTimeout 读取超时设置,毫秒
  143. * @param headers 请求需要携带的header信息
  144. * @return HttpResponseContent对象,如果http请求出现异常,返回null
  145. */
  146. public static HttpResponseContent get(String url, String contentType, int connectTimeout, int readTimeout, Map<String, String> headers) {
  147. return getOrPostUrl(MethodType.GET, url, contentType, connectTimeout, readTimeout, headers);
  148. }
  149. /**
  150. * post请求,参数在url中
  151. *
  152. * @param url 请求的url
  153. * @return HttpResponseContent对象,如果http请求出现异常,返回null
  154. */
  155. public static HttpResponseContent postUrl(String url) {
  156. return postUrl(url, null, connectTimeoutDefault, readTimeoutDefault);
  157. }
  158. /**
  159. * post请求,参数在url中
  160. *
  161. * @param url 请求的url
  162. * @param contentType contentType,例如:text/plain
  163. * @return HttpResponseContent对象,如果http请求出现异常,返回null
  164. */
  165. public static HttpResponseContent postUrl(String url, String contentType) {
  166. return postUrl(url, contentType, connectTimeoutDefault, readTimeoutDefault);
  167. }
  168. /**
  169. * post请求,参数在url中
  170. *
  171. * @param url 请求的url
  172. * @param connectTimeout 连接超时设置,毫秒
  173. * @param readTimeout 读取超时设置,毫秒
  174. * @return HttpResponseContent对象,如果http请求出现异常,返回null
  175. */
  176. public static HttpResponseContent postUrl(String url, int connectTimeout, int readTimeout) {
  177. return postUrl(url, null, connectTimeout, readTimeout);
  178. }
  179. /**
  180. * post请求,参数在url中
  181. *
  182. * @param url 请求的url
  183. * @param contentType contentType,例如:text/plain
  184. * @param connectTimeout 连接超时设置,毫秒
  185. * @param readTimeout 读取超时设置,毫秒
  186. * @return HttpResponseContent对象,如果http请求出现异常,返回null
  187. */
  188. public static HttpResponseContent postUrl(String url, String contentType, int connectTimeout, int readTimeout) {
  189. return getOrPostUrl(MethodType.POST, url, contentType, connectTimeout, readTimeout);
  190. }
  191. /**
  192. * get或者post请求,参数在url中
  193. *
  194. * @param methodType GET/POST
  195. * @param url 请求的url
  196. * @param contentType contentType,例如:text/plain
  197. * @param connectTimeout 连接超时设置,毫秒
  198. * @param readTimeout 读取超时设置,毫秒
  199. * @return HttpResponseContent对象,如果http请求出现异常,返回null
  200. */
  201. private static HttpResponseContent getOrPostUrl(MethodType methodType, String url, String contentType,
  202. int connectTimeout, int readTimeout) {
  203. return getOrPostUrl(methodType, url, contentType, connectTimeout, readTimeout, null);
  204. }
  205. private static HttpResponseContent getOrPostUrl(MethodType methodType, String url, String contentType,
  206. int connectTimeout, int readTimeout, Map<String, String> extHeaders) {
  207. HttpRequestBase request = null;
  208. HttpResponseContent hrc = null;
  209. if (methodType == MethodType.GET) {
  210. request = new HttpGet(url);
  211. } else {
  212. request = new HttpPost(url);
  213. }
  214. // 设置contentType
  215. if (contentType != null) {
  216. request.addHeader(HttpHeaders.CONTENT_TYPE, contentType);
  217. }
  218. //add by nieqi since 2022-3-23
  219. if (Objects.nonNull(extHeaders)) {
  220. for (String s : extHeaders.keySet()) {
  221. if (Objects.nonNull(s)) {
  222. String headerValue = extHeaders.get(s);
  223. if (Objects.nonNull(headerValue)) {
  224. request.addHeader(s, headerValue);
  225. }
  226. }
  227. }
  228. }
  229. hrc = executeHttpRequest(request, connectTimeout, readTimeout);
  230. return hrc;
  231. }
  232. /**
  233. * post请求,请求数据在data中
  234. *
  235. * @param url 请求的url
  236. * @param data 请求数据
  237. * @return HttpResponseContent对象,如果http请求出现异常,返回null
  238. */
  239. public static HttpResponseContent postData(String url, String data) {
  240. return postData(url, data, null, connectTimeoutDefault, readTimeoutDefault);
  241. }
  242. /**
  243. * post请求,请求数据在data中
  244. *
  245. * @param url 请求的url
  246. * @param data 请求数据
  247. * @param contentType contentType,例如:text/plain
  248. * @return HttpResponseContent对象,如果http请求出现异常,返回null
  249. */
  250. public static HttpResponseContent postData(String url, String data, String contentType) {
  251. return postData(url, data, contentType, connectTimeoutDefault, readTimeoutDefault);
  252. }
  253. /**
  254. * post请求,请求数据在data中
  255. *
  256. * @param url 请求的url
  257. * @param data 请求数据
  258. * @param connectTimeout 连接超时设置,毫秒
  259. * @param readTimeout 读取超时设置,毫秒
  260. * @return HttpResponseContent对象,如果http请求出现异常,返回null
  261. */
  262. public static HttpResponseContent postData(String url, String data, int connectTimeout, int readTimeout) {
  263. return postData(url, data, null, connectTimeout, readTimeout);
  264. }
  265. /**
  266. * post请求,请求数据在data中
  267. *
  268. * @param url 请求的url
  269. * @param data 请求数据
  270. * @param contentType contentType,例如:text/plain
  271. * @param connectTimeout 连接超时设置,毫秒
  272. * @param readTimeout 读取超时设置,毫秒
  273. * @return HttpResponseContent对象,如果http请求出现异常,返回null
  274. */
  275. public static HttpResponseContent postData(String url, String data, String contentType, int connectTimeout,
  276. int readTimeout) {
  277. Map<String, String> headerMap = new HashMap<String, String>();
  278. headerMap.put(HttpHeaders.CONTENT_TYPE, contentType);
  279. return postDataAddHeader(url, data, headerMap, connectTimeout, readTimeout);
  280. }
  281. /**
  282. * post请求,请求数据在data中
  283. *
  284. * @param url 请求的url
  285. * @param data 请求数据
  286. * @param headerMap http请求头,key-value放在map中
  287. * @param connectTimeout 连接超时设置,毫秒
  288. * @param readTimeout 读取超时设置,毫秒
  289. * @return HttpResponseContent对象,如果http请求出现异常,返回null
  290. */
  291. public static HttpResponseContent postDataAddHeader(String url, String data, Map<String, String> headerMap,
  292. int connectTimeout, int readTimeout) {
  293. HttpRequestBase request = null;
  294. HttpResponseContent hrc = null;
  295. HttpPost httpPost = new HttpPost(url);
  296. httpPost.setEntity(new StringEntity(data, charsetDefault));
  297. request = httpPost;
  298. // 设置header
  299. if (headerMap != null) {
  300. for (Map.Entry<String, String> entry : headerMap.entrySet()) {
  301. request.addHeader(entry.getKey(), entry.getValue());
  302. }
  303. }
  304. hrc = executeHttpRequest(request, connectTimeout, readTimeout);
  305. return hrc;
  306. }
  307. /**
  308. * post请求,form表单,不能包含二进制数据
  309. *
  310. * @param url 请求的url
  311. * @param paramsMap form表单参数map
  312. * @param headerMap form表单header
  313. * @return HttpResponseContent对象,如果http请求出现异常,返回null
  314. */
  315. public static HttpResponseContent postForm(String url, Map<String, String> paramsMap, Map<String, String> headerMap) {
  316. return postForm(url, paramsMap, connectTimeoutDefault, readTimeoutDefault, headerMap);
  317. }
  318. /**
  319. * post请求,form表单,不能包含二进制数据
  320. *
  321. * @param url 请求的url
  322. * @param paramsMap form表单参数map
  323. * @param connectTimeout 连接超时设置,毫秒
  324. * @param readTimeout 读取超时设置,毫秒
  325. * @param headerMap form表单header
  326. * @return HttpResponseContent对象,如果http请求出现异常,返回null
  327. */
  328. public static HttpResponseContent postForm(String url, Map<String, String> paramsMap, int connectTimeout,
  329. int readTimeout, Map<String, String> headerMap) {
  330. HttpRequestBase request = null;
  331. HttpResponseContent hrc = null;
  332. HttpPost httpPost = new HttpPost(url);
  333. List<NameValuePair> nvps = new ArrayList<NameValuePair>();
  334. if (Objects.nonNull(paramsMap)) {
  335. Iterator<String> iterator = paramsMap.keySet().iterator();
  336. while (iterator.hasNext()) {
  337. String key = iterator.next();
  338. Object value = paramsMap.get(key);
  339. nvps.add(new BasicNameValuePair(key, String.valueOf(value)));
  340. }
  341. }
  342. // 设置header
  343. if (headerMap != null) {
  344. for (Map.Entry<String, String> entry : headerMap.entrySet()) {
  345. httpPost.addHeader(entry.getKey(), entry.getValue());
  346. }
  347. }
  348. try {
  349. httpPost.setEntity(new UrlEncodedFormEntity(nvps, charsetDefault));
  350. } catch (UnsupportedEncodingException e) {
  351. log.error(e);
  352. }
  353. request = httpPost;
  354. hrc = executeHttpRequest(request, connectTimeout, readTimeout);
  355. return hrc;
  356. }
  357. /**
  358. * post请求,multipart,支持File,byte[]这两种二进制数据
  359. *
  360. * @param url 请求的url
  361. * @param paramsMap 请求参数map
  362. * @return HttpResponseContent对象,如果http请求出现异常,返回null
  363. */
  364. public static HttpResponseContent postMultipart(String url, Map<String, Object> paramsMap) {
  365. return postMultipart(url, paramsMap, connectTimeoutDefault, readTimeoutDefault, null);
  366. }
  367. public static HttpResponseContent postMultipart(String url, Map<String, Object> paramsMap, Map<String, String> headerMap) {
  368. return postMultipart(url, paramsMap, connectTimeoutDefault, readTimeoutDefault, headerMap);
  369. }
  370. /**
  371. * post请求,multipart,支持File,byte[]这两种二进制数据
  372. *
  373. * @param url 请求的url
  374. * @param paramsMap 请求参数map
  375. * @param connectTimeout 连接超时设置,毫秒
  376. * @param readTimeout 读取超时设置,毫秒
  377. * @return HttpResponseContent对象,如果http请求出现异常,返回null
  378. */
  379. public static HttpResponseContent postMultipart(String url, Map<String, Object> paramsMap, int connectTimeout,
  380. int readTimeout, Map<String, String> headerMap) {
  381. HttpRequestBase request = null;
  382. HttpResponseContent hrc = null;
  383. HttpPost httpPost = new HttpPost(url);
  384. MultipartEntityBuilder multipartEntityBuilder = MultipartEntityBuilder.create();
  385. multipartEntityBuilder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
  386. Iterator<String> iterator = paramsMap.keySet().iterator();
  387. while (iterator.hasNext()) {
  388. String key = iterator.next();
  389. Object value = paramsMap.get(key);
  390. if (value instanceof File) {
  391. multipartEntityBuilder.addBinaryBody(key, (File) value);
  392. } else if (value instanceof byte[]) {
  393. multipartEntityBuilder.addBinaryBody(key, (byte[]) value);
  394. } else {
  395. multipartEntityBuilder.addTextBody(key, String.valueOf(value),
  396. ContentType.create("text/plain", charsetDefault));
  397. }
  398. }
  399. httpPost.setEntity(multipartEntityBuilder.build());
  400. // 设置header
  401. if (headerMap != null) {
  402. for (Map.Entry<String, String> entry : headerMap.entrySet()) {
  403. httpPost.addHeader(entry.getKey(), entry.getValue());
  404. }
  405. }
  406. request = httpPost;
  407. hrc = executeHttpRequest(request, connectTimeout, readTimeout);
  408. return hrc;
  409. }
  410. public static HttpResponseContent postRequestBody(String url, Object s, Map<String, String> headerMap) {
  411. HttpRequestBase request = null;
  412. HttpResponseContent hrc = null;
  413. HttpPost httpPost = new HttpPost(url);
  414. StringEntity stringEntity = new StringEntity((s instanceof String) ? (String) s : JSONObject.toJSONString(s), Consts.UTF_8);
  415. stringEntity.setContentEncoding(Consts.UTF_8.name());
  416. stringEntity.setContentType("application/json");
  417. httpPost.setEntity(stringEntity);
  418. // 设置header
  419. if (headerMap != null) {
  420. for (Map.Entry<String, String> entry : headerMap.entrySet()) {
  421. httpPost.addHeader(entry.getKey(), entry.getValue());
  422. }
  423. }
  424. request = httpPost;
  425. hrc = executeHttpRequest(request, connectTimeoutDefault, readTimeoutDefault);
  426. return hrc;
  427. }
  428. public static HttpResponseContent deleteRequestBody(String url, Object s, HashMap<String, String> headerMap) {
  429. HttpRequestBase request = null;
  430. HttpResponseContent hrc = null;
  431. HttpDeleteExpand httpDelete = new HttpDeleteExpand(url);
  432. StringEntity stringEntity = new StringEntity(JSONObject.toJSONString(s), Consts.UTF_8);
  433. stringEntity.setContentEncoding(Consts.UTF_8.name());
  434. stringEntity.setContentType("application/json");
  435. httpDelete.setEntity(stringEntity);
  436. // 设置header
  437. if (headerMap != null) {
  438. for (Map.Entry<String, String> entry : headerMap.entrySet()) {
  439. httpDelete.addHeader(entry.getKey(), entry.getValue());
  440. }
  441. }
  442. request = httpDelete;
  443. hrc = executeHttpRequest(request, connectTimeoutDefault, readTimeoutDefault);
  444. return hrc;
  445. }
  446. public static HttpResponseContent putRequestBody(String url, Object s, HashMap<String, String> headerMap) {
  447. HttpRequestBase request = null;
  448. HttpResponseContent hrc = null;
  449. HttpPut httpPut = new HttpPut(url);
  450. StringEntity stringEntity = new StringEntity(JSONObject.toJSONString(s), Consts.UTF_8);
  451. stringEntity.setContentEncoding(Consts.UTF_8.name());
  452. stringEntity.setContentType("application/json");
  453. httpPut.setEntity(stringEntity);
  454. // 设置header
  455. if (headerMap != null) {
  456. for (Map.Entry<String, String> entry : headerMap.entrySet()) {
  457. httpPut.addHeader(entry.getKey(), entry.getValue());
  458. }
  459. }
  460. request = httpPut;
  461. hrc = executeHttpRequest(request, connectTimeoutDefault, readTimeoutDefault);
  462. return hrc;
  463. }
  464. /**
  465. * 执行Http请求
  466. *
  467. * @param request
  468. * @param connectTimeout
  469. * @param readTimeout
  470. * @return HttpResponseContent对象,如果http请求出现异常,返回null
  471. */
  472. private static HttpResponseContent executeHttpRequest(HttpRequestBase request, int connectTimeout,
  473. int readTimeout) {
  474. CloseableHttpResponse response = null;
  475. HttpResponseContent hrc = null;
  476. try {
  477. // 设置请求配置
  478. RequestConfig.Builder configBuilder = RequestConfig.custom();
  479. // 设置连接超时
  480. configBuilder.setConnectTimeout(connectTimeout);
  481. // 设置读取超时
  482. configBuilder.setSocketTimeout(readTimeout);
  483. // 设置从连接池获取连接实例的超时
  484. configBuilder.setConnectionRequestTimeout(getConnectionTimeoutDefault);
  485. RequestConfig requestConfig = configBuilder.build();
  486. request.setConfig(requestConfig);
  487. log.debug("开始执行Http请求, uri:" + request.getURI());
  488. response = client.execute(request);
  489. hrc = getHttpResponseContent(response);
  490. return hrc;
  491. } catch (Exception e) {
  492. log.error("执行Http请求异常, uri:" + request.getURI(), e);
  493. } finally {
  494. close(request, response);
  495. }
  496. return hrc;
  497. }
  498. /**
  499. * 封装HTTP响应报文
  500. *
  501. * @param response
  502. * @return
  503. */
  504. private static HttpResponseContent getHttpResponseContent(CloseableHttpResponse response) {
  505. // 获取响应实体
  506. HttpEntity entity = response.getEntity();
  507. if (entity == null) {
  508. return null;
  509. }
  510. HttpResponseContent hrc = new HttpResponseContent();
  511. hrc.setHeaders(response.getAllHeaders());
  512. hrc.setStatusCode(response.getStatusLine().getStatusCode());
  513. ContentType contentType = ContentType.getOrDefault(entity);
  514. hrc.setMimeType(contentType.getMimeType());
  515. if (contentType.getCharset() != null) {
  516. hrc.setCharsetName(contentType.getCharset().name());
  517. }
  518. try {
  519. hrc.setContentBytes(EntityUtils.toByteArray(entity));
  520. } catch (IOException e) {
  521. log.error("封装HTTP响应报文异常", e);
  522. }
  523. return hrc;
  524. }
  525. /**
  526. * 关闭资源
  527. *
  528. * @param request
  529. * @param response
  530. */
  531. private static void close(HttpRequestBase request, CloseableHttpResponse response) {
  532. try {
  533. if (request != null)
  534. request.releaseConnection();
  535. if (response != null)
  536. response.close();
  537. } catch (Exception e) {
  538. log.error("关闭资源异常", e);
  539. }
  540. }
  541. /**
  542. * url编码
  543. *
  544. * @param url
  545. * @param charset
  546. * @return
  547. */
  548. public static String encodeURL(String url, String charset) {
  549. if (url == null || charset == null) {
  550. return null;
  551. }
  552. int p = url.indexOf("?");
  553. if (p < 0) {
  554. return url;
  555. }
  556. StringBuilder sb = new StringBuilder();
  557. String preStr = url.substring(0, p + 1);
  558. sb.append(preStr);
  559. String queryStr = url.substring(p + 1, url.length());
  560. String[] array = queryStr.split("&");
  561. for (int i = 0; i < array.length; i++) {
  562. String str = array[i];
  563. int pp = str.indexOf("=");
  564. if (pp > -1) {
  565. sb.append(str.substring(0, pp + 1));
  566. try {
  567. sb.append(URLEncoder.encode(str.substring(pp + 1, str.length()), charset));
  568. } catch (UnsupportedEncodingException e) {
  569. e.printStackTrace();
  570. }
  571. if (i < array.length - 1) {
  572. sb.append("&");
  573. }
  574. }
  575. }
  576. return sb.toString();
  577. }
  578. }