封装多线程的HttpClient

        因为最近项目需要用到抓包请求,用过抓post请求模拟浏览器登录的就知道,用post请求登陆如果需要验证码的,需要先用get获取验证码,同时获取验证码的cookie保存起来,post登录时再带上cookie进行登陆。所以为了更好的重用client,就把client封装了起来,方便使用,有什么不正确的地方,欢迎指正。




/**
 * 
 * @ClassName: HttpClientUtil
 * @Description: TODO(封装多线程的HttpClient工具)
 * @author ZhouHua
 * @date 2015年9月12日 上午11:07:53
 *
 */
public class HttpClientUtil {

	// 连接超时
	public static final int CONNECTION_TIME_OUT = 0;
	// 请求成功状态码
	public static final int HTTP_OK = 200;
	// UTF-8编码
	private static final String CHARSET = HTTP.UTF_8;
	// client
	private static HttpClient mHttpClientUtil;

	public HttpClientUtil() {

	}

	public static synchronized HttpClient getHttpClient() {
		if (null == mHttpClientUtil) {
			HttpParams params = new BasicHttpParams();
			// 设置一些基本参数
			HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
			HttpProtocolParams.setContentCharset(params, CHARSET);
			HttpProtocolParams.setUseExpectContinue(params, true);
			HttpProtocolParams.setUserAgent(params, "Mozilla/5.0(Linux;U;Android 2.2.1;en-us;Nexus One Build.FRG83) " + "AppleWebKit/553.1(KHTML,like Gecko) Version/4.0 Mobile Safari/533.1");
			// 超时设置
			/* 从连接池中取连接的超时时间 */
			ConnManagerParams.setTimeout(params, 1000 * 5);
			/* 连接超时 */
			HttpConnectionParams.setConnectionTimeout(params, 1000 * 18);
			/* 请求超时 */
			HttpConnectionParams.setSoTimeout(params, 1000 * 18);

			// 设置我们的HttpClient支持HTTP和HTTPS两种模式
			SchemeRegistry schReg = new SchemeRegistry();
			schReg.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
			schReg.register(new Scheme("https", SSLSocketFactory.getSocketFactory(), 443));

			// 使用线程安全的连接管理来创建HttpClient
			ClientConnectionManager conMgr = new ThreadSafeClientConnManager(params, schReg);
			mHttpClientUtil = new DefaultHttpClient(conMgr, params);
		}
		return mHttpClientUtil;
	}

	/**
	 * 
	 * @Title: get请求
	 * @Description: TODO(这里用一句话描述这个方法的作用)
	 * @param @param url
	 * @param @param cookie
	 * @param @param params//请求参数(key为header,value为param)
	 * @return RequestResult 请求结果
	 * @throws 请求失败异常
	 */
	public static RequestResult get(String url, String cookie, HashMap<String, String> params) {

		try {
			// 自动编码UTF-8
			HttpGet get = new HttpGet(null != params ? LibraryStringUtil.getUrl(url, params) : url);
			// cookie为null则设置默认请求头信息
			get.setHeaders(null == cookie ? getDefaultHeaders(null) : getDefaultHeaders(cookie));
			// 发送请求
			HttpClient client = getHttpClient();
			HttpResponse response = client.execute(get);
			// 判断状态码
			if (response.getStatusLine().getStatusCode() == HTTP_OK) {
				HttpEntity entity = response.getEntity();
				RequestResult result = new RequestResult();
				result.setBody(EntityUtils.toString(entity, CHARSET));
				return result;
			} else {
				// 请求失败
				return null;
			}
		} catch (RuntimeException r) {
			r.printStackTrace();
			return null;
		} catch (ClientProtocolException c) {
			c.printStackTrace();
			return null;
		} catch (IOException e) {
			e.printStackTrace();
			return null;
		} finally {
			// 关闭连接并释放资源
			shutdownHttpClient();
		}
	}

	/**
	 * @Title: post
	 * @Description: TODO(post请求)
	 * @param @param url
	 * @param @param cookie
	 * @param @param param map参数名为key,参数值为value
	 */
	public static RequestResult post(String url, String cookie, HashMap<String, String> param) {

		try {
			// 设置参数,编码UTF-8
			UrlEncodedFormEntity entity = new UrlEncodedFormEntity(postParam(param), CHARSET);
			HttpPost post = new HttpPost(url);
			// cookie为null则设置默认请求头信息
			post.setHeaders(cookie == null ? getDefaultHeaders(null) : getDefaultHeaders(cookie));
			post.setEntity(entity);
			// 发送请求
			HttpClient client = getHttpClient();
			HttpResponse response = client.execute(post);
			// 判断状态码
			if (response.getStatusLine().getStatusCode() == HTTP_OK) {
				RequestResult result = new RequestResult();
				result.setBody(EntityUtils.toString(response.getEntity(), CHARSET));
				result.setCookie(cookie);
				return result;
			} else {
				// 请求失败
				return null;
			}
		} catch (RuntimeException r) {
			r.printStackTrace();
			return null;
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
			return null;
		} catch (ClientProtocolException e) {
			e.printStackTrace();
			return null;
		} catch (IOException e) {
			e.printStackTrace();
			return null;
		} finally {
			// 关闭连接并释放资源
			shutdownHttpClient();
		}
	}

	// 封装post请求参数
	// map 参数名为key,参数值为value
	private static List<NameValuePair> postParam(HashMap<String, String> param) {
		List<NameValuePair> params = new ArrayList<NameValuePair>();
		Iterator<String> it = param.keySet().iterator();
		while (it.hasNext()) {
			String key = it.next();
			String value = param.get(key);
			params.add(new BasicNameValuePair(key, value));
		}
		return params;
	}

	// 在Application onLowMemory中关闭client(内存不够时关闭)
	public static void shutdownHttpClient() {
		if (null != mHttpClientUtil && null != mHttpClientUtil.getConnectionManager()) {
			mHttpClientUtil.getConnectionManager().shutdown();
			mHttpClientUtil = null;
		}
	}

	/**
	 * //TODO 默认header
	 * 
	 * @return
	 */
	public static Header[] getDefaultHeaders(String cookie) {
		Header[] allHeader = new BasicHeader[null != cookie ? 3 : 2];
		allHeader[0] = new BasicHeader("Content-Type", "application/x-www-form-urlencoded");
		allHeader[1] = new BasicHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.146 Safari/537.36");
		if (null != cookie) {
			allHeader[2] = new BasicHeader("Cookie", cookie);
		}
		return allHeader;
	}

	/**
	 * 
	 * @ClassName: RequestResult
	 * @Description: (请求结果)
	 * @author ZhouHua
	 * @date 2015年9月12日 上午11:11:12
	 *
	 */
	public static class RequestResult {

		// HTML cookie
		private String cookie;
		// HTML content
		private String body;

		public String getCookie() {
			return cookie;
		}

		public void setCookie(String cookie) {
			this.cookie = cookie;
		}

		public String getBody() {
			return body;
		}

		public void setBody(String body) {
			this.body = body;
		}

	}

}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值