package com.ydtech.utils;
import com.ydtech.exception.SystemException;
import lombok.extern.slf4j.Slf4j;
import okhttp3.*;
import org.apache.commons.text.StringEscapeUtils;
import org.slf4j.Logger;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* @author gws
* @description:TODO
* @date 2022-07-13 09:52
*/
@Slf4j
public class HttpXmlUtil {
// public final static OkHttpClient client = new OkHttpClient.Builder()
// .connectTimeout(120, TimeUnit.SECONDS)
// .writeTimeout(120, TimeUnit.SECONDS)
// .readTimeout(120, TimeUnit.SECONDS)
// .build();
private static OkHttpClient client;
private static OkHttpClient getInstance() {
if (client == null) {
synchronized (OkHttpClient.class) {
if (client == null) {
client = new OkHttpClient.Builder()
.connectTimeout(60, TimeUnit.SECONDS)
.writeTimeout(360, TimeUnit.SECONDS)
.readTimeout(360, TimeUnit.SECONDS)
.dispatcher(new Dispatcher(Executors.newFixedThreadPool(20)))
.retryOnConnectionFailure(true)//设置是否开启连接失败时的重试。
//addInterceptor(Interceptor interceptor); // 添加拦截器,用于处理请求重试逻辑。
.build();
}
}
}
return client;
}
/**
* 发送xml请求到server端
*
* @param url xml请求数据地址
* @param xmlString 发送的xml数据流
* @return null发送失败,否则返回响应内容
*/
public static String sendPost(String url, String xmlString) {
System.out.println("请求参数=" + xmlString);
System.out.println("请求参数=" + XMLFormat.format(xmlString));
Response response = null;
String responseString = null;
try {
OkHttpClient client = new OkHttpClient.Builder()
.connectTimeout(60, TimeUnit.SECONDS)
.writeTimeout(60, TimeUnit.SECONDS)
.readTimeout(60, TimeUnit.SECONDS)
.build();
MediaType mediaType = MediaType.parse("text/xml");
RequestBody body = RequestBody.create(mediaType, xmlString);
Request request = new Request.Builder()
.url(url)
.post(body)
.addHeader("Content-Type", "text/xml")
.addHeader("cache-control", "no-cache")
.build();
response = client.newCall(request).execute();
if (response.isSuccessful()) {
responseString = response.body().string();
}
} catch (Exception e) {
e.printStackTrace();
} finally {
response.close();
}
System.out.println("返回参数=" + responseString);
String[] patterns = new String[]{
// This will remove empty elements that look like
"\\s*<\\w+/>",
// This will remove empty elements that look like
"\\s*<\\w+>\\w+>",
// This will remove empty elements that look like
//
//
"\\s*<\\w+>\n*\\s*\\w+>"
};
for (String pattern : patterns) {
Matcher matcher = Pattern.compile(pattern).matcher(responseString);
responseString = matcher.replaceAll("");
}
System.out.println("返回参数==" + responseString);
return responseString;
}
/**
* 发送xml请求到server端 最新
*
* @param url xml请求数据地址
* @param xmlString 发送的xml数据流
* @return
*/
public static String sendXmlPostReq(String url, String xmlString, Logger log, String textHead) {
if (null != log) {
log.debug(textHead + "XML请求url:{},\n请求参数:{}", url, xmlString);
}
String responseString = null;
Response response = null;
try {
MediaType mediaType = MediaType.parse("text/xml");
RequestBody reqBody = RequestBody.create(mediaType, xmlString);
Request request = new Request.Builder()
.url(url)
.post(reqBody)
.addHeader("Content-Type", "text/xml")
.addHeader("cache-control", "no-cache")
// .addHeader("Connection", "close")
.build();
response = getInstance().newCall(request).execute();
if (response.isSuccessful()) {
responseString = response.body().string();
}
} catch (Exception e) {
log.error(textHead + "请求异常:" + e.getMessage() + ",异常信息:" + e);
e.printStackTrace();
throw new SystemException("远程接口请求失败,请联系管理员。");
} finally {
if (null != log) {
textHead = StringUtils.toString(textHead, "123456789");
}
url = StringUtils.toString(url, "");
String responseStringMsg = StringEscapeUtils.unescapeXml(responseString);
log.debug(textHead + "XML返回url:{},\n响应参数:{}", url, responseStringMsg);
if (StringUtils.isEmpty(responseString)) {
Headers headers = response.headers();
for (int i = 0, size = headers.size(); i < size; i++) {
log.error("响应空时headers:" + headers.name(i) + ": " + headers.value(i));
}
}
response.close();
}
return responseString;
}
/**
* 发送xml请求到server端 最新
*
* @param url xml请求数据地址
* @param xmlString 发送的xml数据流
* @return
*/
public static String sendXmlPostReqBase(String url, String xmlString) {
xmlString = "tianqintianqin2023@LVHRW1851051694LVHRW1859J504009814B803261120171021\n" +
"";
String responseString = null;
Response response = null;
try {
MediaType mediaType = MediaType.parse("text/xml");
RequestBody reqBody = RequestBody.create(mediaType, xmlString);
Request request = new Request.Builder()
.url(url)
.post(reqBody)
.addHeader("Content-Type", "text/xml")
.addHeader("cache-control", "no-cache")
.build();
response = getInstance().newCall(request).execute();
if (response != null) {
if (response.isSuccessful()) {
responseString = response.body().string();
}
} else {
log.error("请求返回null");
}
} catch (Exception e) {
e.printStackTrace();
throw new SystemException("远程接口请求失败,请联系管理员。");
} finally {
if (StringUtils.isEmpty(responseString)) {
Headers headers = response.headers();
for (int i = 0, size = headers.size(); i < size; i++) {
System.err.println("headers:" + headers.name(i) + ": " + headers.value(i));
}
} else {
System.err.println("通过");
}
response.close();
}
return responseString;
}
}