天天看点

HttpClient-4.3.4使用工具类

封装HttpClient 4.3.4 ,方便日后抓取数据,数据提交(待Cookie访问、302跳转访问):

package util;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.http.HttpEntity;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.CookieStore;
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.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;

/**
* 网页抓取,httpclient-4.3.4 调用
* 类名称:HttpUtil.java
* 创建时间:2014-12-1
* 修改备注:   
* @version 1.0
 */
public class HttpUtil {
    private static final Log log = LogFactory.getLog(HttpUtil.class);
    
    public static String get(String url){
        //初始化一个httpClient
        
        /* 带Cookie方式初始化  httpclient 作为全局变量,不要关闭
        CloseableHttpClient httpclient;
        CookieStore cookieStore;
        String cookies ="user=155;pwd=2545454weafadfwef";
        if (cookieStore==null) {
            cookieStore = new BasicCookieStore(); 
            String[] ckArr = cookies.split(";");
            for (String ck : ckArr) {
                String[] tempArr = ck.split("=");
                if (tempArr.length==2) {
                    BasicClientCookie cookie = new BasicClientCookie(tempArr[0].trim(), tempArr[1].trim()); 
                    cookie.setVersion(1); 
                    cookie.setDomain("pub.alimama.com");
                    cookie.setPath("/"); 
                    cookieStore.addCookie(cookie); 
                }
                
            }
        }
        httpclient =  HttpClients.custom().setDefaultCookieStore(cookieStore).build(); 
        */    
        
        //普通方式构造 httpclient
        CloseableHttpClient httpclient = HttpClients.createDefault();
        return get(url,httpclient);
    }
    
    /**
     * get方式获取网页内容
     * @param url  网址
     * @param httpclient  httpclient 实例
     * @param referer  构造来源地址
     * @return
     */
    public static String get(String url,CloseableHttpClient httpclient,String referer){
        String html ="";
        try {
            HttpGet httpGet = new HttpGet(url);
            Integer timeOut = 30000; //30 秒 超时
            RequestConfig requestConfig = RequestConfig.custom().setConnectionRequestTimeout(timeOut) .setConnectTimeout(timeOut).setSocketTimeout(timeOut).build();
            httpGet.setConfig(requestConfig);
            if (referer!=null) {
                httpGet.setHeader("referer", referer);
            }
            CloseableHttpResponse response = null;
            try {
                response = httpclient.execute(httpGet);
                HttpEntity entity = response.getEntity();
                html = EntityUtils.toString(entity);
            } catch (ClientProtocolException e) {
                log.error("http协议异常:"+e.getMessage());
            } catch (IOException e) {
                log.error("http读取异常:"+e.getMessage());
            }catch (Exception e) {
                log.error("httpException:"+e.getMessage());
            }finally {
                 try {
                    response.close();
                } catch (IOException e) {
                    log.error("http输出流关闭错误:"+e.getMessage());
                }
            }
        } finally {
        }
        return html;
    }
    
    /**
     * get方式获取网页内容
     * @param url  网址
     * @param httpclient  httpclient 实例
     * @return
     */
    public static String get(String url,CloseableHttpClient httpclient){
        return get(url, httpclient, null);
    }
    
    /**
     * post方式提交数据,获取网页内容
     * @param url  网址
     * @param parmas  Map<String, String>方式存放数据名称和值
     * @param httpclient  httpclient 实例
     * @param referer  构造来源地址
     * @return
     */
    public static String post(String url, Map<String, String> parmas,CloseableHttpClient httpclient,String referer){
        String html ="";
        try {
            HttpPost httpPost = new HttpPost(url);
            Integer timeOut = 30000; //30 秒 超时
            RequestConfig requestConfig = RequestConfig.custom().setConnectionRequestTimeout(timeOut) .setConnectTimeout(timeOut).setSocketTimeout(timeOut).build();
            httpPost.setConfig(requestConfig);
            if (referer!=null) {
                httpPost.setHeader("referer", referer);
            }
            CloseableHttpResponse response = null;
            try {
                //参数设置
                List <NameValuePair> nvps = new ArrayList <NameValuePair>();
                for (String key : parmas.keySet()) {
                    nvps.add(new BasicNameValuePair(key, parmas.get(key)));
                }
                httpPost.setEntity(new UrlEncodedFormEntity(nvps));
                response = httpclient.execute(httpPost);
                HttpEntity entity = response.getEntity();
                html = EntityUtils.toString(entity);
            } catch (ClientProtocolException e) {
                log.error("http协议异常:"+e.getMessage());
            } catch (IOException e) {
                log.error("http读取异常:"+e.getMessage());
            }catch (Exception e) {
                log.error("httpException:"+e.getMessage());
            }finally {
                 try {
                    response.close();
                } catch (IOException e) {
                    log.error("http输出流关闭错误:"+e.getMessage());
                }
            }
        } finally {
            
        }
        return html;
    }
    
    /**
     * post方式提交数据,获取网页内容
     * @param url  网址
     * @param parmas  Map<String, String>方式存放数据名称和值
     * @param httpclient  httpclient 实例
     * @return
     */
    public static String post(String url, Map<String, String> parmas,CloseableHttpClient httpclient){
        return post(url, parmas, httpclient, null);
    }
    
    
    /**
     * 简单方式,post方式提交数据,获取网页内容
     * @param url  网址
     * @param parmas  Map<String, String>方式存放数据名称和值
     * @return
     */
    public static String post(String url, Map<String, String> parmas){
        CloseableHttpClient httpclient = HttpClients.createDefault();
        return post(url, parmas,httpclient);
    }
    
    /**
     * 302连续跳转,获取真实连接
     * @param url
     * @param cookieStore
     * @return
     */
    public static String get302(String url,CookieStore cookieStore) {
        CloseableHttpClient httpclient = HttpClients.custom().setDefaultCookieStore(cookieStore).build();
        HttpGet httpget = new HttpGet(url);
        Integer timeOut = 20000; //30 秒 超时
        RequestConfig requestConfig = RequestConfig.custom().setRedirectsEnabled(false).setCircularRedirectsAllowed(false).setConnectionRequestTimeout(timeOut) .setConnectTimeout(timeOut).setSocketTimeout(timeOut).build();
        httpget.setConfig(requestConfig);
        CloseableHttpResponse response = null;
        try {
            response = httpclient.execute(httpget);
            int status = response.getStatusLine().getStatusCode();
            if (status==302) {
                url =  response.getFirstHeader("Location").getValue();
                return get302(url,cookieStore);
            }else {
                 HttpEntity entity = response.getEntity();
                 return EntityUtils.toString(entity);
            }
        } catch (Exception e) {
            System.err.println("获取失败");
        } finally {
            try {
                response.close();
                httpclient.close();
            } catch (IOException e) {}
        }
        return null;
    }
}      

转载于:https://www.cnblogs.com/hi007/p/httpclient.html