From 764d883b5ea3bdc06abbec548b6df0511e567978 Mon Sep 17 00:00:00 2001
From: linwe <872216996@qq.com>
Date: Tue, 03 Sep 2024 09:46:05 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/binlog' into binlog
---
src/main/java/org/springblade/common/utils/HttpClientUtils.java | 597 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 597 insertions(+), 0 deletions(-)
diff --git a/src/main/java/org/springblade/common/utils/HttpClientUtils.java b/src/main/java/org/springblade/common/utils/HttpClientUtils.java
new file mode 100644
index 0000000..8e27f08
--- /dev/null
+++ b/src/main/java/org/springblade/common/utils/HttpClientUtils.java
@@ -0,0 +1,597 @@
+package org.springblade.common.utils;
+
+import com.alibaba.fastjson.JSON;
+import org.apache.http.HttpEntity;
+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.HttpGet;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.client.utils.URIBuilder;
+import org.apache.http.config.Registry;
+import org.apache.http.config.RegistryBuilder;
+import org.apache.http.conn.socket.ConnectionSocketFactory;
+import org.apache.http.conn.socket.PlainConnectionSocketFactory;
+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.*;
+import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
+import org.apache.http.message.BasicNameValuePair;
+import org.apache.http.ssl.SSLContextBuilder;
+import org.apache.http.util.EntityUtils;
+import sun.misc.BASE64Encoder;
+
+import javax.net.ssl.SSLContext;
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.OutputStreamWriter;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.security.KeyManagementException;
+import java.security.KeyStoreException;
+import java.security.NoSuchAlgorithmException;
+import java.security.cert.CertificateException;
+import java.security.cert.X509Certificate;
+import java.util.*;
+
+
+public class HttpClientUtils {
+ /**
+ * 执行有参GET请求
+ *
+ * @param url
+ * @param params
+ * @return
+ */
+ public static String doGet(String url, Map<String, String> params) {
+
+//获取httpclient客户端
+ CloseableHttpClient httpclient = HttpClients.createDefault();
+
+ String resultString = "";
+
+ CloseableHttpResponse response = null;
+
+ try {
+ URIBuilder builder = new URIBuilder(url);
+
+ if (null != params) {
+ for (String key : params.keySet()) {
+ builder.setParameter(key, params.get(key));
+ }
+ }
+
+ HttpGet get = new HttpGet(builder.build());
+
+ response = httpclient.execute(get);
+
+ System.out.println(response.getStatusLine());
+
+ if (200 == response.getStatusLine().getStatusCode()) {
+ HttpEntity entity = response.getEntity();
+ resultString = EntityUtils.toString(entity, "utf-8");
+ }
+
+ } catch (Exception e) {
+
+ e.printStackTrace();
+ } finally {
+ if (null != response) {
+ try {
+ response.close();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ if (null != httpclient) {
+ try {
+ httpclient.close();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+
+ return resultString;
+ }
+
+ /**
+ * 执行有参GET请求,带请求头
+ *
+ * @param url 请求url
+ * @param params 参数
+ * @param key 请求头Key
+ * @param secretKey 秘钥
+ * @return
+ */
+ public static String doGetHeader(String url, String key, String secretKey, Map<String, String> params) {
+
+//获取httpclient客户端
+ CloseableHttpClient httpclient = HttpClients.createDefault();
+
+ String resultString = "";
+
+ CloseableHttpResponse response = null;
+
+ try {
+ URIBuilder builder = new URIBuilder(url);
+
+ if (null != params) {
+ for (String keys : params.keySet()) {
+ builder.addParameter(keys, params.get(keys));
+//builder.setParameter(keys, params.get(keys));
+ }
+ }
+
+ HttpGet httpGet = new HttpGet(builder.build());
+
+//设置请求头
+ httpGet.addHeader(key, secretKey);
+// 传输的类型
+ httpGet.addHeader("Content-Type", "application/x-www-form-urlencoded");
+//执行Http请求调用
+ response = httpclient.execute(httpGet);
+//判断是否请求成功返回
+ if (200 == response.getStatusLine().getStatusCode()) {
+ HttpEntity entity = response.getEntity();
+ resultString = EntityUtils.toString(entity, "utf-8");
+ }
+
+ } catch (Exception e) {
+ e.printStackTrace();
+ } finally {
+ if (null != response) {
+ try {
+ response.close();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ if (null != httpclient) {
+ try {
+ httpclient.close();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+
+ return resultString;
+ }
+
+ /**
+ * 执行有参GET请求,带请求头,接收图片流
+ *
+ * @param url 请求url
+ * @param params 参数
+ * @param key 请求头Key
+ * @param secretKey 秘钥
+ * @return
+ */
+ public static String doGetHeaderPictureBase64(String url, String key, String secretKey, Map<String, String> params) {
+
+//获取httpclient客户端
+ CloseableHttpClient httpclient = HttpClients.createDefault();
+ String resultString = "";
+ CloseableHttpResponse response = null;
+ try {
+ URIBuilder builder = new URIBuilder(url);
+ if (null != params) {
+ for (String keys : params.keySet()) {
+ builder.addParameter(keys, params.get(keys));
+ }
+ }
+ HttpGet httpGet = new HttpGet(builder.build());
+//设置请求头
+ httpGet.addHeader(key, secretKey);
+// 传输的类型
+ httpGet.addHeader("Content-Type", "application/x-www-form-urlencoded");
+//执行Http请求调用
+ response = httpclient.execute(httpGet);
+// 将返回的图片或者文件转化成字节数组的形式
+ byte[] data = EntityUtils.toByteArray(response.getEntity());
+ BASE64Encoder encoder = new BASE64Encoder();
+//String imageBase64 = "data:image/png;base64," + encoder.encodeBuffer(data).trim();
+ return encoder.encodeBuffer(data).trim().replaceAll("\n", "").replaceAll("\r", "").replaceAll(" ", "");//删除 \r\n
+ } catch (Exception e) {
+ e.printStackTrace();
+ } finally {
+ if (null != response) {
+ try {
+ response.close();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ if (null != httpclient) {
+ try {
+ httpclient.close();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+ return resultString;
+ }
+
+ /**
+ * 执行无参GET请求
+ *
+ * @param url
+ * @return
+ */
+ public static String doGet(String url) {
+ return doGet(url, null);
+ }
+
+ /**
+ * 执行有参POST请求
+ *
+ * @param url
+ * @param params
+ * @return
+ */
+ public static String doPost(String url, Map<String, String> params) {
+/**
+ * 在4.0及以上httpclient版本中,post需要指定重定向的策略,如果不指定则按默认的重定向策略。
+ *
+ * 获取httpclient客户端
+ */
+ CloseableHttpClient httpclient = HttpClientBuilder.create().setRedirectStrategy(new LaxRedirectStrategy()).build();
+
+ String resultString = "";
+
+ CloseableHttpResponse response = null;
+
+ try {
+
+
+ HttpPost post = new HttpPost(url);
+
+ List<NameValuePair> paramaters = new ArrayList<>();
+
+ if (null != params) {
+ for (String key : params.keySet()) {
+ paramaters.add(new BasicNameValuePair(key, params.get(key)));
+ }
+// 构造一个form表单式的实体
+ UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(paramaters);
+// 将请求实体设置到httpPost对象中
+ post.setEntity(formEntity);
+ }
+
+
+/**
+ * HTTP/1.1 403 Forbidden
+ * 原因:
+ * 有些网站,设置了反爬虫机制
+ * 解决的办法:
+ * 设置请求头,伪装浏览器
+ */
+ post.addHeader("user-agent", "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36");
+
+ response = httpclient.execute(post);
+
+ System.out.println(response.getStatusLine());
+
+ if (200 == response.getStatusLine().getStatusCode()) {
+ HttpEntity entity = response.getEntity();
+ resultString = EntityUtils.toString(entity, "utf-8");
+ }
+
+ } catch (Exception e) {
+
+ e.printStackTrace();
+ } finally {
+ if (null != response) {
+ try {
+ response.close();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ if (null != httpclient) {
+ try {
+ httpclient.close();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+ return resultString;
+ }
+
+ public static String doPost(String url) {
+ return doPost(url, null);
+ }
+
+
+ public static void main(String[] args) {
+
+ Map<String, String> params = new HashMap<>();
+ params.put("scope", "project");
+ params.put("q", "数据库");
+//
+// System.out.println(doGet("http://www.baidu.com/s",params));
+
+ /**
+ * 有一部分网站,禁止爬虫技术访问网站。
+ *
+ * 解决方案:
+ * 伪装浏览器
+ * post.addHeader("user-agent", "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36");
+ */
+ System.out.println(doPost("http://www.oschina.net/search", params));
+ }
+
+ /**
+ * post 请求 header 带 秘钥
+ *
+ * @param url
+ * @param appKey
+ * @param appKeyValue
+ * @param map
+ * @return
+ */
+ public static String httpPost(String url, String appKey, String appKeyValue, Map<String, String> map) {
+// 返回body
+ String body = null;
+// 获取连接客户端工具
+ CloseableHttpClient httpClient = HttpClients.createDefault();
+ CloseableHttpResponse httpResponse = null;
+// 2、创建一个HttpPost请求
+ HttpPost post = new HttpPost(url);
+// 5、设置header信息
+ /**header中通用属性*/
+// post.setHeader("Accept", "*/*");
+// post.setHeader("Accept-Encoding", "gzip, deflate");
+// post.setHeader("Cache-Control", "no-cache");
+// post.setHeader("Connection", "keep-alive");
+ post.setHeader("Content-Type", "application/json;charset=UTF-8");
+/**业务参数*/
+ post.setHeader(appKey, appKeyValue);
+// 设置参数
+ if (map != null) {
+ try {
+ StringEntity entity1 = new StringEntity(JSON.toJSONString(map), "UTF-8");
+ entity1.setContentEncoding("UTF-8");
+ entity1.setContentType("json/form-data");
+ post.setEntity(entity1);
+
+// 7、执行post请求操作,并拿到结果
+ httpResponse = httpClient.execute(post);
+// 获取结果实体
+ HttpEntity entity = httpResponse.getEntity();
+ if (entity != null) {
+// 按指定编码转换结果实体为String类型
+ body = EntityUtils.toString(entity, "UTF-8");
+ }
+ try {
+ httpResponse.close();
+ httpClient.close();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ return body;
+ }
+
+ public static SSLContext createIgnoreVerifySSL() throws KeyManagementException, NoSuchAlgorithmException, KeyStoreException {
+
+ SSLContext sc = new SSLContextBuilder().loadTrustMaterial(null, new TrustStrategy() {
+
+ public boolean isTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {
+ return true;
+ }
+
+ }).build();
+
+ return sc;
+ }
+
+ //适用于post请求并传送form-data数据(同样适用于post的Raw类型的application-json格式)
+ public static String postParams(String url, String appKey, Map<String, String> map) {
+ SSLContext sslcontext = null;
+ try {
+ sslcontext = createIgnoreVerifySSL();
+ } catch (KeyManagementException e) {
+ e.printStackTrace();
+ } catch (NoSuchAlgorithmException e) {
+ e.printStackTrace();
+ } catch (KeyStoreException e) {
+ e.printStackTrace();
+ }
+// 设置协议http和https对应的处理socket链接工厂的对象
+ Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory>create()
+ .register("http", PlainConnectionSocketFactory.INSTANCE)
+ .register("https", new SSLConnectionSocketFactory(sslcontext))
+ .build();
+ PoolingHttpClientConnectionManager connManager = new PoolingHttpClientConnectionManager(socketFactoryRegistry);
+
+//创建自定义的httpclient对象
+ CloseableHttpClient client = HttpClients.custom().setConnectionManager(connManager).build();
+ HttpPost post = new HttpPost(url);
+ post.setHeader("appKey", appKey);
+ CloseableHttpResponse res = null;
+ try {
+ List<NameValuePair> nvps = new ArrayList<NameValuePair>();
+ Set<String> keySet = map.keySet();
+ for (String key : keySet) {
+ nvps.add(new BasicNameValuePair(key, map.get(key)));
+ }
+ post.setEntity(new UrlEncodedFormEntity(nvps, "utf-8"));
+ res = client.execute(post);
+ HttpEntity entity = res.getEntity();
+ return EntityUtils.toString(entity, "utf-8");
+ } catch (Exception e) {
+ e.printStackTrace();
+ } finally {
+ try {
+ res.close();
+ client.close();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ return "";
+ }
+
+
+ //适用于post请求并传送form-data数据(同样适用于post的Raw类型的application-json格式)
+ public static String postParams(String url, Map<String, Object> map) {
+ SSLContext sslcontext = null;
+ try {
+ sslcontext = createIgnoreVerifySSL();
+ } catch (KeyManagementException e) {
+ e.printStackTrace();
+ } catch (NoSuchAlgorithmException e) {
+ e.printStackTrace();
+ } catch (KeyStoreException e) {
+ e.printStackTrace();
+ }
+// 设置协议http和https对应的处理socket链接工厂的对象
+ Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory>create()
+ .register("http", PlainConnectionSocketFactory.INSTANCE)
+ .register("https", new SSLConnectionSocketFactory(sslcontext))
+ .build();
+ PoolingHttpClientConnectionManager connManager = new PoolingHttpClientConnectionManager(socketFactoryRegistry);
+
+//创建自定义的httpclient对象
+ CloseableHttpClient client = HttpClients.custom().setConnectionManager(connManager).build();
+ HttpPost post = new HttpPost(url);
+// post.setHeader(appKey, appKeyValue);
+ CloseableHttpResponse res = null;
+ try {
+ List<NameValuePair> nvps = new ArrayList<NameValuePair>();
+ Set<String> keySet = map.keySet();
+ for (String key : keySet) {
+ nvps.add(new BasicNameValuePair(key, map.get(key).toString()));
+ }
+ post.setEntity(new UrlEncodedFormEntity(nvps, "utf-8"));
+ res = client.execute(post);
+ HttpEntity entity = res.getEntity();
+ return EntityUtils.toString(entity, "utf-8");
+ } catch (Exception e) {
+ e.printStackTrace();
+ } finally {
+ try {
+ res.close();
+ client.close();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ return "";
+ }
+
+ /**
+ * 向指定 URL 发送POST方法的请求
+ *
+ * @param url 发送请求的 URL
+ * @param params 请求的参数集合
+ * @return 远程资源的响应结果
+ */
+ @SuppressWarnings("unused")
+ public static String sendPost(String url, Map<String, String> params) {
+ OutputStreamWriter out = null;
+ BufferedReader in = null;
+ StringBuilder result = new StringBuilder();
+ try {
+ URL realUrl = new URL(url);
+ HttpURLConnection conn = (HttpURLConnection) realUrl.openConnection();
+// 发送POST请求必须设置如下两行
+ conn.setDoOutput(true);
+ conn.setDoInput(true);
+// POST方法
+ conn.setRequestMethod("POST");
+// 设置通用的请求属性
+ conn.setRequestProperty("accept", "*/*");
+ conn.setRequestProperty("connection", "Keep-Alive");
+ conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
+ conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
+ conn.connect();
+// 获取URLConnection对象对应的输出流
+ out = new OutputStreamWriter(conn.getOutputStream(), "UTF-8");
+// 发送请求参数
+ if (params != null) {
+ StringBuilder param = new StringBuilder();
+ for (Map.Entry<String, String> entry : params.entrySet()) {
+ if (param.length() > 0) {
+ param.append("&");
+ }
+ param.append(entry.getKey());
+ param.append("=");
+ param.append(entry.getValue());
+// System.out.println(entry.getKey()+":"+entry.getValue());
+ }
+// System.out.println("param:"+param.toString());
+ out.write(param.toString());
+ }
+// flush输出流的缓冲
+ out.flush();
+// 定义BufferedReader输入流来读取URL的响应
+ in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8"));
+ String line;
+ while ((line = in.readLine()) != null) {
+ result.append(line);
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+// 使用finally块来关闭输出流、输入流
+ finally {
+ try {
+ if (out != null) {
+ out.close();
+ }
+ if (in != null) {
+ in.close();
+ }
+ } catch (IOException ex) {
+ ex.printStackTrace();
+ }
+ }
+ return result.toString();
+ }
+
+
+ /**
+ * json body
+ *
+ * @param url
+ * @param json
+ * @return
+ * @throws IOException
+ */
+ public static String httpPostWithjson(String url, String json) throws IOException {
+ String result = "";
+ HttpPost httpPost = new HttpPost(url);
+ CloseableHttpClient httpClient = HttpClients.createDefault();
+ try {
+ BasicResponseHandler handler = new BasicResponseHandler();
+ //解决中文乱码问题
+ StringEntity entity = new StringEntity(json, "utf-8");
+ entity.setContentEncoding("UTF-8");
+ entity.setContentType("application/json");
+ httpPost.setEntity(entity);
+ result = httpClient.execute(httpPost, handler);
+ return result;
+ } catch (Exception e) {
+ e.printStackTrace();
+ } finally {
+ try {
+ httpClient.close();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ return result;
+ }
+}
+
+
--
Gitblit v1.9.3