HttpClient的工具类

经常需要使用HttpClient进行交互,有的时候需要保存和携带cookie,以及保持客户端和服务端的Session,比如在Android客户端访问服务端的时候可能需要满足以上的要求,则可以使用以下的方式。

package com.mobile.android.yiloneshop.utils;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import javax.net.ssl.SSLHandshakeException;

import org.apache.http.HttpEntityEnclosingRequest;
import org.apache.http.HttpRequest;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.NoHttpResponseException;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpRequestRetryHandler;
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.client.params.HttpClientParams;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.params.BasicHttpParams;
import org.apache.http.params.HttpConnectionParams;
import org.apache.http.params.HttpParams;
import org.apache.http.params.HttpProtocolParams;
import org.apache.http.protocol.ExecutionContext;
import org.apache.http.protocol.HTTP;
import org.apache.http.protocol.HttpContext;
import org.apache.http.util.EntityUtils;
import org.json.JSONException;
import org.json.JSONObject;

import android.test.AndroidTestCase;
import android.util.Log;

/**
 * Http工具类
 * <p>
 * 
 * @author zhaic
 * 
 * 2015年5月24日
 */
public class HttpUtil extends AndroidTestCase {

    /**
     * 执行downfile后,得到下载文件的大小
     */
    private static long contentLength;
    /**
     * 
     */
    private static String strResult = "服务器无法连接,请检查网络";

    /**
     * 提供GET形式的访问网络请求 doGet 参数示例:
     * </br>
     * Map params=new HashMap();
     * </br>
     * params.put("usename","helijun"); 
     * </br>
     * params.put("password","123456");
     * </br>
     * httpClient.doGet(url,params);
     * 
     * @param url 请求地址
     * @param params 请求参数    
     * @return 返回 String jsonResult;
     **/
    @SuppressWarnings("rawtypes")
    public static String doGet(String url, Map params) {
        /** 建立HTTPGet对象 **/
        String paramStr = "";
        if (params == null)
            params = new HashMap();
        /** 迭代请求参数集合 **/
        Iterator iter = params.entrySet().iterator();
        while (iter.hasNext()) {
            Map.Entry entry = (Map.Entry) iter.next();
            Object key = entry.getKey();
            String val = nullToString(entry.getValue());
            try {
                paramStr += paramStr = "&" + key + "=" + URLEncoder.encode(val, "UTF-8");
                if (!paramStr.equals("")) {
                    paramStr = paramStr.replaceFirst("&", "?");
                    url += paramStr;
                }
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
        }

        return doGet(url);
    }

    /**
     * 提供GET形式的访问网络请求 doGet,参数示例:
     * </br>
     * 
     * @param url 请求地址          
     * @param params 请求参数     
     * @return 返回 String jsonResult;
     * 
     */
    public static String doGet(String url, List<NameValuePair> params) {
        // 建立HTTPGet对象
        String paramStr = "";
        if (params == null)
            params = new ArrayList<NameValuePair>();
        // 迭代请求参数集合
        for (NameValuePair obj : params) {
            try {
                paramStr += paramStr = "&" + obj.getName() + "=" + URLEncoder.encode(obj.getValue(), "UTF-8");
                if (!paramStr.equals("")) {
                    paramStr = paramStr.replaceFirst("&", "?");
                    url += paramStr;
                }
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
        }

        return doGet(url);
    }

    /**
     * 提供GET形式的访问网络请求 doGet 参数示例:
     * @param url 请求地址
     * @return 返回 String jsonResult;
     * 
     */
    public static String doGet(String url) {
        DefaultHttpClient httpClient = getHttpClient();
        // 创建HttpGet对象
        HttpGet httpRequest = new HttpGet(url);
        try {
            // 保持会话Session,设置Cookie
            CookieContainer.addCookies(httpClient);
            // 发送请求并等待响应
            HttpResponse httpResponse = httpClient.execute(httpRequest);
            // 若状态码为200 ok
            if (httpResponse.getStatusLine().getStatusCode() == 200) {
                // 读返回数据
                strResult = EntityUtils.toString(httpResponse.getEntity());
                // 请求成功之后,每次都设置Cookis。保证每次请求都是最新的Cookis 
                CookieContainer.addCookies(httpClient);

            } else {
                strResult = "Error Response: " + httpResponse.getStatusLine().toString();
            }
        } catch (ClientProtocolException e) {
            strResult = nullToString(e.getMessage());
            e.printStackTrace();
        } catch (IOException e) {
            strResult = nullToString(e.getMessage());
            e.printStackTrace();
        } catch (Exception e) {
            strResult = nullToString(e.getMessage());
            e.printStackTrace();
        } finally {
            httpRequest.abort();
            httpClient.getConnectionManager().shutdown();
        }

        return strResult;
    }

    /**
     * 提供Post形式的访问网络请求 Post 参数示例:
     * </br>
     * List<NameValuePair> paramlist = new ArrayList<NameValuePair>(); 
     * </br>
     * paramlist(new BasicNameValuePair("email","xxx@123.com")); 
     * </br>
     * paramlist(new BasicNameValuePair("address", "123abc"));
     * </br>
     * httpClient.doPost(url,paramlist);
     * 
     * @param url 请求地址
     * @param params 请求参数
     * 
     * @return 返回 String jsonResult;
     **/

    public static String doPost(String url, List<NameValuePair> params) {       
        DefaultHttpClient httpClient = (DefaultHttpClient)getHttpClient();
        HttpPost httpRequest = new HttpPost(url);
        try {
            // 添加请求参数到请求对象
            httpRequest.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8));
            // 保持会话Session,设置Cookie
            CookieContainer.addCookies(httpClient);

            HttpResponse httpResponse = httpClient.execute(httpRequest);
            // 若状态码为200 ok
            if (httpResponse.getStatusLine().getStatusCode() == 200) {
                strResult = EntityUtils.toString(httpResponse.getEntity());
                System.out.println("1111doPost()方法返回strResult:"+strResult);
                // 请求成功之后,每次都设置Cookis。保证每次请求都是最新的Cookis 
                CookieContainer.saveCookies(httpClient);
            } else {
                strResult = "Error Response: " + httpResponse.getStatusLine().toString();
                System.out.println("22222doPost()方法返回strResult:"+strResult);
            }
        } catch (ClientProtocolException e) {
            strResult = "";
            System.out.println("33333doPost()方法返回strResult:"+strResult);
            e.printStackTrace();
        } catch (IOException e) {
            strResult = "";
            System.out.println("4444doPost()方法返回strResult:"+strResult);
            e.printStackTrace();
        } catch (Exception e) {
            strResult = "";
            System.out.println("5555doPost()方法返回strResult:"+strResult);
            e.printStackTrace();
        } finally {
            httpRequest.abort();
            httpClient.getConnectionManager().shutdown();
        }
        System.out.println("doPost()方法返回strResult:"+strResult);
        return strResult;
    }

    /**
     * 获取HttpClient对象
     * 
     **/
    public static synchronized DefaultHttpClient getHttpClient() {  
        // 创建 HttpParams 以用来设置 HTTP 参数(这一部分不是必需的)  
        HttpParams httpParams = new BasicHttpParams();  
        // 设置连接超时和 Socket 超时,以及 Socket 缓存大小  
        HttpConnectionParams.setConnectionTimeout(httpParams, 20 * 1000);  
        HttpConnectionParams.setSoTimeout(httpParams, 20 * 1000);  
        HttpConnectionParams.setSocketBufferSize(httpParams, 8192);  
        // 设置重定向,缺省为 true  
        HttpClientParams.setRedirecting(httpParams, true);  
        // 设置 user agent  
        String userAgent = "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.2) Gecko/20100115 Firefox/3.6";  
        HttpProtocolParams.setUserAgent(httpParams, userAgent);  
        // 创建一个 HttpClient 实例  
        // 注意 HttpClient httpClient = new HttpClient(); 是Commons HttpClient  
        // 中的用法,在 Android 1.5 中我们需要使用 Apache 的缺省实现 DefaultHttpClient  
        DefaultHttpClient httpClient = new DefaultHttpClient(httpParams);           

        return httpClient;  
    }

    public long getContentLength() {
        return contentLength;
    }

    /**
     * 假如obj对象 是null返回""
     * @param obj
     * @return
     */
    public static String nullToString(Object obj) {
        if (obj == null) {
            return "";
        }
        return obj.toString();
    }

    /**
     * 登录测试方法
     */
    public static void testLogin() {
        //拼装数据
        JSONObject jsonObj = new JSONObject();
        try {
            // 请求服务参数
            jsonObj.put("s", "loginHandlerService");
            jsonObj.put("m", "i");
            // 请求数据参数
            JSONObject loginInfo = new JSONObject();
            loginInfo.put("userName", "13718477745");
            loginInfo.put("pw", "123");
            jsonObj.put("p", loginInfo);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        List<NameValuePair> params = new ArrayList<NameValuePair>();
        params.add(new BasicNameValuePair("r", jsonObj.toString()));
        String resultStr = HttpUtil.doPost(NetConfig.url, params);
        Log.i(HttpUtil.class.getName(), "the result is: " + resultStr);
    }

    /**
     * 登出测试方法
     */
    public static void testLogout() {
        //拼装数据
        JSONObject jsonObj = new JSONObject();
        try {
            // 请求服务参数
            jsonObj.put("s", "loginHandlerService");
            jsonObj.put("m", "o");
            // 请求数据参数
            JSONObject loginInfo = new JSONObject();
            loginInfo.put("userName", "13718477745");
            loginInfo.put("pw", "123");
            jsonObj.put("p", loginInfo);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        List<NameValuePair> params = new ArrayList<NameValuePair>();
        params.add(new BasicNameValuePair("r", jsonObj.toString()));
        String resultStr = HttpUtil.doPost(NetConfig.url, params);
        Log.i(HttpUtil.class.getName(), "the result is: " + resultStr);
    }

    /**
     * 服务测试
     */
    public static void serviceTest() {
        //拼装数据
        JSONObject jsonObj = new JSONObject();
        try {
            // 请求服务参数
            jsonObj.put("m", "参数1");
            // 请求数据参数
            JSONObject param = new JSONObject();
            param.put("productId", "参数2");
            jsonObj.put("p", param);
            List<NameValuePair> params = new ArrayList<NameValuePair>();
            params.add(new BasicNameValuePair("r", jsonObj.toString()));
            String resultStr = HttpUtil.doPost(“http://localhost:8080/hello.do”, params);
            Log.i(HttpUtil.class.getName(), "the result is: " + resultStr);

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

/**
 * cookie容器工具类
 * 
 * @author zhaic
 *
 */
public class CookieContainer {

    /**
     * DefaultHttpClient 保存请求cookie
     * @param httpClient
     */
    public static void saveCookies(DefaultHttpClient httpClient) {
        PersistentCookieStore persistentCookieStore = BaseApplication.getInstance().getPersistentCookieStore();
        List<Cookie> cookies = httpClient.getCookieStore().getCookies();
        for (Cookie cookie:cookies){
            persistentCookieStore.addCookie(cookie);
        }
    }

    /**
     * DefaultHttpClient 设置请求cookie
     * @param httpClient
     */
    public static void addCookies(DefaultHttpClient httpClient) {
        PersistentCookieStore cookieStore = new PersistentCookieStore(BaseApplication.getInstance().getApplicationContext());
        httpClient.setCookieStore(cookieStore);
    }

    /**
     * AsyncHttpClient 设置请求cookie,在保存时也会自动被调用保存,因此不需要saveCookies方法
     * @param httpClient
     */
    public static void addCookies(AsyncHttpClient httpClient) {
        PersistentCookieStore cookieStore = new PersistentCookieStore(BaseApplication.getInstance().getApplicationContext());
        httpClient.setCookieStore(cookieStore);
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值