您的位置:首页 > 理论基础 > 计算机网络

封装多线程的HttpClient

2015-09-15 21:17 507 查看
        因为最近项目需要用到抓
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;
}

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: