所有工具类
在日常开发中,我们经常需要通过http协议去调用网络内容,虽然java自身提供了net相关工具包,但是其灵活性和功能总是不如人意,于是有人专门搞出一个httpclient类库,来方便进行Http操作。对于httpcore的源码研究,我们可能并没有达到这种层次,在日常开发中也只是需要的时候,在网上百度一下,然后进行调用就行。在项目中对于这个工具类库也许没有进行很好的封装。在哪里使用就写在哪些,很多地方用到,就在多个地方写。反正是复制粘贴,很方便,但是这样就会导致项目中代码冗余。所以这里简单的对httpcient的简单操作封装成一个工具类,统一放在项目的工具包中,在使用的时候直接从工具包中调用,不需要写冗余代码。
HttpClientUtil
package zj.http.util;
import org.apache.commons.httpclient.Header;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.methods.StringRequestEntity;
import org.apache.log4j.Logger;
import zj.common.exception.ServiceException;
import zj.http.bean.ICallBackMethod;
/**
* httpClient工具类
*
* @version 1.00 (2014.09.15)
* @author SHNKCS 张军 {@link <a target=_blank href="http://www.zhangjunbk.com">张军个人网站</a> <a target=_blank href="http://user.qzone.qq.com/360901061/">张军QQ空间</a>}
*/
public class HttpClientUtil {
private static transient final Logger logger = Logger.getLogger(HttpClientUtil.class);
/**
* get请求
*
* @param url
* 请求地址
* @return 响应数据
* @throws Exception
*/
public static String get(String url) {
return get(url, null);
}
/**
* get请求
*
* @param url
* 请求地址
* @param callBack
* 设置参数s
* @return 响应数据
* @throws Exception
*/
public static String get(String url, ICallBackMethod callBack) {
String resultString = null;
HttpClient httpClient = new HttpClient();
GetMethod method = new GetMethod(url);
try {
// method.setRequestHeader(new Header("", ""));
if (callBack != null) {
callBack.setMethod(method);
}
int resultCode = httpClient.executeMethod(method);
if (resultCode == 200) {
resultString = method.getResponseBodyAsString();
}
logger.debug("调用方法返回结果[" + resultCode + "]:" + resultString);
return resultString;
} catch (Exception e) {
throw new ServiceException(e);
} finally {
if (method != null) {
try {
method.releaseConnection();
} catch (Exception e2) {
}
}
if (httpClient != null) {
// 上面的httpPost.releaseConnection()只是把连接归还client,没有关闭
// 加上下面这一句,才真正把不用的连接关闭
// 如果不手动关闭连接,每个连接都是保持180秒后才会自动断开,会占用大量的连接。
try {
httpClient.getHttpConnectionManager().closeIdleConnections(0);
} catch (Exception e) {
logger.info(e.getMessage(), e);
}
}
// try {
// method.releaseConnection();
// ((SimpleHttpConnectionManager) httpClient.getHttpConnectionManager()).shutdown();
// } catch (Exception e) {
// e.printStackTrace();
// }
}
}
/**
* XML.post请求
*
* @param url
* 请求地址
* @param content
* 请求内容
* @return 响应数据
* @throws Exception
*/
public static String postXML(String url, String content) {
return post(url, content, "application/xml", "UTF-8");
}
/**
* JSON.post请求
*
* @param url
* 请求地址
* @param content
* 请求内容
* @return 响应数据
* @throws Exception
*/
public static String postJSON(String url, String content) {
return post(url, content, "application/json", "UTF-8");
}
/**
* post请求
*
* @param url
* 请求地址
* @param content
* 请求内容
* @param contentType
* 请求类型
* @see contentType值说明
* @see application/x-www-form-urlencoded:窗体数据被编码为名称/值对。这是标准的编码格式。这是默认的方式
* @see multipart/form-data:窗体数据被编码为一条消息,页上的每个控件对应消息中的一个部分。二进制数据传输方式,主要用于上传文件
* @see text/html
* @see text/xml
* @param charset
* 请求编码
* @return 响应数据
* @throws Exception
*/
public static String post(String url, String content, String contentType, String charset) {
return post(url, content, contentType, charset, null);
}
/**
* post请求
*
* @param url
* 请求地址
* @param content
* 请求内容
* @see application/x-www-form-urlencoded:窗体数据被编码为名称/值对。这是标准的编码格式。这是默认的方式
* @see multipart/form-data:窗体数据被编码为一条消息,页上的每个控件对应消息中的一个部分。二进制数据传输方式,主要用于上传文件
* @see text/html
* @see text/xml
* @param callBack
* 设置参数
* @return 响应数据
* @throws Exception
*/
public static String postJSON(String url, String content, ICallBackMethod callBack) {
return post(url, content, "application/json", "UTF-8", callBack);
}
/**
* post请求
*
* @param url
* 请求地址
* @param content
* 请求内容
* @param contentType
* 请求类型
* @see contentType值说明
* @see application/x-www-form-urlencoded:窗体数据被编码为名称/值对。这是标准的编码格式。这是默认的方式
* @see multipart/form-data:窗体数据被编码为一条消息,页上的每个控件对应消息中的一个部分。二进制数据传输方式,主要用于上传文件
* @see text/html
* @see text/xml
* @param charset
* 请求编码
* @param callBack
* 设置参数
* @return 响应数据
* @throws Exception
*/
public static String post(String url, String content, String contentType, String charset, ICallBackMethod callBack) {
String resultString = null;
HttpClient httpClient = new HttpClient();
PostMethod method = new PostMethod(url);
try {
if (callBack == null) {
// 默认设置请求类型
method.setRequestHeader(new Header("Content-Type", contentType));
} else {
callBack.setMethod(method);
}
// method.getParams().setParameter(HttpMethodParams.HTTP_CONTENT_CHARSET, "");
// 禁用重试
// DefaultHttpMethodRetryHandler retryhandler = new DefaultHttpMethodRetryHandler(0, false);
// method.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, retryhandler);// 重试次数0次
// httpClient.setParams(new HttpClientParams() {
// private static final long serialVersionUID = 1458469810048748607L;
// {
// // setSoTimeout(uploadTimeOut);
// // 连接超时时间
// setSoTimeout(120000);
// }
// });
// contentType值说明
// application/x-www-form-urlencoded:窗体数据被编码为名称/值对。这是标准的编码格式。这是默认的方式
// multipart/form-data:窗体数据被编码为一条消息,页上的每个控件对应消息中的一个部分。二进制数据传输方式,主要用于上传文件
// text/plain:窗体数据以纯文本形式进行编码,其中不含任何控件或格式字符。
method.setRequestEntity(new StringRequestEntity(content, contentType, charset));
int resultCode = httpClient.executeMethod(method);
if (resultCode == 200) {
resultString = method.getResponseBodyAsString();
}
logger.debug("调用方法返回结果[" + resultCode + "]:" + resultString);
return resultString;
} catch (Exception e) {
throw new ServiceException(e);
} finally {
if (method != null) {
try {
method.releaseConnection();
} catch (Exception e2) {
}
}
if (httpClient != null) {
// 上面的httpPost.releaseConnection()只是把连接归还client,没有关闭
// 加上下面这一句,才真正把不用的连接关闭
// 如果不手动关闭连接,每个连接都是保持180秒后才会自动断开,会占用大量的连接。
try {
httpClient.getHttpConnectionManager().closeIdleConnections(0);
} catch (Exception e) {
logger.info(e.getMessage(), e);
}
}
// try {
// ((SimpleHttpConnectionManager) httpClient.getHttpConnectionManager()).shutdown();
// } catch (Exception e) {
// e.printStackTrace();
// }
}
}
}ICallBackMethod
package zj.http.bean;
import org.apache.commons.httpclient.HttpMethodBase;
/**
* httpClient工具类回调
*
* @version 1.00 (2014.09.15)
* @author SHNKCS 张军 {@link <a target=_blank href="http://www.zhangjunbk.com">张军个人网站</a> <a target=_blank href="http://user.qzone.qq.com/360901061/">张军QQ空间</a>}
*/
public interface ICallBackMethod {
/**
* 设置方法参数
*
* @param method
*/
public void setMethod(HttpMethodBase method);
}CallBackMethod
package zj.http.bean;
import org.apache.commons.httpclient.HttpMethodBase;
/**
* httpClient工具类回调
*
* @version 1.00 (2014.09.15)
* @author SHNKCS 张军 {@link <a target=_blank href="http://www.zhangjunbk.com">张军个人网站</a> <a target=_blank href="http://user.qzone.qq.com/360901061/">张军QQ空间</a>}
*/
public class CallBackMethod implements ICallBackMethod{
@Override
public void setMethod(HttpMethodBase method) {
}
}测试类
@Test
public void get测试() throws Exception {
try {
String newUrl = "http://www.baidu.com";
String r = HttpClientUtil.get(newUrl);
System.out.println(r);
} catch (Exception e) {
e.printStackTrace();
}
}
@Test
public void post测试() throws Exception {
try {
Map<String, Object> jsonMap = new HashMap<String, Object>();
jsonMap.put("name", "8779001");
jsonMap.put("password", "123");
String json = JSON.toJSONString(jsonMap);
String r = HttpClientUtil.postJSON("https://agent.ybagent9.com/login", json);
System.out.println(r);
} catch (Exception e) {
e.printStackTrace();
}
}
本文为张军原创文章,转载无需和我联系,但请注明来自张军的军军小站,个人博客http://www.zhangjunbk.com

