HttpClient 发送 HTTP、HTTPS 请求的简单封装

来源:互联网 发布:淘宝旺信 编辑:程序博客网 时间:2024/06/01 09:44



最近这几周,一直在忙同一个项目,刚开始是了解需求,需求有一定了解之后,就开始调第三方的接口。由于第三方给提供的文档很模糊,在调接口的时候,出了很多问题,一直在沟通协调,具体的无奈就不说了,由于接口的访问协议是通过 HTTP 和 HTTPS 通讯的,因此封装了一个简单的请求工具类,由于时间紧迫,并没有额外的时间对工具类进行优化和扩展,如果后续空出时间的话,我会对该工具类继续进行优化和扩展的。


引用


首先说一下该类中需要引入的 jar 包,apache 的 httpclient 包,版本号为 4.5,如有需要的话,可以引一下。


代码


<span style="font-family:Comic Sans MS;">import org.apache.commons.io.IOUtils;import org.apache.http.HttpEntity;import org.apache.http.HttpResponse;import org.apache.http.HttpStatus;import org.apache.http.NameValuePair;import org.apache.http.client.HttpClient;import org.apache.http.client.config.RequestConfig;import org.apache.http.client.entity.UrlEncodedFormEntity;import org.apache.http.client.methods.CloseableHttpResponse;import org.apache.http.client.methods.HttpGet;import org.apache.http.client.methods.HttpPost;import org.apache.http.conn.ssl.SSLConnectionSocketFactory;import org.apache.http.conn.ssl.SSLContextBuilder;import org.apache.http.conn.ssl.TrustStrategy;import org.apache.http.conn.ssl.X509HostnameVerifier;import org.apache.http.entity.StringEntity;import org.apache.http.impl.client.CloseableHttpClient;import org.apache.http.impl.client.DefaultHttpClient;import org.apache.http.impl.client.HttpClients;import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;import org.apache.http.message.BasicNameValuePair;import org.apache.http.util.EntityUtils;import javax.net.ssl.SSLContext;import javax.net.ssl.SSLException;import javax.net.ssl.SSLSession;import javax.net.ssl.SSLSocket;import java.io.IOException;import java.io.InputStream;import java.nio.charset.Charset;import java.security.GeneralSecurityException;import java.security.cert.CertificateException;import java.security.cert.X509Certificate;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;/** * HTTP 请求工具类 * * @author : liii * @version : 1.0.0 * @date : 2015/7/21 * @see : TODO */public class HttpUtil {    private static PoolingHttpClientConnectionManager connMgr;    private static RequestConfig requestConfig;    private static final int MAX_TIMEOUT = 7000;    static {        // 设置连接池        connMgr = new PoolingHttpClientConnectionManager();        // 设置连接池大小        connMgr.setMaxTotal(100);        connMgr.setDefaultMaxPerRoute(connMgr.getMaxTotal());        RequestConfig.Builder configBuilder = RequestConfig.custom();        // 设置连接超时        configBuilder.setConnectTimeout(MAX_TIMEOUT);        // 设置读取超时        configBuilder.setSocketTimeout(MAX_TIMEOUT);        // 设置从连接池获取连接实例的超时        configBuilder.setConnectionRequestTimeout(MAX_TIMEOUT);        // 在提交请求之前 测试连接是否可用        configBuilder.setStaleConnectionCheckEnabled(true);        requestConfig = configBuilder.build();    }    /**     * 发送 GET 请求(HTTP),不带输入数据     * @param url     * @return     */    public static String doGet(String url) {        return doGet(url, new HashMap<String, Object>());    }    /**     * 发送 GET 请求(HTTP),K-V形式     * @param url     * @param params     * @return     */    public static String doGet(String url, Map<String, Object> params) {        String apiUrl = url;        StringBuffer param = new StringBuffer();        int i = 0;        for (String key : params.keySet()) {            if (i == 0)                param.append("?");            else                param.append("&");            param.append(key).append("=").append(params.get(key));            i++;        }        apiUrl += param;        String result = null;        HttpClient httpclient = new DefaultHttpClient();        try {            HttpGet httpPost = new HttpGet(apiUrl);            HttpResponse response = httpclient.execute(httpPost);            int statusCode = response.getStatusLine().getStatusCode();            System.out.println("执行状态码 : " + statusCode);            HttpEntity entity = response.getEntity();            if (entity != null) {                InputStream instream = entity.getContent();                result = IOUtils.toString(instream, "UTF-8");            }        } catch (IOException e) {            e.printStackTrace();        }        return result;    }    /**     * 发送 POST 请求(HTTP),不带输入数据     * @param apiUrl     * @return     */    public static String doPost(String apiUrl) {        return doPost(apiUrl, new HashMap<String, Object>());    }    /**     * 发送 POST 请求(HTTP),K-V形式     * @param apiUrl API接口URL     * @param params 参数map     * @return     */    public static String doPost(String apiUrl, Map<String, Object> params) {        CloseableHttpClient httpClient = HttpClients.createDefault();        String httpStr = null;        HttpPost httpPost = new HttpPost(apiUrl);        CloseableHttpResponse response = null;        try {            httpPost.setConfig(requestConfig);            List<NameValuePair> pairList = new ArrayList<>(params.size());            for (Map.Entry<String, Object> entry : params.entrySet()) {                NameValuePair pair = new BasicNameValuePair(entry.getKey(), entry                        .getValue().toString());                pairList.add(pair);            }            httpPost.setEntity(new UrlEncodedFormEntity(pairList, Charset.forName("UTF-8")));            response = httpClient.execute(httpPost);            System.out.println(response.toString());            HttpEntity entity = response.getEntity();            httpStr = EntityUtils.toString(entity, "UTF-8");        } catch (IOException e) {            e.printStackTrace();        } finally {            if (response != null) {                try {                    EntityUtils.consume(response.getEntity());                } catch (IOException e) {                    e.printStackTrace();                }            }        }        return httpStr;    }    /**     * 发送 POST 请求(HTTP),JSON形式     * @param apiUrl     * @param json json对象     * @return     */    public static String doPost(String apiUrl, Object json) {        CloseableHttpClient httpClient = HttpClients.createDefault();        String httpStr = null;        HttpPost httpPost = new HttpPost(apiUrl);        CloseableHttpResponse response = null;        try {            httpPost.setConfig(requestConfig);            StringEntity stringEntity = new StringEntity(json.toString(),"UTF-8");//解决中文乱码问题            stringEntity.setContentEncoding("UTF-8");            stringEntity.setContentType("application/json");            httpPost.setEntity(stringEntity);            response = httpClient.execute(httpPost);            HttpEntity entity = response.getEntity();            System.out.println(response.getStatusLine().getStatusCode());            httpStr = EntityUtils.toString(entity, "UTF-8");        } catch (IOException e) {            e.printStackTrace();        } finally {            if (response != null) {                try {                    EntityUtils.consume(response.getEntity());                } catch (IOException e) {                    e.printStackTrace();                }            }        }        return httpStr;    }    /**     * 发送 SSL POST 请求(HTTPS),K-V形式     * @param apiUrl API接口URL     * @param params 参数map     * @return     */    public static String doPostSSL(String apiUrl, Map<String, Object> params) {        CloseableHttpClient httpClient = HttpClients.custom().setSSLSocketFactory(createSSLConnSocketFactory()).setConnectionManager(connMgr).setDefaultRequestConfig(requestConfig).build();        HttpPost httpPost = new HttpPost(apiUrl);        CloseableHttpResponse response = null;        String httpStr = null;        try {            httpPost.setConfig(requestConfig);            List<NameValuePair> pairList = new ArrayList<NameValuePair>(params.size());            for (Map.Entry<String, Object> entry : params.entrySet()) {                NameValuePair pair = new BasicNameValuePair(entry.getKey(), entry                        .getValue().toString());                pairList.add(pair);            }            httpPost.setEntity(new UrlEncodedFormEntity(pairList, Charset.forName("utf-8")));            response = httpClient.execute(httpPost);            int statusCode = response.getStatusLine().getStatusCode();            if (statusCode != HttpStatus.SC_OK) {                return null;            }            HttpEntity entity = response.getEntity();            if (entity == null) {                return null;            }            httpStr = EntityUtils.toString(entity, "utf-8");        } catch (Exception e) {e.printStackTrace();        } finally {            if (response != null) {                try {                    EntityUtils.consume(response.getEntity());                } catch (IOException e) {                    e.printStackTrace();                }            }        }        return httpStr;    }    /**     * 发送 SSL POST 请求(HTTPS),JSON形式     * @param apiUrl API接口URL     * @param json JSON对象     * @return     */    public static String doPostSSL(String apiUrl, Object json) {        CloseableHttpClient httpClient = HttpClients.custom().setSSLSocketFactory(createSSLConnSocketFactory()).setConnectionManager(connMgr).setDefaultRequestConfig(requestConfig).build();        HttpPost httpPost = new HttpPost(apiUrl);        CloseableHttpResponse response = null;        String httpStr = null;        try {            httpPost.setConfig(requestConfig);            StringEntity stringEntity = new StringEntity(json.toString(),"UTF-8");//解决中文乱码问题            stringEntity.setContentEncoding("UTF-8");            stringEntity.setContentType("application/json");            httpPost.setEntity(stringEntity);            response = httpClient.execute(httpPost);            int statusCode = response.getStatusLine().getStatusCode();            if (statusCode != HttpStatus.SC_OK) {                return null;            }            HttpEntity entity = response.getEntity();            if (entity == null) {                return null;            }            httpStr = EntityUtils.toString(entity, "utf-8");        } catch (Exception e) {            e.printStackTrace();        } finally {            if (response != null) {                try {                    EntityUtils.consume(response.getEntity());                } catch (IOException e) {                    e.printStackTrace();                }            }        }        return httpStr;    }    /**     * 创建SSL安全连接     *     * @return     */    private static SSLConnectionSocketFactory createSSLConnSocketFactory() {        SSLConnectionSocketFactory sslsf = null;        try {            SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(null, new TrustStrategy() {                public boolean isTrusted(X509Certificate[] chain, String authType) throws CertificateException {                    return true;                }            }).build();            sslsf = new SSLConnectionSocketFactory(sslContext, new X509HostnameVerifier() {                @Override                public boolean verify(String arg0, SSLSession arg1) {                    return true;                }                @Override                public void verify(String host, SSLSocket ssl) throws IOException {                }                @Override                public void verify(String host, X509Certificate cert) throws SSLException {                }                @Override                public void verify(String host, String[] cns, String[] subjectAlts) throws SSLException {                }            });        } catch (GeneralSecurityException e) {            e.printStackTrace();        }        return sslsf;    }    /**     * 测试方法     * @param args     */    public static void main(String[] args) throws Exception {    }}</span>


结束语


工具类封装的比较粗糙,后续还会继续优化的,如果小伙伴们有更好的选择的话,希望也能够分享出来,大家一起学习。

3 2