所有工具类
在日常开发中,我们经常需要通过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