content: package com.xxl.job.core.util;
  
  import com.xxl.job.core.biz.model.ReturnT;
  import org.slf4j.Logger;
  import org.slf4j.LoggerFactory;
  
  import javax.net.ssl.*;
  import java.io.BufferedReader;
  import java.io.DataOutputStream;
  import java.io.InputStreamReader;
  import java.net.HttpURLConnection;
  import java.net.URL;
  import java.security.cert.CertificateException;
  import java.security.cert.X509Certificate;
  import java.util.Map;
  
  /**
   * @author xuxueli 2018-11-25 00:55:31
   */
  public class XxlJobRemotingUtil {
      private static Logger logger = LoggerFactory.getLogger(XxlJobRemotingUtil.class);
      public static final String XXL_JOB_ACCESS_TOKEN = "XXL-JOB-ACCESS-TOKEN";
  
  
      // trust-https start
      private static void trustAllHosts(HttpsURLConnection connection) {
          try {
              SSLContext sc = SSLContext.getInstance("TLS");
              sc.init(null, trustAllCerts, new java.security.SecureRandom());
              SSLSocketFactory newFactory = sc.getSocketFactory();
  
              connection.setSSLSocketFactory(newFactory);
          } catch (Exception e) {
              logger.error(e.getMessage(), e);
          }
          connection.setHostnameVerifier(new HostnameVerifier() {
              public boolean verify(String hostname, SSLSession session) {
                  return true;
              }
          });
      }
      private static final TrustManager[] trustAllCerts = new TrustManager[]{new X509TrustManager() {
          public java.security.cert.X509Certificate[] getAcceptedIssuers() {
              return new java.security.cert.X509Certificate[]{};
          }
          public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
          }
          public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
          }
      }};
      // trust-https end
  
  
      /**
       * post
       *
       * @param url
       * @param accessToken
       * @param timeout
       * @param requestObj
       * @param returnTargClassOfT
       * @return
       */
      public static ReturnT postBody(String url, String accessToken, int timeout, Object requestObj, Class returnTargClassOfT) {
          HttpURLConnection connection = null;
          BufferedReader bufferedReader = null;
          try {
              // connection
              URL realUrl = new URL(url);
              connection = (HttpURLConnection) realUrl.openConnection();
  
              // trust-https
              boolean useHttps = url.startsWith("https");
              if (useHttps) {
                  HttpsURLConnection https = (HttpsURLConnection) connection;
                  trustAllHosts(https);
              }
  
              // connection setting
              connection.setRequestMethod("POST");
              connection.setDoOutput(true);
              connection.setDoInput(true);
              connection.setUseCaches(false);
              connection.setReadTimeout(timeout * 1000);
              connection.setConnectTimeout(3 * 1000);
              connection.setRequestProperty("connection", "Keep-Alive");
              connection.setRequestProperty("Content-Type", "application/json;charset=UTF-8");
              connection.setRequestProperty("Accept-Charset", "application/json;charset=UTF-8");
  
              if(accessToken!=null && accessToken.trim().length()>0){
                  connection.setRequestProperty(XXL_JOB_ACCESS_TOKEN, accessToken);
              }
  
              // do connection
              connection.connect();
  
              // write requestBody
              if (requestObj != null) {
                  String requestBody = GsonTool.toJson(requestObj);
  
                  DataOutputStream dataOutputStream = new DataOutputStream(connection.getOutputStream());
                  dataOutputStream.write(requestBody.getBytes("UTF-8"));
                  dataOutputStream.flush();
                  dataOutputStream.close();
              }
  
              /*byte[] requestBodyBytes = requestBody.getBytes("UTF-8");
              connection.setRequestProperty("Content-Length", String.valueOf(requestBodyBytes.length));
              OutputStream outwritestream = connection.getOutputStream();
              outwritestream.write(requestBodyBytes);
              outwritestream.flush();
              outwritestream.close();*/
  
              // valid StatusCode
              int statusCode = connection.getResponseCode();
              if (statusCode != 200) {
                  return new ReturnT<String>(ReturnT.FAIL_CODE, "xxl-rpc remoting fail, StatusCode("+ statusCode +") invalid. for url : " + url);
              }
  
              // result
              bufferedReader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
              StringBuilder result = new StringBuilder();
              String line;
              while ((line = bufferedReader.readLine()) != null) {
                  result.append(line);
              }
              String resultJson = result.toString();
  
              // parse returnT
              try {
                  ReturnT returnT = GsonTool.fromJson(resultJson, ReturnT.class, returnTargClassOfT);
                  return returnT;
              } catch (Exception e) {
                  logger.error("xxl-rpc remoting (url="+url+") response content invalid("+ resultJson +").", e);
                  return new ReturnT<String>(ReturnT.FAIL_CODE, "xxl-rpc remoting (url="+url+") response content invalid("+ resultJson +").");
              }
  
          } catch (Exception e) {
              logger.error(e.getMessage(), e);
              return new ReturnT<String>(ReturnT.FAIL_CODE, "xxl-rpc remoting error("+ e.getMessage() +"), for url : " + url);
          } finally {
              try {
                  if (bufferedReader != null) {
                      bufferedReader.close();
                  }
                  if (connection != null) {
                      connection.disconnect();
                  }
              } catch (Exception e2) {
                  logger.error(e2.getMessage(), e2);
              }
          }
      }
  
  }
  