HttpClientUtils

备用

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.util.ArrayList;
import java.util.List;

import org.apache.http.HttpEntity;
import org.apache.http.HttpHost;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.conn.params.ConnRoutePNames;
import org.apache.http.cookie.Cookie;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.protocol.HTTP;
import org.apache.http.util.EntityUtils;

/**
 * <p>
 * HTTP请求工具类
 * </p>
 * 
 * @author IceWee
 * @date 2012-6-16
 * @version 1.0
 */
public class HttpClientUtils {
    
    private static final String NEXT_LINE = "\r\n";
    private static final String HEADER_USER_AGENT = "User-Agent"; // 浏览器信息
    private static final String BROWSER_IE9 = "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)"; // 模拟Win7 x64/IE9

    /**
     * <p>
     * 网站登录(Post方式)
     * </p>
     * 
     * @param url 登录请求URL
     * @param proxyHost 网络代理主机
     * @param proxyPort 网络代理端口
     * @param nvps POST参数列表
     * @return 用户会话信息
     */
    public static List<Cookie> loginPost(String url, String proxyHost, int proxyPort, List <NameValuePair> nvps) {
        List<Cookie> cookies = new ArrayList<Cookie>();
        DefaultHttpClient httpClient = new DefaultHttpClient();
        try {
            if (proxyHost != null && !"".equals(proxyHost)) { // 网络代理
                HttpHost proxy = new HttpHost(proxyHost, proxyPort);
                httpClient.getParams().setParameter(ConnRoutePNames.DEFAULT_PROXY, proxy);
            }
            HttpPost httpPost = new HttpPost(url);
            httpPost.setHeader(HEADER_USER_AGENT, BROWSER_IE9); // 模拟浏览器
            httpPost.setEntity(new UrlEncodedFormEntity(nvps, HTTP.UTF_8));
            httpClient.execute(httpPost);
            cookies = httpClient.getCookieStore().getCookies();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            httpClient.getConnectionManager().shutdown();
        }
        return cookies;
    }
    
    /**
     * 网站登录(Get方式)
     * 
     * @param url 登录URL
     * @param encode 网站页面编码
     * @param proxyHost 网络代理主机
     * @param proxyPort 网络代理端口
     * @return Cookie
     */
    public static List<Cookie> loginGet(String url, String encode, String proxyHost, int proxyPort) {
        List<Cookie> cookies = null;
        DefaultHttpClient httpClient = new DefaultHttpClient();
        try {
            if (proxyHost != null && !"".equals(proxyHost)) { // 网络代理
                HttpHost proxy = new HttpHost(proxyHost, proxyPort);
                httpClient.getParams().setParameter(ConnRoutePNames.DEFAULT_PROXY, proxy);
            }
            HttpGet httpGet = new HttpGet(url);
            httpGet.setHeader(HEADER_USER_AGENT, BROWSER_IE9); // 模拟浏览器
            HttpResponse response = httpClient.execute(httpGet);
            boolean succeed = getLoginResult(response, encode);
            if (succeed) {
                cookies = httpClient.getCookieStore().getCookies();
            } else {
                cookies = null;
            }
        } catch (Exception e) {
            e.printStackTrace();
            cookies = null;
        } finally {
            httpClient.getConnectionManager().shutdown();
        }
        return cookies;
    }
    
    /**
     * <p>
     * 网站注销(Get方式)
     * </p>
     * 
     * @param url 注销请求URL
     * @param proxyHost 网络代理主机
     * @param proxyPort 网络代理端口
     * @param cookies 用户会话信息
     */
    public static void logout(String url, String proxyHost, int proxyPort, List<Cookie> cookies) {
        DefaultHttpClient httpClient = new DefaultHttpClient();
        try {
            sendCookie(httpClient, cookies);
            if (proxyHost != null && !"".equals(proxyHost)) { // 网络代理
                HttpHost proxy = new HttpHost(proxyHost, proxyPort);
                httpClient.getParams().setParameter(ConnRoutePNames.DEFAULT_PROXY, proxy);
            }
            HttpGet httpGet = new HttpGet(url);
            httpGet.setHeader(HEADER_USER_AGENT, BROWSER_IE9); // 模拟浏览器
            httpClient.execute(httpGet);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            httpClient.getConnectionManager().shutdown();
        }
    }
    
    /**
     * <p>
     * POST请求网址
     * </p>
     * 
     * @param url 请求URL
     * @param proxyHost 网络代理主机
     * @param proxyPort 网络代理端口
     * @param encode 网站编码
     * @param nvps 请求参数列表
     * @param cookies 用户会话信息
     * @return 网站源码
     */
    public static String sendPostRequest(String url, String proxyHost, int proxyPort, String encode, List <NameValuePair> nvps, List<Cookie> cookies) {
        String responseText = "";
        DefaultHttpClient httpClient = new DefaultHttpClient();
        try {
            sendCookie(httpClient, cookies); // 发送Cookie
            if (proxyHost != null && !"".equals(proxyHost)) { // 网络代理
                HttpHost proxy = new HttpHost(proxyHost, proxyPort);
                httpClient.getParams().setParameter(ConnRoutePNames.DEFAULT_PROXY, proxy);
            }
            HttpPost httpPost = new HttpPost(url);
            httpPost.setHeader(HEADER_USER_AGENT, BROWSER_IE9); // 模拟浏览器
            httpPost.setEntity(new UrlEncodedFormEntity(nvps, HTTP.UTF_8));
            HttpResponse response = httpClient.execute(httpPost);
            HttpEntity entity = response.getEntity();
            responseText = getResponse(entity, encode); // 获取返回页面源码
            EntityUtils.consume(entity);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            httpClient.getConnectionManager().shutdown();
        }
        return responseText;
    }
    
    /**
     * <p>
     * 解析返回流生成文本
     * </p>
     * 
     * @param entity
     * @param encode
     * @return
     * @throws IOException
     */
    private static String getResponse(HttpEntity entity, String encode) throws IOException {
        StringBuffer buffer = new StringBuffer();
        InputStream in = entity.getContent();
        Reader reader = new InputStreamReader(in, encode);
        BufferedReader bufferedReader = new BufferedReader(reader);
        String line;
        while ((line = bufferedReader.readLine()) != null) {
            line = new String(line.getBytes());
            buffer.append(line).append(NEXT_LINE);
        }
        bufferedReader.close();
        reader.close();
        return buffer.toString();
    }
    
    /**
     * <p>
     * 发送Cookie
     * </p>
     * 
     * @param httpClient
     * @param cookies
     */
    private static void sendCookie(DefaultHttpClient httpClient, List<Cookie> cookies) {
        if (cookies != null) {
            for (Cookie cookie : cookies) {
                httpClient.getCookieStore().addCookie(cookie);
            }
        }
    }
    
    /**
     * <p>
     * 解析出登录结果,北大法宝登录成功失败分别返回如下信息:<br>
     * 成功:p_LoginUser = "elsevier";dispResult('');<br>
     * 失败:p_AlertInfo = "对不起,您的账号在“法律法规”库在线人数已经超过最大允许范围!如有任何疑问请致电400-810-8266转117";dispResult('');
     * </p>
     * 
     * @param response
     * @param encode
     * @return
     * @throws IOException
     */
    private static boolean getLoginResult(HttpResponse response, String encode) throws IOException {
        boolean result = false;
        HttpEntity entity = response.getEntity();
        String responseText = getResponse(entity, encode);
        EntityUtils.consume(entity);
        if (responseText != null) {
            if (responseText.contains("p_LoginUser")) {
                result = true;
            } else if (responseText.contains("p_AlertInfo")) {
                result = false;
            }
        } else {
            result = false;
        }
        return result;
    }
    
}

 

posted on 2014-05-01 21:52  IceWee  阅读(761)  评论(0编辑  收藏  举报

导航