HttpClientUtil.java 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257
  1. package com.tzy.util;
  2. import com.tzy.common.utils.MyX509TrustManager;
  3. import lombok.Data;
  4. import lombok.extern.slf4j.Slf4j;
  5. import javax.net.ssl.HttpsURLConnection;
  6. import javax.net.ssl.SSLContext;
  7. import javax.net.ssl.SSLSocketFactory;
  8. import javax.net.ssl.TrustManager;
  9. import java.io.*;
  10. import java.net.MalformedURLException;
  11. import java.net.URL;
  12. import java.security.KeyManagementException;
  13. import java.security.NoSuchAlgorithmException;
  14. import java.util.*;
  15. /**
  16. * httpclient
  17. */
  18. @Slf4j
  19. @Data
  20. public class HttpClientUtil {
  21. private String contentType;
  22. private String authorization;
  23. public HttpClientUtil(){}
  24. public HttpClientUtil(String contentType,String authorization){
  25. this.contentType = contentType;
  26. this.authorization = authorization;
  27. }
  28. /**
  29. *
  30. * @param httpUrl 请求的url
  31. * @param param form表单的参数(key,value形式)
  32. * @return
  33. */
  34. @SuppressWarnings("resource")
  35. public String doPostForm(String httpUrl, Map param) {
  36. HttpsURLConnection connection = null;
  37. InputStream is = null;
  38. OutputStream os = null;
  39. BufferedReader br = null;
  40. String result = null;
  41. try {
  42. //创建SSLContext
  43. SSLContext sslContext=SSLContext.getInstance("SSL");
  44. TrustManager[] tm={new MyX509TrustManager()};
  45. //初始化
  46. sslContext.init(null, tm, new java.security.SecureRandom());;
  47. //获取SSLSocketFactory对象
  48. SSLSocketFactory ssf=sslContext.getSocketFactory();
  49. URL url = new URL(httpUrl);
  50. // 通过远程url连接对象打开连接
  51. connection = (HttpsURLConnection) url.openConnection();
  52. // 设置连接请求方式
  53. connection.setRequestMethod("POST");
  54. // 设置连接主机服务器超时时间:15000毫秒
  55. connection.setConnectTimeout(150000);
  56. // 设置读取主机服务器返回数据超时时间:60000毫秒
  57. connection.setReadTimeout(600000);
  58. // 默认值为:false,当向远程服务器传送数据/写数据时,需要设置为true
  59. connection.setDoOutput(true);
  60. // 默认值为:true,当前向远程服务读取数据时,设置为true,该参数可有可无
  61. connection.setDoInput(true);
  62. // 设置传入参数的格式:请求参数应该是 name1=value1&name2=value2 的形式。
  63. connection.setRequestProperty("Content-Type", contentType);
  64. // 设置鉴权信息:Authorization:
  65. connection.setRequestProperty("Authorization", authorization);
  66. //设置当前实例使用的SSLSoctetFactory
  67. connection.setSSLSocketFactory(ssf);
  68. // 通过连接对象获取一个输出流
  69. os = connection.getOutputStream();
  70. // 通过输出流对象将参数写出去/传输出去,它是通过字节数组写出的(form表单形式的参数实质也是key,value值的拼接,类似于get请求参数的拼接)
  71. os.write(createLinkString(param).getBytes("utf-8"));
  72. // 通过连接对象获取一个输入流,向远程读取
  73. if (connection.getResponseCode() == 200) {
  74. is = connection.getInputStream();
  75. // 对输入流对象进行包装:charset根据工作项目组的要求来设置
  76. br = new BufferedReader(new InputStreamReader(is, "utf-8"));
  77. StringBuffer sbf = new StringBuffer();
  78. String temp = null;
  79. // 循环遍历一行一行读取数据
  80. while ((temp = br.readLine()) != null) {
  81. sbf.append(temp);
  82. sbf.append("\r\n");
  83. }
  84. result = sbf.toString();
  85. }
  86. } catch (MalformedURLException e) {
  87. e.printStackTrace();
  88. } catch (IOException e) {
  89. e.printStackTrace();
  90. } catch (NoSuchAlgorithmException e) {
  91. e.printStackTrace();
  92. } catch (KeyManagementException e) {
  93. e.printStackTrace();
  94. } finally {
  95. // 关闭资源
  96. if (null != br) {
  97. try {
  98. br.close();
  99. } catch (IOException e) {
  100. e.printStackTrace();
  101. }
  102. }
  103. if (null != os) {
  104. try {
  105. os.close();
  106. } catch (IOException e) {
  107. e.printStackTrace();
  108. }
  109. }
  110. if (null != is) {
  111. try {
  112. is.close();
  113. } catch (IOException e) {
  114. e.printStackTrace();
  115. }
  116. }
  117. // 断开与远程地址url的连接
  118. connection.disconnect();
  119. }
  120. return result;
  121. }
  122. /*
  123. * 处理https GET/POST请求
  124. * @param requestUrl 请求地址、
  125. * @param method 请求方法[GET/POST]
  126. * @param param 参数
  127. * @return 返回值
  128. * */
  129. public static String httpsRequest(String requestUrl,String method,String param , Map<String ,String> header){
  130. StringBuffer buffer=null;
  131. try{
  132. //创建SSLContext
  133. SSLContext sslContext=SSLContext.getInstance("SSL");
  134. TrustManager[] tm={new MyX509TrustManager()};
  135. //初始化
  136. sslContext.init(null, tm, new java.security.SecureRandom());
  137. //获取SSLSocketFactory对象
  138. SSLSocketFactory ssf=sslContext.getSocketFactory();
  139. URL url=new URL(requestUrl);
  140. HttpsURLConnection conn=(HttpsURLConnection)url.openConnection();
  141. conn.setDoOutput(true);
  142. conn.setDoInput(true);
  143. conn.setUseCaches(false);
  144. conn.setRequestMethod(method);
  145. if(null != header && !header.isEmpty()){
  146. Set set = header.keySet();
  147. Iterator<String> iterator = set.iterator();
  148. while (iterator.hasNext()){
  149. String key = iterator.next();
  150. conn.setRequestProperty(key, header.get(key));
  151. }
  152. }
  153. //设置当前实例使用的SSLSoctetFactory
  154. conn.setSSLSocketFactory(ssf);
  155. conn.connect();
  156. //往服务器端写内容
  157. if(null!=param){
  158. OutputStream os=conn.getOutputStream();
  159. os.write(param.getBytes("utf-8"));
  160. os.close();
  161. }
  162. //读取服务器端返回的内容
  163. InputStream is=conn.getInputStream();
  164. InputStreamReader isr=new InputStreamReader(is,"utf-8");
  165. BufferedReader br=new BufferedReader(isr);
  166. buffer=new StringBuffer();
  167. String line=null;
  168. while((line=br.readLine())!=null){
  169. buffer.append(line);
  170. }
  171. }catch(Exception e){
  172. log.error(e.getMessage());
  173. e.printStackTrace();
  174. }
  175. return buffer.toString();
  176. }
  177. /**
  178. * http 请求
  179. * @param requestUrl
  180. * @param method
  181. * @param param
  182. * @param header
  183. * @return
  184. */
  185. public static String httpRequest(String requestUrl,String method,String param , Map<String ,String> header){
  186. StringBuffer buffer=null;
  187. try{
  188. TrustManager[] tm={new MyX509TrustManager()};
  189. //初始化
  190. URL url=new URL(requestUrl);
  191. sun.net.www.protocol.http.HttpURLConnection conn = (sun.net.www.protocol.http.HttpURLConnection) url.openConnection();
  192. // HttpsURLConnection conn=(HttpsURLConnection)url.openConnection();
  193. conn.setDoOutput(true);
  194. conn.setDoInput(true);
  195. conn.setUseCaches(false);
  196. conn.setRequestMethod(method);
  197. if(null != header && !header.isEmpty()){
  198. Set set = header.keySet();
  199. Iterator<String> iterator = set.iterator();
  200. while (iterator.hasNext()){
  201. String key = iterator.next();
  202. conn.setRequestProperty(key, header.get(key));
  203. }
  204. }
  205. conn.connect();
  206. //往服务器端写内容
  207. if(null!=param){
  208. OutputStream os=conn.getOutputStream();
  209. os.write(param.getBytes("utf-8"));
  210. os.close();
  211. }
  212. log.debug("http请求code:{},msg:{}", conn.getResponseCode(), conn.getResponseMessage());
  213. //读取服务器端返回的内容
  214. InputStream is=conn.getInputStream();
  215. InputStreamReader isr=new InputStreamReader(is,"utf-8");
  216. BufferedReader br=new BufferedReader(isr);
  217. buffer=new StringBuffer();
  218. String line=null;
  219. while((line=br.readLine())!=null){
  220. buffer.append(line);
  221. }
  222. }catch(Exception e){
  223. log.error("http请求失败:{}",e);
  224. }
  225. return buffer.toString();
  226. }
  227. /**
  228. * 把数组所有元素排序,并按照“参数=参数值”的模式用“&”字符拼接成字符串
  229. * @param params 需要排序并参与字符拼接的参数组
  230. * @return 拼接后字符串
  231. */
  232. public static String createLinkString(Map<String, String> params) {
  233. List<String> keys = new ArrayList<String>(params.keySet());
  234. Collections.sort(keys);
  235. StringBuilder prestr = new StringBuilder();
  236. for (int i = 0; i < keys.size(); i++) {
  237. String key = keys.get(i);
  238. String value = params.get(key);
  239. if (i == keys.size() - 1) {// 拼接时,不包括最后一个&字符
  240. prestr.append(key).append("=").append(value);
  241. } else {
  242. prestr.append(key).append("=").append(value).append("&");
  243. }
  244. }
  245. return prestr.toString();
  246. }
  247. }