工具類:
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