package com.jackrain.nea.dm.utility;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.jackrain.nea.exception.NDSException;
import lombok.extern.log4j.Log4j;
import org.apache.http.Header;
import org.apache.http.HttpStatus;
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.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicHeader;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
import org.springframework.stereotype.Component;
import org.springframework.util.ResourceUtils;
import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.InetAddress;
import java.net.URI;
import java.net.UnknownHostException;
import java.util.*;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import static com.udojava.evalex.Expression.e;
import static org.bouncycastle.asn1.ua.DSTU4145NamedCurves.params;
@Log4j
@Component
public class HttpClientUtils {
// 默认字符集
private static final String ENCODING = "UTF-8";
/**
* @param url 请求地址
* @param headers 请求头
* @param data 请求实体
* @param encoding 字符集
* @return String
* @throws
* @Title: sendPost
* @Description: TODO(发送post请求)
*/
public static String sendPost(String url, Map headers, JSONObject data, String encoding) {
log.info("进入post请求方法...");
log.info("请求入参:URL= " + url);
log.info("请求入参:headers=" + JSON.toJSONString(headers));
log.info("请求入参:data=" + JSON.toJSONString(data));
// 请求返回结果
String resultJson = null;
// 创建Client
CloseableHttpClient client = HttpClients.createDefault();
// 创建HttpPost对象
HttpPost httpPost = new HttpPost();
// RequestConfig requestConfig = RequestConfig.custom()
//
// .setConnectTimeout(50000).setConnectionRequestTimeout(10000)
//
// .setSocketTimeout(50000).build();
//
// httpPost.setConfig(requestConfig);
try {
// 设置请求地址
httpPost.setURI(new URI(url));
// 设置请求头
if (headers != null) {
Header[] allHeader = new BasicHeader[headers.size()];
int i = 0;
for (Map.Entry entry : headers.entrySet()) {
allHeader[i] = new BasicHeader(entry.getKey(), entry.getValue());
i++;
}
httpPost.setHeaders(allHeader);
}
// 创建请求参数
List list = new LinkedList<>();
BasicNameValuePair param = new BasicNameValuePair("param", data.getString("param"));
list.add(param);
// 使用URL实体转换工具
UrlEncodedFormEntity entityParam = new UrlEncodedFormEntity(list, "UTF-8");
httpPost.setEntity(entityParam);
// 发送请求,返回响应对象
long http = System.currentTimeMillis();
log.debug("POS--HTTP请求开始" + http);
CloseableHttpResponse response = client.execute(httpPost);
double durationHttp = (int) ((System.currentTimeMillis() - http) / 1000.0);
log.debug("POS--HTTP请求结束" + System.currentTimeMillis() + "HTTP请求耗时耗时:" + durationHttp);
// 获取响应状态
int status = response.getStatusLine().getStatusCode();
if (status == HttpStatus.SC_OK) {
// 获取响应结果
resultJson = EntityUtils.toString(response.getEntity(), encoding);
} else {
log.error("响应失败,状态码:" + status);
}
} catch (Exception e) {
log.error("发送post请求失败", e);
} finally {
httpPost.releaseConnection();
}
return resultJson;
}
/**
* @param url 请求地址
* @param data 请求实体
* @return String
* @throws
* @Title: sendPost
* @Description: TODO(发送post请求 , 请求数据默认使用json格式 , 默认使用UTF - 8编码)
* @author wangxy
* @date 2018年5月10日 下午4:37:28
*/
public static String sendPost(String url, JSONObject data) {
// 设置默认请求头
Map headers = new HashMap<>();
headers.put("content-type", "application/x-www-form-urlencoded");
return sendPost(url, headers, data, ENCODING);
}
/**
* @param url 请求地址
* @param params 请求实体
* @return String
* @throws
* @Title: sendPost
* @Description: TODO(发送post请求 , 请求数据默认使用json格式 , 默认使用UTF - 8编码)
* @author wangxy
* @date 2018年5月10日 下午6:11:05
*/
public static String sendPost(String url, Map params) {
// 设置默认请求头
Map headers = new HashMap<>();
headers.put("content-type", "application/json");
// 将map转成json
JSONObject data = JSONObject.parseObject(JSON.toJSONString(params));
return sendPost(url, headers, data, ENCODING);
}
/**
* @param url 请求地址
* @param headers 请求头
* @param data 请求实体
* @return String
* @throws
* @Title: sendPost
* @Description: TODO(发送post请求 , 请求数据默认使用UTF - 8编码)
* @author wangxy
* @date 2018年5月10日 下午4:39:03
*/
public static String sendPost(String url, Map headers, JSONObject data) {
return sendPost(url, headers, data, ENCODING);
}
/**
* @param url 请求地址
* @param headers 请求头
* @param params 请求实体
* @return String
* @throws
* @Title: sendPost
* @Description:(发送post请求,请求数据默认使用UTF-8编码)
* @author wangxy
* @date 2018年5月10日 下午5:58:40
*/
public static String sendPost(String url, Map headers, Map params) {
// 将map转成json
JSONObject data = JSONObject.parseObject(JSON.toJSONString(params));
return sendPost(url, headers, data, ENCODING);
}
/**
* @param url 请求地址
* @param params 请求参数
* @param encoding 编码
* @return String
* @throws
* @Title: sendGet
* @Description: TODO(发送get请求)
* @author wangxy
* @date 2018年5月14日 下午2:39:01
*/
public static String sendGet(String url, Map params, String encoding) {
log.info("进入get请求方法...");
log.info("请求入参:URL= " + url);
log.info("请求入参:params=" + JSON.toJSONString(params));
// 请求结果
String resultJson = null;
// 创建client
CloseableHttpClient client = HttpClients.createDefault();
// 创建HttpGet
HttpGet httpGet = new HttpGet();
try {
// 创建uri
URIBuilder builder = new URIBuilder(url);
// 封装参数
if (params != null) {
for (String key : params.keySet()) {
builder.addParameter(key, params.get(key).toString());
}
}
URI uri = builder.build();
log.info("请求地址:" + uri);
// 设置请求地址
httpGet.setURI(uri);
// 发送请求,返回响应对象
CloseableHttpResponse response = client.execute(httpGet);
// 获取响应状态
int status = response.getStatusLine().getStatusCode();
if (status == HttpStatus.SC_OK) {
// 获取响应数据
resultJson = EntityUtils.toString(response.getEntity(), encoding);
} else {
log.error("响应失败,状态码:" + status);
}
} catch (Exception e) {
log.error("发送get请求失败", e);
} finally {
httpGet.releaseConnection();
}
return resultJson;
}
/**
* 获取 DB文件
*
* @param url 请求地址
* @return boolean
* @throws
* @Title: sendGet
* @Description: TODO(发送get请求)
* @author wangxy
* @date 2018年5月14日 下午2:39:01
*/
public static String sendGet(String url, String flieName) {
log.info("进入get请求方法...");
log.info("请求入参:URL= " + url);
log.info("请求入参:FlieName= " + flieName);
// 请求结果
// String resultJson = null;
InputStream in = null;
FileOutputStream fout = null;
// 创建client
CloseableHttpClient client = HttpClients.createDefault();
CloseableHttpResponse response = null;
// 创建HttpGet
HttpGet httpGet = new HttpGet();
String pathName = null;
try {
// 创建uri
URIBuilder builder = new URIBuilder(url);
URI uri = builder.build();
log.info("请求地址:" + uri);
// 设置请求地址
httpGet.setURI(uri);
// 发送请求,返回响应对象
response = client.execute(httpGet);
// 获取响应状态
int status = response.getStatusLine().getStatusCode();
if (status == HttpStatus.SC_OK) {
// 获取响应数据
// resultJson = EntityUtils.toString(response.getEntity(), encoding);
in = response.getEntity().getContent();
pathName = ResourceUtils.getURL("/home/admin/").getPath();
File file = new File(pathName + flieName + ".zip");
fout = new FileOutputStream(file);
int l = -1;
byte[] tmp = new byte[1024];
while ((l = in.read(tmp)) != -1) {
fout.write(tmp, 0, l);
// 注意这里如果用OutputStream.write(buff)的话,图片会失真,大家可以试试
}
fout.flush();
fout.close();
unZip(file, pathName);
} else {
log.error("响应失败,状态码:" + status);
throw new NDSException("响应失败,状态码:" + status);
}
} catch (Exception e) {
log.error("发送get请求失败", e);
throw new NDSException(e);
} finally {
try {
if (in != null) {
in.close();
}
} catch (Exception e) {
log.error("DB文件下载失败", e);
throw new NDSException(e);
}
try {
httpGet.releaseConnection();
if (client != null) {
client.close();
}
if (response != null) {
response.close();
}
} catch (Exception e) {
log.error("HTTP 释放失败", e);
throw new NDSException(e);
}
}
return pathName + ".db";
}
/**
* zip解压
*
* @param srcFile zip源文件
* @param destDirPath 解压后的目标文件夹
* @throws RuntimeException 解压失败会抛出运行时异常
*/
public static void unZip(File srcFile, String destDirPath) throws RuntimeException {
long start = System.currentTimeMillis();
// 判断源文件是否存在
if (!srcFile.exists()) {
throw new RuntimeException(srcFile.getPath() + "所指文件不存在");
}
// 开始解压
ZipFile zipFile = null;
try {
zipFile = new ZipFile(srcFile);
Enumeration> entries = zipFile.entries();
while (entries.hasMoreElements()) {
ZipEntry entry = (ZipEntry) entries.nextElement();
System.out.println("解压" + entry.getName());
// 如果是文件夹,就创建个文件夹
if (entry.isDirectory()) {
String dirPath = destDirPath + "/" + entry.getName();
File dir = new File(dirPath);
dir.mkdirs();
} else {
// 如果是文件,就先创建一个文件,然后用io流把内容copy过去
File targetFile = new File(destDirPath + "/" + entry.getName());
// 保证这个文件的父文件夹必须要存在
if (!targetFile.getParentFile().exists()) {
targetFile.getParentFile().mkdirs();
}
targetFile.createNewFile();
// 将压缩文件内容写入到这个文件中
InputStream is = zipFile.getInputStream(entry);
FileOutputStream fos = new FileOutputStream(targetFile);
int len;
byte[] buf = new byte[1024];
while ((len = is.read(buf)) != -1) {
fos.write(buf, 0, len);
}
// 关流顺序,先打开的后关闭
fos.close();
is.close();
}
}
long end = System.currentTimeMillis();
System.out.println("解压完成,耗时:" + (end - start) + " ms");
} catch (Exception e) {
throw new RuntimeException("unzip error from ZipUtils", e);
} finally {
if (zipFile != null) {
try {
zipFile.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
/**
* @param url 请求地址
* @param params 请求参数
* @return String
* @throws
* @Title: sendGet
* @Description: TODO(发送get请求)
* @author wangxy
* @date 2018年5月14日 下午2:32:39
*/
public static String sendGet(String url, Map params) {
return sendGet(url, params, ENCODING);
}
/**
* @param url 请求地址
* @return String
* @throws
* @Title: sendGet
* @Description: TODO(发送get请求)
* @author wangxy
* @date 2018年5月14日 下午2:33:45
*/
public static String sendGet(String url) {
return sendGet(url, null, ENCODING);
}
public static void main(String[] args) {
sendGet("http://47.97.100.226:333/servlets/binserv/ExportDataDownload?downloadFileName=BOS20_1_20190411193156884.zip", "DEOMO.DB");
}
/**
* 获取IP地址
*
* @param request
* @return
*/
public static String getIpAddres(HttpServletRequest request) {
String ipAddress = request.getHeader("x-forwarded-for");
if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
ipAddress = request.getHeader("Proxy-Client-IP");
}
if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
ipAddress = request.getHeader("WL-Proxy-Client-IP");
}
if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
ipAddress = request.getRemoteAddr();
if (ipAddress.equals("127.0.0.1") || ipAddress.equals("0:0:0:0:0:0:0:1")) {
// 根据网卡取本机配置的IP
InetAddress inet = null;
try {
inet = InetAddress.getLocalHost();
} catch (UnknownHostException e) {
e.printStackTrace();
}
ipAddress = inet.getHostAddress();
}
}
// 对于通过多个代理的情况,第一个IP为客户端真实IP,多个IP按照','分割
if (ipAddress != null && ipAddress.length() > 15) { // "***.***.***.***".length()
// = 15
if (ipAddress.indexOf(",") > 0) {
ipAddress = ipAddress.substring(0, ipAddress.indexOf(","));
}
}
return ipAddress;
}
}