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+>", // This will remove empty elements that look like // // "\\s*<\\w+>\n*\\s*" }; 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; } }