轻松把玩HttpClient之封装HttpClient工具类(一)(现有网上分享中的最强大的工具类)

       搜了一下网络上别人封装的HttpClient,大部分特别简单,有一些看起来比较高级,但是用起来都不怎么好用。调用关系不清楚,结构有点混乱。所以也就萌生了自己封装HttpClient工具类的想法。要做就做最好的,本工具类支持插件式配置Header、插件式配置httpclient对象,这样就可以方便地自定义header信息、配置ssl、配置proxy等。


       是不是觉得说的有点悬乎了,那就先看看调用吧:

	public static void testSimple() throws HttpProcessException{
		String url = "http://www.oschina.net";
		//简单调用
		String resp = HttpClientUtil.send(url);
		System.out.println("请求结果内容长度:"+ resp.length());
	}
	
	public static void testOne() throws HttpProcessException{		
		String url = "https://sso.tgb.com:8443/cas/login";
		
		//自定义HttpClient,设置超时、代理、ssl
		//HttpClient client= HCB.custom().timeout(10000).proxy("127.0.0.1", 8087).ssl().build();//采用默认方式(绕过证书验证)
		HttpClient client= HCB.custom().timeout(10000).ssl("D:\\keys\\wsriakey","tomcat").build();
		
		//设置header信息
		Header[] headers=HttpHeader.custom().keepAlive("false").connection("close").contentType(Headers.APP_FORM_URLENCODED).build();
		
		//执行请求
		String resp=HttpClientUtil.send(client, url, headers);
		System.out.println("请求结果如下:");
		System.out.println(resp);
	}

       轻松配置了代理、自定义证书的ssl、以及各种header头信息,是不是觉得还凑合呢,那就继续看吧。


       写这个工具类时,抽象了一下所有的demo,最后封装了一个最基本的方法(拆分成了2个方法了),其所有参数列表有:HttpClient对象、url(必须有)、请求方式、请求参数parasMap、header数组、编码格式encoding。


       由于封装的是工具类,所以最好是无状态的,可以支持多线程的方式调用的,所以方法都是static类型的。这也是为什么要把HttpClient对象也是作为了一个参数传入而非成员变量了,而且这样也为扩展HttpClient的配置提供了便利。


       因为HTTP1.1规范中定义了6种HTTP方法:GET, HEAD, POST, PUT, DELETE, TRACE 和 OPTIONS,其实还有一个PATCH,这几个方法在HttpClient中都有一个对应的类:HttpGet,HttpHead,HttpPost,HttpPut,HttpDelete,HttpTrace、HttpOptions以及HttpPatch。所有的这些类均继承了HttpRequestBase超类,故可以作为参数使用(用枚举类作为参数,用另一个方法来创建具体的请求方法对象)。


       Header头信息也是作为一个重要的参数,在请求特定网站的时候需要设置不同的Header,而header又是比较繁杂的,所以这里也是作为了一个参数传入的,也是方便扩展。


       使用map来作为post方式传入参数是习惯使然,不做过多的解释。


       编码这个参数主要是为了为待提交的数据和反馈结果进行转码处理。


       简单说一下流程:

    1. 创建请求对象request;
    2. 为request设置header信息;
    3. 判断当前请求对象是否是HttpEntityEnclosingRequestBase的子类,如果是,则支持setEntity方法,来设置参数。
    4. 执行请求,并拿到结果(同步阻塞);
    5. 获取并解码请求结果实体;
    6. 关闭链接

       就是这么简单,具体来看看代码吧:

	/**
	 * 请求资源或服务,自定义client对象,传入请求参数,设置内容类型,并指定参数和返回数据的编码
	 * 
	 * @param client		client对象
	 * @param url			资源地址
	 * @param httpMethod	请求方法
	 * @param parasMap		请求参数
	 * @param headers		请求头信息
	 * @param encoding		编码
	 * @return				返回处理结果
	 * @throws HttpProcessException 
	 */
	public static String send(HttpClient client, String url, HttpMethods httpMethod, Map<String,String>parasMap, 
				Header[] headers, String encoding) throws HttpProcessException {
		String body = "";
		try {
			//创建请求对象
			HttpRequestBase request = getRequest(url, httpMethod);
			
			//设置header信息
			request.setHeaders(headers);
			
			//判断是否支持设置entity(仅HttpPost、HttpPut、HttpPatch支持)
			if(HttpEntityEnclosingRequestBase.class.isAssignableFrom(request.getClass())){
				List<NameValuePair> nvps = new ArrayList<NameValueP
  • 22
    点赞
  • 75
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值