封装多线程的HttpClient
2015-09-15 21:17
507 查看
因为最近项目需要用到抓
c105
包请求,用过抓post请求模拟浏览器登录的就知道,用post请求登陆如果需要验证码的,需要先用get获取验证码,同时获取验证码的cookie保存起来,post登录时再带上cookie进行登陆。所以为了更好的重用client,就把client封装了起来,方便使用,有什么不正确的地方,欢迎指正。
c105
包请求,用过抓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; } } }
相关文章推荐
- 封装多线程的HttpClient
- windows下TCP服务器和客户端的实现
- Android第九讲——网络(二) HttpUrlConnection
- TCP三次握手
- Netty5入门学习笔记003-TCP粘包/拆包问题的解决之道(下)
- Netty5入门学习笔记002-TCP粘包/拆包问题的解决之道(上)
- TCP协议三次握手
- 基本TCP套接字编程
- Elven Postman【HDU 5444】【长春网络赛】
- 2015长春网络赛(HDU5437,5438,5439,5441,5442,5443,5444,5446)
- TCP/IP 协议的工作流程
- Ajax之XMLHttpRequest对象
- HDU 5442 Favorite Donut(最大表示法 + KMP 2015长春网络赛)
- jquery CDN(内容分发网络)使用
- vmware上centos连接网络总结
- 【网络】(十一)更高效的epoll
- Android 网络通信——xUtils网络框架
- Jquer Ajax xmlhttp请求成功了,为什么一直在error函数里面
- 静态页与应用程序通讯 应用程序启动127.0.0.1 http服务
- 0914Android基础网络技术之XUtils