`

https请求模拟

阅读更多
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;
    }

}

 

分享到:
评论

相关推荐

    模拟https请求工具类

    httpClient模拟https请求,包含图片上传等。

    模拟https请求

    在IT行业中,模拟HTTPS请求是一项常见的任务,尤其是在进行API测试、客户端开发或者网络调试时。HTTPS(HyperText Transfer Protocol Secure)是一种基于SSL/TLS协议的HTTP安全版本,它通过加密通信来保护数据的安全...

    socket http/https 模拟登录 请求页面等

    网络爬虫是一种自动浏览和抓取网页的程序,它通常会利用HTTP/HTTPS请求模拟登录到网站,以便抓取需要的数据。在实现过程中,socket可以用于创建自定义的HTTP客户端,绕过一些常规的HTTP库限制,实现更灵活的网络交互...

    Java实现的Https请求工具类

    本篇文章将深入探讨如何在Java中实现一个用于处理HTTPS请求的工具类。 首先,要实现HTTPS请求,我们需要导入Java的`java.net`和`javax.net.ssl`包,这两个包提供了处理网络连接和SSL/TLS安全协议的类。以下是一些...

    http请求模拟工具(httpdebug跟WFetch)

    本文将详细介绍两个流行的HTTP请求模拟工具——HTTPDebug和WFetch,它们可以帮助开发者更好地理解和操作HTTP协议,进行各种网络请求测试。 **HTTPDebug** HTTPDebug是一款功能强大的HTTP请求模拟工具,它允许用户...

    andriod 模拟Http请求

    在Android开发中,模拟HTTP请求是一项基础且重要的任务,它允许应用与远程服务器进行数据交互,获取或发送信息。本文将深入探讨如何在Android平台上实现HTTP请求,主要涉及以下几个方面: 1. **HTTP协议基础**:...

    Http/Https请求测试工具

    通过"Http/Https请求测试工具",我们可以输入目标URL、设置HTTP头或者查询参数来模拟GET请求,查看返回的响应状态码、响应头和响应体,以此来检查服务器是否正确地处理了请求。 POST请求则常用于向服务器提交数据,...

    C#模拟Http与Https请求框架类实例

    在C#编程中,模拟HTTP和HTTPS请求是常见的任务,特别是在进行Web自动化测试、网络爬虫或者API调用时。本篇文章将详细讲解如何在C#中构建一个用于处理HTTP和HTTPS请求的框架类实例。 首先,我们创建一个名为`...

    1Fiddler2_fiddler_Fiddler工具_204-nocontent.dat_模拟https请求_抓包_

    标题中的"1Fiddler2_fiddler_Fiddler工具_204-nocontent.dat_模拟https请求_抓包_"揭示了本文将深入探讨Fiddler2在处理HTTP和HTTPS请求,特别是204-No Content响应码的应用,以及如何进行抓包和模拟请求。...

    纯C语言写的https模拟GET和POST

    纯C语言写的https客户端,支持http及https的模拟GET和POST提交, 最大优势在于不依赖其他任何库(比如openssl库),并且支持window,linux等多平台,因此get及post效率较高,可移植性很好。 本次上传的是vc6下的完整...

    Burpsuite抓取https请求

    《Burpsuite抓取HTTPS请求的详细步骤及原理》 Burpsuite是一款广泛使用的网络安全工具,主要用于测试Web应用程序的安全性。然而,默认情况下,Burpsuite只能捕获HTTP类型的网络请求,而无法处理加密的HTTPS请求。...

    Fiddler4安装包,用于模拟客户端post请求

    3. **模拟 POST 请求**:Fiddler4 的一大特点就是可以模拟客户端的 POST 请求。用户可以通过"Composer"面板创建新的请求,填写 URL、HTTP 方法(POST)、请求头和请求体,然后发送该请求,观察服务器的响应。这对于...

    C# 使用HttpClient模拟请求的案例

    除此之外,我们对请求添加签名的校验,key设置为X-Sign 接口定义 /// /// 获取时间戳(毫秒). /// /// <param name=dateTime></param> /// <returns></returns> [HttpPost] [AllowAnonymous]

    PHPcurl模拟IP浏览器请求

    在cURL中,我们可以使用`curl_setopt()`函数设置请求头,以模拟不同浏览器的请求。例如,要模仿Chrome浏览器的请求,我们可以这样设置: ```php curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT ...

    基于Python模拟浏览器发送http请求

    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", ...

    31.模拟Http请求.rar

    7. **HTTPS请求**:对于HTTPS,HttpURLConnection和OkHttp都能支持。只需确保URL以"https://"开头,并在必要时配置信任的证书。 8. **缓存策略**:为了提高性能和减少网络使用,OkHttp允许设置缓存策略,将响应数据...

    (完整版)JAVA利用HttpClient进行POST请求(HTTPS).doc

    "JAVA利用HttpClient进行POST请求(HTTPS)" JAVA HttpClient是Apache软件基金会提供的一个开源实现HTTP客户端的Java库,能够帮助开发者轻松地与HTTP服务器进行交互。在实际项目中,我们经常需要使用HttpClient来发送...

    qt模拟post请求

    本篇文章将深入讲解如何在Qt环境下模拟POST请求,并特别关注对HTTPS协议的支持,以及在Windows操作系统下的应用。 首先,我们要了解HTTP POST请求的基本概念。POST请求是HTTP协议中的一个方法,用于向服务器发送...

Global site tag (gtag.js) - Google Analytics