package com.tzy.util; import com.tzy.common.utils.MyX509TrustManager; import lombok.Data; import lombok.extern.slf4j.Slf4j; import javax.net.ssl.HttpsURLConnection; import javax.net.ssl.SSLContext; import javax.net.ssl.SSLSocketFactory; import javax.net.ssl.TrustManager; import java.io.*; import java.net.MalformedURLException; import java.net.URL; import java.security.KeyManagementException; import java.security.NoSuchAlgorithmException; import java.util.*; /** * httpclient */ @Slf4j @Data public class HttpClientUtil { private String contentType; private String authorization; public HttpClientUtil(){} public HttpClientUtil(String contentType,String authorization){ this.contentType = contentType; this.authorization = authorization; } /** * * @param httpUrl 请求的url * @param param form表单的参数(key,value形式) * @return */ @SuppressWarnings("resource") public String doPostForm(String httpUrl, Map param) { HttpsURLConnection connection = null; InputStream is = null; OutputStream os = null; BufferedReader br = null; String result = null; try { //创建SSLContext SSLContext sslContext=SSLContext.getInstance("SSL"); TrustManager[] tm={new MyX509TrustManager()}; //初始化 sslContext.init(null, tm, new java.security.SecureRandom());; //获取SSLSocketFactory对象 SSLSocketFactory ssf=sslContext.getSocketFactory(); URL url = new URL(httpUrl); // 通过远程url连接对象打开连接 connection = (HttpsURLConnection) url.openConnection(); // 设置连接请求方式 connection.setRequestMethod("POST"); // 设置连接主机服务器超时时间:15000毫秒 connection.setConnectTimeout(150000); // 设置读取主机服务器返回数据超时时间:60000毫秒 connection.setReadTimeout(600000); // 默认值为:false,当向远程服务器传送数据/写数据时,需要设置为true connection.setDoOutput(true); // 默认值为:true,当前向远程服务读取数据时,设置为true,该参数可有可无 connection.setDoInput(true); // 设置传入参数的格式:请求参数应该是 name1=value1&name2=value2 的形式。 connection.setRequestProperty("Content-Type", contentType); // 设置鉴权信息:Authorization: connection.setRequestProperty("Authorization", authorization); //设置当前实例使用的SSLSoctetFactory connection.setSSLSocketFactory(ssf); // 通过连接对象获取一个输出流 os = connection.getOutputStream(); // 通过输出流对象将参数写出去/传输出去,它是通过字节数组写出的(form表单形式的参数实质也是key,value值的拼接,类似于get请求参数的拼接) os.write(createLinkString(param).getBytes("utf-8")); // 通过连接对象获取一个输入流,向远程读取 if (connection.getResponseCode() == 200) { is = connection.getInputStream(); // 对输入流对象进行包装:charset根据工作项目组的要求来设置 br = new BufferedReader(new InputStreamReader(is, "utf-8")); StringBuffer sbf = new StringBuffer(); String temp = null; // 循环遍历一行一行读取数据 while ((temp = br.readLine()) != null) { sbf.append(temp); sbf.append("\r\n"); } result = sbf.toString(); } } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (KeyManagementException e) { e.printStackTrace(); } finally { // 关闭资源 if (null != br) { try { br.close(); } catch (IOException e) { e.printStackTrace(); } } if (null != os) { try { os.close(); } catch (IOException e) { e.printStackTrace(); } } if (null != is) { try { is.close(); } catch (IOException e) { e.printStackTrace(); } } // 断开与远程地址url的连接 connection.disconnect(); } return result; } /* * 处理https GET/POST请求 * @param requestUrl 请求地址、 * @param method 请求方法[GET/POST] * @param param 参数 * @return 返回值 * */ public static String httpsRequest(String requestUrl,String method,String param , Map header){ StringBuffer buffer=null; try{ //创建SSLContext SSLContext sslContext=SSLContext.getInstance("SSL"); TrustManager[] tm={new MyX509TrustManager()}; //初始化 sslContext.init(null, tm, new java.security.SecureRandom()); //获取SSLSocketFactory对象 SSLSocketFactory ssf=sslContext.getSocketFactory(); URL url=new URL(requestUrl); HttpsURLConnection conn=(HttpsURLConnection)url.openConnection(); conn.setDoOutput(true); conn.setDoInput(true); conn.setUseCaches(false); conn.setRequestMethod(method); if(null != header && !header.isEmpty()){ Set set = header.keySet(); Iterator iterator = set.iterator(); while (iterator.hasNext()){ String key = iterator.next(); conn.setRequestProperty(key, header.get(key)); } } //设置当前实例使用的SSLSoctetFactory conn.setSSLSocketFactory(ssf); conn.connect(); //往服务器端写内容 if(null!=param){ OutputStream os=conn.getOutputStream(); os.write(param.getBytes("utf-8")); os.close(); } //读取服务器端返回的内容 InputStream is=conn.getInputStream(); InputStreamReader isr=new InputStreamReader(is,"utf-8"); BufferedReader br=new BufferedReader(isr); buffer=new StringBuffer(); String line=null; while((line=br.readLine())!=null){ buffer.append(line); } }catch(Exception e){ log.error(e.getMessage()); e.printStackTrace(); } return buffer.toString(); } /** * http 请求 * @param requestUrl * @param method * @param param * @param header * @return */ public static String httpRequest(String requestUrl,String method,String param , Map header){ StringBuffer buffer=null; try{ TrustManager[] tm={new MyX509TrustManager()}; //初始化 URL url=new URL(requestUrl); sun.net.www.protocol.http.HttpURLConnection conn = (sun.net.www.protocol.http.HttpURLConnection) url.openConnection(); // HttpsURLConnection conn=(HttpsURLConnection)url.openConnection(); conn.setDoOutput(true); conn.setDoInput(true); conn.setUseCaches(false); conn.setRequestMethod(method); if(null != header && !header.isEmpty()){ Set set = header.keySet(); Iterator iterator = set.iterator(); while (iterator.hasNext()){ String key = iterator.next(); conn.setRequestProperty(key, header.get(key)); } } conn.connect(); //往服务器端写内容 if(null!=param){ OutputStream os=conn.getOutputStream(); os.write(param.getBytes("utf-8")); os.close(); } log.debug("http请求code:{},msg:{}", conn.getResponseCode(), conn.getResponseMessage()); //读取服务器端返回的内容 InputStream is=conn.getInputStream(); InputStreamReader isr=new InputStreamReader(is,"utf-8"); BufferedReader br=new BufferedReader(isr); buffer=new StringBuffer(); String line=null; while((line=br.readLine())!=null){ buffer.append(line); } }catch(Exception e){ log.error("http请求失败:{}",e); } return buffer.toString(); } /** * 把数组所有元素排序,并按照“参数=参数值”的模式用“&”字符拼接成字符串 * @param params 需要排序并参与字符拼接的参数组 * @return 拼接后字符串 */ public static String createLinkString(Map params) { List keys = new ArrayList(params.keySet()); Collections.sort(keys); StringBuilder prestr = new StringBuilder(); for (int i = 0; i < keys.size(); i++) { String key = keys.get(i); String value = params.get(key); if (i == keys.size() - 1) {// 拼接时,不包括最后一个&字符 prestr.append(key).append("=").append(value); } else { prestr.append(key).append("=").append(value).append("&"); } } return prestr.toString(); } }