package com.panzhihua.common.utlis; import java.io.*; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; import java.net.URLConnection; import java.security.KeyManagementException; import java.security.KeyStore; import java.security.KeyStoreException; import java.security.NoSuchAlgorithmException; import java.security.cert.CertificateException; import java.security.cert.X509Certificate; import java.util.Iterator; import java.util.List; import java.util.Map; import com.alibaba.fastjson.JSONObject; import org.apache.http.Header; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.client.HttpClient; import org.apache.http.client.config.RequestConfig; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPost; import org.apache.http.client.methods.HttpUriRequest; import org.apache.http.conn.ssl.NoopHostnameVerifier; import org.apache.http.conn.ssl.SSLConnectionSocketFactory; import org.apache.http.conn.ssl.TrustStrategy; import org.apache.http.entity.StringEntity; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.impl.client.HttpClients; import org.apache.http.message.BasicHeader; import org.apache.http.ssl.SSLContexts; import org.apache.http.util.EntityUtils; import org.springframework.util.ObjectUtils; import com.panzhihua.common.constants.HttpConstant; import lombok.extern.slf4j.Slf4j; import javax.net.ssl.SSLContext; import static com.panzhihua.common.utlis.wx.WXPayConstants.USER_AGENT; /** * @program: springcloud_k8s_panzhihuazhihuishequ * @description: * @author: huang.hongfa weixin hhf9596 qq 959656820 * @create: 2021-01-08 10:23 **/ @Slf4j public class HttpClientUtil { /** * 通过post方式调用http接口 * * @param url * url路径 * @param jsonParam * json格式的参数 * @param reSend * 重发次数 * @param headerKey * header键值 * @param headerValue * headervalue * @return * @throws Exception */ public static String sendPostByJson(String url, String jsonParam, int reSend, String headerKey, String headerValue) { // 声明返回结果 String result = ""; // 开始请求API接口时间 long startTime = System.currentTimeMillis(); // 请求API接口的响应时间 long endTime = 0L; HttpEntity httpEntity = null; HttpResponse httpResponse = null; HttpClient httpClient = null; try { // 创建连接 httpClient = HttpClientFactory.getInstance().getHttpClient(); // 设置请求头和报文 HttpPost httpPost = HttpClientFactory.getInstance().httpPost(url); Header header = new BasicHeader("Accept-Encoding", null); httpPost.setHeader(header); if (!ObjectUtils.isEmpty(headerKey)) { httpPost.setHeader(headerKey, headerValue); } // 设置报文和通讯格式 StringEntity stringEntity = new StringEntity(jsonParam, HttpConstant.UTF8_ENCODE); stringEntity.setContentEncoding(HttpConstant.UTF8_ENCODE); stringEntity.setContentType(HttpConstant.APPLICATION_JSON); httpPost.setEntity(stringEntity); // log.info("请求{}接口的参数为{}", url, jsonParam); // 执行发送,获取相应结果 httpResponse = httpClient.execute(httpPost); httpEntity = httpResponse.getEntity(); result = EntityUtils.toString(httpEntity); } catch (Exception e) { log.error("请求{}接口出现异常", url, e); if (reSend > 0) { log.info("请求{}出现异常:{},进行重发。进行第{}次重发", url, e.getMessage(), (HttpConstant.REQ_TIMES - reSend + 1)); result = sendPostByJson(url, jsonParam, reSend - 1, headerKey, headerValue); if (result != null && !"".equals(result)) { return result; } } } finally { try { EntityUtils.consume(httpEntity); } catch (IOException e) { log.error("http请求释放资源异常", e); } } // 请求接口的响应时间 endTime = System.currentTimeMillis(); // log.info("请求{}接口的响应报文内容为{},本次请求API接口的响应时间为:{}毫秒", url, result, (endTime - startTime)); return result; } /** * 使用http请求调用接口,参数类型为xml * * @param urlStr * 请求地址 * @param data * 请求参数 * @return 调用结果 */ public static String httpsRequest(String urlStr, String data) { try { URL url = new URL(urlStr); URLConnection con = url.openConnection(); con.setDoOutput(true); // con.setRequestProperty("Pragma:", "no-cache"); con.setRequestProperty("Cache-Control", "no-cache"); con.setRequestProperty("Content-Type", "text/xml"); OutputStreamWriter out = new OutputStreamWriter(con.getOutputStream()); log.info("urlStr=" + urlStr); log.info("xmlInfo=" + data); out.write(new String(data.getBytes("UTF-8"))); out.flush(); out.close(); BufferedReader br = new BufferedReader(new InputStreamReader(con.getInputStream())); String line = ""; StringBuffer sb = new StringBuffer(); for (line = br.readLine(); line != null; line = br.readLine()) { sb.append(line); } return sb.toString(); } catch (MalformedURLException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } return ""; } /** * http请求工具类,get请求 * * @param url * @param params * @param resonseCharSet * @return * @throws Exception */ public static String httpGet(String url, Map params, String... resonseCharSet) throws Exception { DefaultHttpClient defaultHttpClient = null; BufferedReader bufferedReader = null; try { defaultHttpClient = new DefaultHttpClient(); if (params != null) { StringBuilder stringBuilder = new StringBuilder(); Iterator iterator = params.keySet().iterator(); String key; while (iterator.hasNext()) { key = iterator.next(); Object val = params.get(key); if (val instanceof List) { List v = (List)val; for (Object o : v) { stringBuilder.append(key).append("=").append(o.toString()).append("&"); } } else { stringBuilder.append(key).append("=").append(val.toString()).append("&"); } } stringBuilder.deleteCharAt(stringBuilder.length() - 1); url = url + "?" + stringBuilder.toString(); log.info("url:{}", url); } HttpGet httpGet = new HttpGet(url); httpGet.setHeader("Content-Type", "application/json;charset=ut-8"); HttpResponse httpResponse = defaultHttpClient.execute(httpGet); if (httpResponse.getStatusLine().getStatusCode() != 200) { String errorLog = "请求失败,errorCode:" + httpResponse.getStatusLine().getStatusCode(); log.info("errorLog:{}"+errorLog); throw new Exception(url + errorLog); } // 读取返回信息 String charSet = "utf-8"; if (resonseCharSet != null && resonseCharSet.length > 0) charSet = resonseCharSet[0]; String output; bufferedReader = new BufferedReader(new InputStreamReader(httpResponse.getEntity().getContent(), charSet)); StringBuilder dataBuilder = new StringBuilder(); while ((output = bufferedReader.readLine()) != null) { dataBuilder.append(output); } return dataBuilder.toString(); } catch (IOException e) { e.printStackTrace(); throw e; } finally { if (defaultHttpClient != null) defaultHttpClient.getConnectionManager().shutdown(); if (bufferedReader != null) bufferedReader.close(); } } /** * http请求工具类,post请求 * * @param url * url * @param param * 参数值 仅支持String * @return * @throws Exception */ public static String httpPost(String url, String param) throws Exception { DefaultHttpClient defaultHttpClient = null; BufferedReader bufferedReader = null; try { defaultHttpClient = new DefaultHttpClient(); HttpPost httpPost = new HttpPost(url); httpPost.setHeader("Content-Type", "application/json;charset=utf-8"); if (StringUtils.isNotBlank(param)) { log.info("参数值:{}", param); HttpEntity httpEntity = new StringEntity(param, "utf-8"); httpPost.setEntity(httpEntity); } HttpResponse httpResponse = defaultHttpClient.execute(httpPost); if (httpResponse.getStatusLine().getStatusCode() != 200) { String errorLog = "请求失败,errorCode:" + httpResponse.getStatusLine().getStatusCode(); log.info(errorLog); throw new Exception(url + errorLog); } // 读取返回信息 String output; bufferedReader = new BufferedReader(new InputStreamReader(httpResponse.getEntity().getContent(), "utf-8")); StringBuilder stringBuilder = new StringBuilder(); while ((output = bufferedReader.readLine()) != null) { stringBuilder.append(output); } log.info("调用微信接口返回的参数:" + stringBuilder.toString()); return stringBuilder.toString(); } catch (IOException e) { e.printStackTrace(); throw e; } finally { if (defaultHttpClient != null) defaultHttpClient.getConnectionManager().shutdown(); if (bufferedReader != null) bufferedReader.close(); } } // HTTP GET请求 public static String sendGet(String url) throws Exception { URL obj = new URL(url); HttpURLConnection con = (HttpURLConnection) obj.openConnection(); //默认值GET con.setRequestMethod("GET"); //添加请求头 con.setRequestProperty("User-Agent", USER_AGENT); int responseCode = con.getResponseCode(); log.info("发送 'GET' 请求到 URL:{}" + url); log.info("Response Code:{}" + responseCode); BufferedReader in = new BufferedReader( new InputStreamReader(con.getInputStream())); String inputLine; StringBuffer response = new StringBuffer(); while ((inputLine = in.readLine()) != null) { response.append(inputLine); } in.close(); //打印结果 log.info("uu洗车返回:{}"+response.toString()); return response.toString(); } /** * http请求工具类,post请求 * * @param url * url * @param param * 参数值 仅支持String * @return * @throws Exception */ public static String httpPostAndToken(String url, String param,Map headerMap) throws Exception { DefaultHttpClient defaultHttpClient = null; BufferedReader bufferedReader = null; try { defaultHttpClient = new DefaultHttpClient(); HttpPost httpPost = new HttpPost(url); httpPost.setHeader("Content-Type", "application/json;charset=utf-8"); // httpPost.setHeader("Authorization", headerMap.get("Authorization").toString()); // httpPost.setHeader("Host", headerMap.get("Host").toString()); for (Object key : headerMap.keySet()) { httpPost.setHeader(key.toString(), headerMap.get(key).toString()); } if (StringUtils.isNotBlank(param)) { log.info("参数值:{}", param); HttpEntity httpEntity = new StringEntity(param, "utf-8"); httpPost.setEntity(httpEntity); // httpPost.setHeader("Content-Length", String.valueOf(httpEntity.getContentLength())); } HttpResponse httpResponse = defaultHttpClient.execute(httpPost); if (httpResponse.getStatusLine().getStatusCode() != 200) { int statusCode = httpResponse.getStatusLine().getStatusCode(); String errorLog = "请求失败,errorCode:" + httpResponse.getStatusLine().getStatusCode(); log.info(errorLog); throw new Exception(url + errorLog); } // 读取返回信息 String output; bufferedReader = new BufferedReader(new InputStreamReader(httpResponse.getEntity().getContent(), "utf-8")); StringBuilder stringBuilder = new StringBuilder(); while ((output = bufferedReader.readLine()) != null) { stringBuilder.append(output); } log.info("调用接口返回的参数:" + stringBuilder.toString()); return stringBuilder.toString(); } catch (IOException e) { e.printStackTrace(); throw e; } finally { if (defaultHttpClient != null) defaultHttpClient.getConnectionManager().shutdown(); if (bufferedReader != null) bufferedReader.close(); } } public static void main(String[] args) throws IOException { DefaultHttpClient defaultHttpClient = new DefaultHttpClient(); HttpPost httpPost = new HttpPost("https://dptest.d-power.com.cn:14404/v1/face"); // httpPost.setHeader("Content-Type", "application/json;charset=utf-8"); httpPost.setHeader("Authorization", "DpToken P3JHgjLbyljfLrFnS9OZbATRJmacdt4b"); httpPost.setHeader("Host", "123.60.2.66"); // httpPost.setHeader("Content-Length", String.valueOf(entity.getContentLength())); // httpPost.setHeader("User-Agent", "Apache-HttpClient/4.5.12 (Java/1.8.0_162)[\\r][\\n]"); httpPost.setEntity(new StringEntity("{\"positions\":[{\"role\":\"occupant\",\"communityId\":\"64f99b2ed26106d4f0fe93f4\",\"unitId\":\"64f99b2ed26106d4f0fe93f7\"}],\"tel\":\"15696695118\",\"name\":\"四月里3\",\"timeout\":10,\"image\":\"fsdfsdfsdf\"}", "utf-8")); // httpPost.setHeader("Content-Length", String.valueOf(entity.getContentLength())); HttpResponse httpResponse = defaultHttpClient.execute(httpPost); System.out.println(httpResponse.getEntity()); } /** * get请求 * * @param url * 请求地址(get请求时参数自己组装到url上) * @param headerMap * 请求头 * @return 响应文本 */ public static String get(String url, Map headerMap, String param) { // 请求地址,以及参数设置 HttpPost post = new HttpPost(url); if (headerMap != null) { for (Map.Entry entry : headerMap.entrySet()) { post.setHeader(entry.getKey(), entry.getValue()); } } if (StringUtils.isNotBlank(param)) { log.info("参数值:{}", param); HttpEntity httpEntity = new StringEntity(param, "utf-8"); post.setEntity(httpEntity); } // 执行请求,获取相应 return getRespString(post); } /** * get请求 * * @param url * 请求地址(get请求时参数自己组装到url上) * @param headerMap * 请求头 * @return 响应文本 */ public static String getUU(String url, Map headerMap, String param) { // 请求地址,以及参数设置 HttpPost post = new HttpPost(url); SSLContext sslContext = null; try { sslContext = SSLContexts.custom().loadTrustMaterial(null, new TrustStrategy() { @Override public boolean isTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException { return true; } }).build(); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (KeyManagementException e) { e.printStackTrace(); } catch (KeyStoreException e) { e.printStackTrace(); } CloseableHttpClient client = HttpClients.custom().setSslcontext(sslContext). setSSLHostnameVerifier(new NoopHostnameVerifier()).build(); //请求超时时间设置 post.setConfig(RequestConfig.custom()// 连接超时时间 .setConnectTimeout(5000) // 请求超时时间 .setConnectionRequestTimeout(5000) // Socket读取超时时间 .setSocketTimeout(5000) // 是否允许重定向 .setRedirectsEnabled(false) .build()); //发送请求 CloseableHttpResponse response = null; try { response = client.execute(post); } catch (IOException e) { e.printStackTrace(); log.error("request error. "); } HttpEntity entity = response.getEntity(); try { if (entity != null) { //按指定编码转换结果实体为String类型 return EntityUtils.toString(entity, "UTF-8"); } } catch (IOException e) { e.printStackTrace(); } return null; } /** * 获取响应信息(String) */ public static String getRespString(HttpUriRequest request) { // 获取响应流 InputStream in = getRespInputStream(request); StringBuilder sb = new StringBuilder(); String line; BufferedReader br = new BufferedReader(new InputStreamReader(in)); try { while ((line = br.readLine()) != null) { sb.append(line); } } catch (IOException e) { e.printStackTrace(); } String str = sb.toString(); return str; } /** * 获取响应信息(InputStream) */ public static InputStream getRespInputStream(HttpUriRequest request) { // 获取响应对象 HttpResponse response = null; try { response = HttpClients.createDefault().execute(request); } catch (Exception e) { e.printStackTrace(); } if (response == null) { return null; } // 获取Entity对象 HttpEntity entity = response.getEntity(); // 获取响应信息流 InputStream in = null; if (entity != null) { try { in = entity.getContent(); } catch (Exception e) { e.printStackTrace(); } } return in; } /** * 退款请求微信 * @param url 请求地址 * @param data 请求数据 * @param mchId 商户id * @param isTest 是否是测试 * @return 退款结果 * @throws Exception 抛出异常 */ public static String doRefund(String url, String data,String mchId,Boolean isTest) throws Exception{ KeyStore keyStore = KeyStore.getInstance("PKCS12"); //P12文件目录 证书路径,这里需要你自己修改,linux下还是windows下的根路径 String filepath = "/mnt/data/refund/huacheng/"; System.out.println("filepath->"+filepath); FileInputStream instream = new FileInputStream(filepath+"apiclient_cert.p12"); try { keyStore.load(instream, mchId.toCharArray());//这里写密码..默认是你的MCHID } finally { instream.close(); } // Trust own CA and all self-signed certs SSLContext sslcontext = SSLContexts.custom() .loadKeyMaterial(keyStore, mchId.toCharArray())//这里也是写密码的 .build(); // Allow TLSv1 protocol only SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory( sslcontext, SSLConnectionSocketFactory.getDefaultHostnameVerifier()); CloseableHttpClient httpclient = HttpClients.custom() .setSSLSocketFactory(sslsf) .build(); try { HttpPost httpost = new HttpPost(url); // 设置响应头信息 httpost.addHeader("Connection", "keep-alive"); httpost.addHeader("Accept", "*/*"); httpost.addHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8"); httpost.addHeader("Host", "api.mch.weixin.qq.com"); httpost.addHeader("X-Requested-With", "XMLHttpRequest"); httpost.addHeader("Cache-Control", "max-age=0"); httpost.addHeader("User-Agent", "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0) "); httpost.setEntity(new StringEntity(data, "UTF-8")); CloseableHttpResponse response = httpclient.execute(httpost); try { HttpEntity entity = response.getEntity(); String jsonStr = EntityUtils.toString(response.getEntity(), "UTF-8"); log.info("请求微信退款接口返回结果:" + JSONObject.toJSONString(jsonStr)); EntityUtils.consume(entity); return jsonStr; } finally { response.close(); } } finally { httpclient.close(); } } }