package com.sumy.https; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.net.SocketTimeoutException; import java.security.KeyManagementException; import java.security.KeyStore; import java.security.KeyStoreException; import java.security.NoSuchAlgorithmException; import java.security.UnrecoverableKeyException; import java.security.cert.CertificateException; import javax.net.ssl.SSLContext; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.client.config.RequestConfig; import org.apache.http.client.methods.HttpPost; import org.apache.http.conn.ConnectTimeoutException; import org.apache.http.conn.ConnectionPoolTimeoutException; import org.apache.http.conn.ssl.SSLConnectionSocketFactory; import org.apache.http.conn.ssl.SSLContexts; import org.apache.http.entity.StringEntity; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.apache.http.util.EntityUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.thoughtworks.xstream.XStream; import com.thoughtworks.xstream.io.xml.DomDriver; import com.thoughtworks.xstream.io.xml.XmlFriendlyNameCoder; /** * 作用:Https 发送POST 请求 * * @author sumylu@globex.cn * @date 2016年6月22日 */ public class HttpsRequest implements IServiceRequest { private Logger logger = LoggerFactory.getLogger(HttpsRequest.class); private static final String CERT_PATH = HttpsRequest.class.getClassLoader().getResource("jks/icbc.jks").getFile(); private String charset_gbk = "GBK"; /** * 表示请求器是否已经做了初始化工作 */ private boolean hasInit = false; /** * 连接超时时间,默认10秒 */ private int socketTimeout = 10000; /** * 传输超时时间,默认30秒 */ private int connectTimeout = 30000; // 请求器的配置 private RequestConfig requestConfig; // HTTP请求器 private CloseableHttpClient httpClient; public HttpsRequest() throws UnrecoverableKeyException, KeyManagementException, NoSuchAlgorithmException, KeyStoreException, IOException { init(); } private void init() throws IOException, KeyStoreException, UnrecoverableKeyException, NoSuchAlgorithmException, KeyManagementException { // Init keyStore KeyStore keyStore = KeyStore.getInstance("jks");// PKCS12、jks 等 FileInputStream instream = new FileInputStream(new File(CERT_PATH));// 加载本地的证书进行https加密传输 try { keyStore.load(instream, "12345678".toCharArray());// 设置证书密码 } catch (CertificateException e) { e.printStackTrace(); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } finally { instream.close(); } // Init key manager factory /* * KeyManagerFactory kmf = * KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); * kmf.init(keyStore, "12345678".toCharArray()); KeyManager[] km = kmf.getKeyManagers(); * * // Init trust manager TrustManagerFactory tmf = * TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); * tmf.init(keyStore); TrustManager[] tms = tmf.getTrustManagers(); */ // Trust own CA and all self-signed certs, SSL protocol SSLContext sslcontext = SSLContexts.custom().useSSL().loadKeyMaterial(keyStore, "12345678".toCharArray()) .loadTrustMaterial(keyStore).build(); // sslcontext.init(km, tms, null); SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslcontext, null, null, SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER); httpClient = HttpClients.custom().setSSLSocketFactory(sslsf).build(); // 根据默认超时限制初始化requestConfig requestConfig = RequestConfig.custom().setSocketTimeout(socketTimeout).setConnectTimeout(connectTimeout).build(); hasInit = true; } @Override public String sendPost(String url, Object xmlObj) throws UnrecoverableKeyException, KeyManagementException, NoSuchAlgorithmException, KeyStoreException, IOException { if (!hasInit) { init(); } String result = null; HttpPost httpPost = new HttpPost(url); // 解决XStream对出现双下划线的bug XStream xStreamForRequestPostData = new XStream(new DomDriver("UTF-8", new XmlFriendlyNameCoder("-_", "_"))); // 将要提交给API的数据对象转换成XML格式数据Post给API String postDataXML = xStreamForRequestPostData.toXML(xmlObj); logger.info("API,POST请求参数:{}", postDataXML); // 得指明使用UTF-8编码,否则到API服务器XML的中文不能被成功识别 StringEntity postEntity = new StringEntity(postDataXML, charset_gbk); // httpPost.addHeader("Content-Type", "text/xml"); httpPost.setEntity(postEntity); // 设置请求器的配置 httpPost.setConfig(requestConfig); logger.info("Request line:{}", httpPost.getRequestLine()); try { HttpResponse response = httpClient.execute(httpPost); HttpEntity entity = response.getEntity(); result = EntityUtils.toString(entity, charset_gbk); } catch (ConnectionPoolTimeoutException e) { logger.error("http get throw ConnectionPoolTimeoutException(wait time out)"); } catch (ConnectTimeoutException e) { logger.error("http get throw ConnectTimeoutException"); } catch (SocketTimeoutException e) { logger.error("http get throw SocketTimeoutException"); } catch (Exception e) { logger.error("http get throw Exception"); } finally { httpPost.abort(); } return result; } private void resetRequestConfig() { requestConfig = RequestConfig.custom().setSocketTimeout(socketTimeout).setConnectTimeout(connectTimeout).build(); } /** * @return the hasInit */ public boolean isHasInit() { return hasInit; } /** * @return the socketTimeout */ public int getSocketTimeout() { return socketTimeout; } /** * @return the connectTimeout */ public int getConnectTimeout() { return connectTimeout; } /** * @param hasInit the hasInit to set */ public void setHasInit(boolean hasInit) { this.hasInit = hasInit; } /** * @param socketTimeout the socketTimeout to set */ public void setSocketTimeout(int socketTimeout) { this.socketTimeout = socketTimeout; resetRequestConfig(); } /** * @param connectTimeout the connectTimeout to set */ public void setConnectTimeout(int connectTimeout) { this.connectTimeout = connectTimeout; resetRequestConfig(); } /** * @return the requestConfig */ public RequestConfig getRequestConfig() { return requestConfig; } /** * @param requestConfig the requestConfig to set */ public void setRequestConfig(RequestConfig requestConfig) { this.requestConfig = requestConfig; } }
相关推荐
httpClient模拟https请求,包含图片上传等。
在IT行业中,模拟HTTPS请求是一项常见的任务,尤其是在进行API测试、客户端开发或者网络调试时。HTTPS(HyperText Transfer Protocol Secure)是一种基于SSL/TLS协议的HTTP安全版本,它通过加密通信来保护数据的安全...
网络爬虫是一种自动浏览和抓取网页的程序,它通常会利用HTTP/HTTPS请求模拟登录到网站,以便抓取需要的数据。在实现过程中,socket可以用于创建自定义的HTTP客户端,绕过一些常规的HTTP库限制,实现更灵活的网络交互...
本篇文章将深入探讨如何在Java中实现一个用于处理HTTPS请求的工具类。 首先,要实现HTTPS请求,我们需要导入Java的`java.net`和`javax.net.ssl`包,这两个包提供了处理网络连接和SSL/TLS安全协议的类。以下是一些...
本文将详细介绍两个流行的HTTP请求模拟工具——HTTPDebug和WFetch,它们可以帮助开发者更好地理解和操作HTTP协议,进行各种网络请求测试。 **HTTPDebug** HTTPDebug是一款功能强大的HTTP请求模拟工具,它允许用户...
在Android开发中,模拟HTTP请求是一项基础且重要的任务,它允许应用与远程服务器进行数据交互,获取或发送信息。本文将深入探讨如何在Android平台上实现HTTP请求,主要涉及以下几个方面: 1. **HTTP协议基础**:...
通过"Http/Https请求测试工具",我们可以输入目标URL、设置HTTP头或者查询参数来模拟GET请求,查看返回的响应状态码、响应头和响应体,以此来检查服务器是否正确地处理了请求。 POST请求则常用于向服务器提交数据,...
在C#编程中,模拟HTTP和HTTPS请求是常见的任务,特别是在进行Web自动化测试、网络爬虫或者API调用时。本篇文章将详细讲解如何在C#中构建一个用于处理HTTP和HTTPS请求的框架类实例。 首先,我们创建一个名为`...
标题中的"1Fiddler2_fiddler_Fiddler工具_204-nocontent.dat_模拟https请求_抓包_"揭示了本文将深入探讨Fiddler2在处理HTTP和HTTPS请求,特别是204-No Content响应码的应用,以及如何进行抓包和模拟请求。...
纯C语言写的https客户端,支持http及https的模拟GET和POST提交, 最大优势在于不依赖其他任何库(比如openssl库),并且支持window,linux等多平台,因此get及post效率较高,可移植性很好。 本次上传的是vc6下的完整...
《Burpsuite抓取HTTPS请求的详细步骤及原理》 Burpsuite是一款广泛使用的网络安全工具,主要用于测试Web应用程序的安全性。然而,默认情况下,Burpsuite只能捕获HTTP类型的网络请求,而无法处理加密的HTTPS请求。...
3. **模拟 POST 请求**:Fiddler4 的一大特点就是可以模拟客户端的 POST 请求。用户可以通过"Composer"面板创建新的请求,填写 URL、HTTP 方法(POST)、请求头和请求体,然后发送该请求,观察服务器的响应。这对于...
除此之外,我们对请求添加签名的校验,key设置为X-Sign 接口定义 /// /// 获取时间戳(毫秒). /// /// <param name=dateTime></param> /// <returns></returns> [HttpPost] [AllowAnonymous]
在cURL中,我们可以使用`curl_setopt()`函数设置请求头,以模拟不同浏览器的请求。例如,要模仿Chrome浏览器的请求,我们可以这样设置: ```php curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT ...
url="https://www.baidu.com" req_header = {"User-Agent":"Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11", "Accept":"text/html;q=0.9,*/*;q=0.8", ...
7. **HTTPS请求**:对于HTTPS,HttpURLConnection和OkHttp都能支持。只需确保URL以"https://"开头,并在必要时配置信任的证书。 8. **缓存策略**:为了提高性能和减少网络使用,OkHttp允许设置缓存策略,将响应数据...
"JAVA利用HttpClient进行POST请求(HTTPS)" JAVA HttpClient是Apache软件基金会提供的一个开源实现HTTP客户端的Java库,能够帮助开发者轻松地与HTTP服务器进行交互。在实际项目中,我们经常需要使用HttpClient来发送...
本篇文章将深入讲解如何在Qt环境下模拟POST请求,并特别关注对HTTPS协议的支持,以及在Windows操作系统下的应用。 首先,我们要了解HTTP POST请求的基本概念。POST请求是HTTP协议中的一个方法,用于向服务器发送...