httpclient的封装

Posted ushowtime

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了httpclient的封装相关的知识,希望对你有一定的参考价值。

package utils;

import dao.PlatformDao;
import okhttp3.RequestBody;
import org.apache.http.HttpEntity;
import org.apache.http.HttpHost;
import org.apache.http.NameValuePair;
import org.apache.http.client.ResponseHandler;
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.entity.StringEntity;
import org.apache.http.impl.client.BasicResponseHandler;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ConnectException;
import java.net.SocketTimeoutException;
import java.net.URL;
import java.net.URLConnection;
import java.util.*;


/**
 * http请求器
 * @author songmin
 */
public class SpiderHttpClient {

    private static final Logger log = LoggerFactory.getLogger(SpiderHttpClient.class);

    String proxyIP;
    Integer proxyPort;
    String responseParam = null;
    String url;
    String defaultEncoding = "gbk";
    String contentEncoding = "UTF-8";
    String chartSet = "UTF-8";
    String userAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (Khtml, like Gecko) Chrome/77.0.3865.90 Safari/537.36";
    private static final String HEADER_REFERER = "Referer";
    private static final String HEADER_COOKIE = "Cookie";
    private static final String HEADER_USER_AGENT = "User-Agent";
    Map<String, String> headerMap = new HashMap<String, String>();
    Map<String, String> bodyMap = new HashMap<>();

    public SpiderHttpClient(String url) {
        this.url = url;
        headerMap.put(HEADER_USER_AGENT, userAgent);
    }

    /**
     * 设置请求体
     * @param key
     * @param value
     */
    public void setBody(String key,String value){
        bodyMap.put(key,value);
    }

    public void setProxyIP(String proxyIP) {
        if (proxyIP != null && !proxyIP.isEmpty()) {
            this.proxyIP = proxyIP;
        }
    }

    public void setProxyPort(Integer proxyPort) {
        if (proxyPort != null && proxyPort != 0) {
            this.proxyPort = proxyPort;
        }
    }

    /**设置字符格式*/
    public void setChartSet(String chartSet){
        this.chartSet = chartSet;
    }

    /**
     * 设置请求头
     *
     * @param key
     * @param value
     */
    public void setHeader(String key, String value) {
        headerMap.put(key, value);
    }


    /**
     * 设置referer
     *
     * @param referer
     */
    public void setReferer(String referer) {
        setHeader(HEADER_REFERER, referer);
    }

    /**
     * 设置cookie
     *
     * @param cookie
     */
    public void setCookie(String cookie) {
        setHeader(HEADER_COOKIE, cookie);
    }

    /**
     * 设置编码
     */
    public void setEncoding(String encoding) {
        this.defaultEncoding = encoding;
    }

    /**
     * 设置origin
     * @param origin
     */
    public void setOrigin(String origin){
        setHeader("Origin",origin);
    }

    public void setHost(String host){
        setHeader("Host",host);
    }
    public void setContentType(String contentType){
        setHeader("Content-Type",contentType);
    }
    public void setAcceptEncoding(String acceptEncoding){
        setHeader("Accept-Encoding",acceptEncoding);
    }


    /**
     * 获取响应头
     */
    public String getResponseHeader(String key) throws IOException {
        this.responseParam = key;
        HttpResponse httpResponse = getResponse(url);
        String responseHeader = httpResponse.getResponseHeaderParam();
        return responseHeader;
    }

    /**
     * 获取网页内容
     *
     * @return
     */
    public String getContent() throws IOException {
        HttpResponse httpResponse = getResponse(url);
        String html = httpResponse.getContent();
        return html;
    }


    /**
     * 获取响应
     *
     * @return
     */
    public HttpResponse getResponse(String url) throws IOException {
        String content = null;
        //创建httpClient实例
        CloseableHttpClient httpClient = HttpClients.createDefault();
        //创建httpGet实例
        HttpGet httpGet = new HttpGet(url);
        RequestConfig requestConfig = RequestConfig.custom()
                .setConnectTimeout(10000)
                .setSocketTimeout(10000)
                .setConnectionRequestTimeout(3000)
                .build();
        //设置代理IP,设置连接超时时间 、 设置 请求读取数据的超时时间 、 设置从connect Manager获取Connection超时时间、
        if (proxyIP != null && proxyPort != null && !proxyIP.isEmpty()) {
            HttpHost proxy = new HttpHost(proxyIP, proxyPort);
            requestConfig = RequestConfig.custom()
                    .setProxy(proxy)
                    .setConnectTimeout(10000)
                    .setSocketTimeout(10000)
                    .setConnectionRequestTimeout(3000)
                    .build();
        }
        Iterator<String> iterator = headerMap.keySet().iterator();
        while (iterator.hasNext()) {
            String key = iterator.next();
            httpGet.setHeader(key, headerMap.get(key));
        }
        httpGet.setConfig(requestConfig);
        //设置请求头消息
        CloseableHttpResponse response = httpClient.execute(httpGet);
        String responseHeader = "";
        if (response != null) {
            HttpEntity entity = response.getEntity();
            if (responseParam != null) {
                responseHeader = response.getFirstHeader(responseParam).getValue();
            }
            if (entity != null) {
                content = EntityUtils.toString(entity, defaultEncoding);
            }
        }
        if (response != null) {
            response.close();
        }
        if (httpClient != null) {
            httpClient.close();
        }
        HttpResponse httpResponse = new HttpResponse();
        httpResponse.setContent(content);
        httpResponse.setResponseHeaderParam(responseHeader);
        return httpResponse;
    }

    /**
     * 携带json发送post请求
     * @param json 请求json
     * @return 返回值
     */
    public String sendJson(String json) {
        String returnValue = "这是默认返回值,接口调用失败";
        CloseableHttpClient httpClient = HttpClients.createDefault();
        ResponseHandler<String> responseHandler = new BasicResponseHandler();
        try{
            //第一步:创建HttpClient对象
            httpClient = HttpClients.createDefault();

            //第二步:创建httpPost对象
            HttpPost httpPost = new HttpPost(url);
            Iterator<String> iterator = headerMap.keySet().iterator();
            while (iterator.hasNext()) {
                String key = iterator.next();
                httpPost.setHeader(key, headerMap.get(key));
            }
            //第三步:给httpPost设置JSON格式的参数
            StringEntity requestEntity = new StringEntity(json,chartSet);
            requestEntity.setContentEncoding(contentEncoding);
            httpPost.setEntity(requestEntity);
            //第四步:发送HttpPost请求,获取返回值
            //调接口获取返回值时,必须用此方法
            returnValue = httpClient.execute(httpPost,responseHandler);

        }
        catch(Exception e)
        {
            e.printStackTrace();
        }

        finally {
            try {
                httpClient.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        //第五步:处理返回值
        return returnValue;
    }

    /**
     * 发送post请求
     * @return 请求结果
     * @throws IOException
     */
    public String sendHttpPost() throws IOException {
        CloseableHttpClient httpClient = HttpClients.createDefault();
        ResponseHandler<String> responseHandler = new BasicResponseHandler();
        HttpPost httpPost = new HttpPost(url);

        Iterator<String> iterator = headerMap.keySet().iterator();
        while (iterator.hasNext()) {
            String key = iterator.next();
            httpPost.setHeader(key, headerMap.get(key));
        }
        // 创建参数队列
        List<NameValuePair> nameValuePairs = new ArrayList<>();
        for (String key : bodyMap.keySet()) {
            nameValuePairs.add(new BasicNameValuePair(key, bodyMap.get(key)));
        }
        try {
            httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs, "UTF-8"));
        } catch (Exception e) {
            e.printStackTrace();
        }
        String result = httpClient.execute(httpPost,responseHandler);
        return result;
    }
}

 

以上是关于httpclient的封装的主要内容,如果未能解决你的问题,请参考以下文章

VSCode自定义代码片段14——Vue的axios网络请求封装

VSCode自定义代码片段14——Vue的axios网络请求封装

VSCode自定义代码片段14——Vue的axios网络请求封装

轻松把玩HttpClient之封装HttpClient工具类,携带Cookie的请求

httpclient模拟post请求json封装表单数据

轻松把玩HttpClient之封装HttpClient工具类,封装输入参数,简化工具类