發送Https請求工具

工具類:

HTTPSSecureProtocolSocketFactory.java

SoapUtil.java

測試類:Test.java

 代碼段:HTTPSSecureProtocolSocketFactory.java

package zd.record.aima.utils;
import java.io.IOException;  
import java.net.InetAddress;  
import java.net.InetSocketAddress;  
import java.net.Socket;  
import java.net.SocketAddress;  
import java.net.UnknownHostException;  
import java.security.KeyManagementException;  
import java.security.NoSuchAlgorithmException;  
import java.security.cert.CertificateException;  
import java.security.cert.X509Certificate;  
import javax.net.SocketFactory;  
import javax.net.ssl.SSLContext;  
import javax.net.ssl.TrustManager;  
import javax.net.ssl.X509TrustManager;  
import org.apache.commons.httpclient.ConnectTimeoutException;  
import org.apache.commons.httpclient.params.HttpConnectionParams;  
import org.apache.commons.httpclient.protocol.ProtocolSocketFactory;  
 
/** 
 * httpclient https 
 * 
 */  
public class HTTPSSecureProtocolSocketFactory implements ProtocolSocketFactory {//SecureProtocolSocketFactory  
    private SSLContext sslcontext = null;
     
    private SSLContext createSSLContext()
    {
        SSLContext sslcontext = null;
        try
        {
            sslcontext = SSLContext.getInstance("SSL");
            sslcontext.init(null, new TrustManager[]
            { new TrustAnyTrustManager() }, new java.security.SecureRandom());
        }
        catch (NoSuchAlgorithmException e)
        {
            e.printStackTrace();
        }
        catch (KeyManagementException e)
        {
            e.printStackTrace();
        }
        return sslcontext;
    }
 
    private SSLContext getSSLContext()
    {
        if (this.sslcontext == null)
        {
            this.sslcontext = createSSLContext();
        }
        return this.sslcontext;
    }
 
    public Socket createSocket(Socket socket, String host, int port,
            boolean autoClose) throws IOException, UnknownHostException
    {
        return getSSLContext().getSocketFactory().createSocket(socket, host,
                port, autoClose);
    }
 
    public Socket createSocket(String host, int port) throws IOException,
            UnknownHostException
    {
        return getSSLContext().getSocketFactory().createSocket(host, port);
    }
 
    public Socket createSocket(String host, int port, InetAddress clientHost,
            int clientPort) throws IOException, UnknownHostException
    {
        return getSSLContext().getSocketFactory().createSocket(host, port,
                clientHost, clientPort);
    }
 
    public Socket createSocket(String host, int port, InetAddress localAddress,
            int localPort, HttpConnectionParams params) throws IOException,
            UnknownHostException, ConnectTimeoutException
    {
        if (params == null)
        {
            throw new IllegalArgumentException("Parameters may not be null");
        }
        int timeout = params.getConnectionTimeout();
        SocketFactory socketfactory = getSSLContext().getSocketFactory();
        if (timeout == 0)
        {
            return socketfactory.createSocket(host, port, localAddress,
                    localPort);
        }
        else
        {
            Socket socket = socketfactory.createSocket();
            SocketAddress localaddr = new InetSocketAddress(localAddress,
                    localPort);
            SocketAddress remoteaddr = new InetSocketAddress(host, port);
            socket.bind(localaddr);
            socket.connect(remoteaddr, timeout);
            return socket;
        }
    }
 
    // 自定義私有類
    private static class TrustAnyTrustManager implements X509TrustManager
    {
 
        public void checkClientTrusted(X509Certificate[] chain, String authType)
                throws CertificateException
        {
        }
 
        public void checkServerTrusted(X509Certificate[] chain, String authType)
                throws CertificateException
        {
        }
 
        public X509Certificate[] getAcceptedIssuers()
        {
            return new X509Certificate[]
            {};
        }
    }
   
}

代碼段:SoapUtil.java

package zd.record.aima.utils;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
 
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.UsernamePasswordCredentials;
import org.apache.commons.httpclient.auth.AuthScope;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.methods.StringRequestEntity;
import org.apache.commons.httpclient.protocol.Protocol;
/**
 * 資源地址:https://blog.csdn.net/weixin_33830216/article/details/88939129
 * @author edz
 *
 */
 
public class SoapUtil {
 
    /**  
        * <p>Description: 根據請求報文,請求服務地址獲取 響應報文  
         * @param requestSoap  請求報文  
         * @param serviceAddress 請求地址  
         * @param charSet 字符集  utf-8
         * @param contentType  類型  text/xml; charset=utf-8
         * @return  map封裝的 服務器響應參數和返回報文.PS:statusCode :200正常響應。responseSoap:響應報文   
         * <p>thinking: </p>  
         *  
         * @author  
         */
      public  static Map<String,Object> responseSoap(String requestSoap,String serviceAddress,String charSet, String contentType){  
          String responseSoap="";  
          Map<String,Object> resultmap=new HashMap<String,Object>();  
          PostMethod postMethod = new PostMethod(serviceAddress);  
          HttpClient httpClient = new HttpClient();  
          Protocol myhttps = new Protocol("https", new HTTPSSecureProtocolSocketFactory(), 443);//支持https
          Protocol.registerProtocol("https", myhttps);
          int statusCode = 0;  
          try {  
              httpClient.getState().setCredentials(AuthScope.ANY, new UsernamePasswordCredentials("USERNAME", "PASSWORD"));//設置用戶名密碼,如果不需要就忽略這一行
              StringRequestEntity entity = new StringRequestEntity(requestSoap,contentType,charSet);
              postMethod.setRequestEntity(entity);  
              statusCode = httpClient.executeMethod(postMethod);  
              resultmap.put("statusCode", statusCode);  
          } catch (IOException e) {  
              throw new RuntimeException("執行http請求失敗", e);  
          }  
          if (statusCode == 200) {  
              try {  
                responseSoap = postMethod.getResponseBodyAsString();  
                resultmap.put("responseSoap", responseSoap);  
              } catch (IOException e) {  
                  throw new RuntimeException("獲取請求返回報文失敗", e);  
              }  
          } else {  
              throw new RuntimeException("請求失敗:" + statusCode);  
          }  
          return resultmap;  
      }  
      
      
      public static void main(String[] args) {
    	 Map<String,Object> map =  responseSoap("q=123","https://baike.baidu.com/item/404%E7%8A%B6%E6%80%81%E7%A0%81/12678394","utf-8","text/html;charset=utf-8");
	     System.out.println("code="+map.get("statusCode"));
	     System.out.println("responseSoap="+map.get("responseSoap"));
      }
}

代碼段:Test.java

package zd.record.aima;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;

import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.methods.StringRequestEntity;
import org.apache.commons.httpclient.params.HttpConnectionParams;
import org.apache.commons.httpclient.protocol.Protocol;
import org.apache.commons.io.FileUtils;
import org.apache.commons.lang3.exception.ExceptionUtils;

import zd.record.aima.utils.HTTPSSecureProtocolSocketFactory;

public class Test {

	private static File f = new File("D:\\test\\3.txt");

	public static void main(String[] args) throws IOException {
		SimpleDateFormat timeSf = new SimpleDateFormat("HHmmssSSS");
		SimpleDateFormat dateSf = new SimpleDateFormat("yyyyMMdd");

		SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS");

		Date date = new Date();

		String tranDate = dateSf.format(date);
		String tranTime = timeSf.format(date);

		//String id = "AMYQHL.y.0302";
		String id = "AMYQHL2.y.0302";
		String packageId = tranDate + tranTime;

		String url = "http://192.168.11.100:448/servlet/ICBCCMPAPIReqServlet?userID=" + id + "&PackageID=" + packageId
				+ "&SendTime=" + tranTime;

		url = "http://192.168.11.100:1448";
		String action = "servlet/ICBCCMPAPIReqServlet?userID=" + id + "&PackageID=" + packageId + "&SendTime="
				+ tranTime;

		// action = "servlet/ICBCCMPAPIReqServlet";

		String xml = "<?xml version=\"1.0\" encoding = \"GBK\"?>" + "<CMS><eb><pub><TransCode>QHISD</TransCode>"
				+ "<CIS>030290002048484</CIS>" + "<BankCode>102</BankCode>" + "<ID>AMYQHL2.y.0302</ID>" + "<TranDate>"
				+ tranDate + "</TranDate>" + "<TranTime>" + tranTime + "</TranTime" + "><fSeqno>" + packageId
				+ "</fSeqno>" + "</pub>" + "<in>" + "<AccNo>0302095119300333848</AccNo>"
				+ "<BeginDate>20191024</BeginDate>" + "<EndDate>20191024</EndDate>" + "<MinAmt>0</MinAmt>"
				+ "<MaxAmt>99999999999999999</MaxAmt>" + "<NextTag></NextTag>" + "<ReqReserved1></ReqReserved1>"
				+ "<ReqReserved2></ReqReserved2></in></eb></CMS>";

		String param = "Version=0.0.0.1&TransCode=QHISD&BankCode=102&GroupCIS=030290002048484&ID=" + id + "&PackageID="
				+ packageId + "&Cert=&reqData=" + xml;

		FileUtils.write(f,
				"時間:" + sf.format(date) + ", packageId:" + packageId + ", url:" + url + ", param:" + param + "\r\n",
				true);

		String postAAA = postAAA(url + "/" + action, param, url + "/" + action);
		FileUtils.write(f, "返回數據:" + postAAA + "\r\n", true);
	}

	public static String postAAA(String url, String param, String action) throws IOException {
		HttpClient client = new HttpClient();
		
		/*Protocol myhttps = new Protocol("https", new HTTPSSecureProtocolSocketFactory(), 443);//支持https
        Protocol.registerProtocol("https", myhttps);*/
        
		client.getParams().setParameter(HttpConnectionParams.CONNECTION_TIMEOUT, 20 * 1000);
		client.getParams().setParameter(HttpConnectionParams.SO_TIMEOUT, 20 * 1000);

		PostMethod postReq = new PostMethod(url);
		postReq.addRequestHeader("Content-Type", "application/x-www-form-urlencoded");
		postReq.addRequestHeader("Content-length", param.getBytes("UTF-8").length + "");

		//postReq.addParameter("action", action);

		// postReq.setPath(action);

		// postReq.setURI(uri);

		StringRequestEntity requestEntity = null;
		try {
			requestEntity = new StringRequestEntity(param, "application/x-www-form-urlencoded", "utf-8");
		} catch (Exception e) {
			FileUtils.write(f, "錯誤1:" + ExceptionUtils.getStackTrace(e) + "\r\n", true);
		}
		postReq.setRequestEntity(requestEntity);

		try {
			client.executeMethod(postReq);
			System.out.println("響應碼="+ postReq.getStatusCode());
			if (postReq != null && postReq.getStatusCode() == 200) {
				String responseStr = postReq.getResponseBodyAsString().trim();
				return responseStr;
			}
		} catch (Throwable e) {
			FileUtils.write(f, "錯誤2:" + ExceptionUtils.getStackTrace(e) + "\r\n", true);
		} finally {
			postReq.releaseConnection();
		}

		return null;
	}
}

用到的jar包:

參考鏈接:https://blog.csdn.net/weixin_33830216/article/details/88939129

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章