`
该用户名已经存在
  • 浏览: 306491 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

封装使用HttpClient客户端

    博客分类:
  • Java
阅读更多
HttpClient 是 Apache Jakarta Common 下的子项目,可以用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议。
HttpClient提供非常方便而全面的API提供Http协议编程访问网络资源。
我的习惯是当我使用任何一个第三方工具或者一些开源框架编程的时候,我都会适当的做一些封装以尽量符合我的需求和使用。
当然,直接使用其API也能完成自己的功能,但是这些工具或者框架一般都是大而全的,在使用的时候我们常常只需要其中的一小部分功能,或者需要扩展其某一方面的功能。这样我们如果能按照自己的需求适当封装的话,能尽量减少我们客户端使用时的简单和纯粹。

一、定义Http请求返回数据处理接口HttpClientResponseHandler:
/**
 * HttpClient请求web服务器响应数据处理接口
 * @author boyce
 * @version 2014-1-24
 */
public interface HttpClientResponseHandler {
    
    public void handle(String response) throws HttpClientException ;
}


二、定义HttpClient请求接口HttpClientRequest:

/**
 * HttpClient 请求web服务器的request
 * @author boyce
 * @version 2014-1-24
 */
public interface HttpClientRequest {
    /**
     * 添加request参数
     * @param name 参数名
     * @param value 参数值
     */
    public void addParam(String name, Object value);
    
    /**
     * 执行request请求
     * @param httpClientResponseHandler 处理响应数据handler
     * @throws HttpClientException
     */
    public void process(HttpClientResponseHandler httpClientResponseHandler) throws HttpClientException ;
    
}

三、实现一个抽象的HttpClientRequest,封装post和get请求的公共部分:

/**
 * 抽象HttpClient 请求web服务器的request
 * @author boyce
 * @version 2014-1-24
 */
public abstract class AbstractHttpClientRequest implements HttpClientRequest {
    private static final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(AbstractHttpClientRequest.class);
    
    //请求URL地址
    protected String url;
    //请求参数
    protected Map<String, Object> params;
    
    /**
     * Constructor Method With All Params
     * @param url 请求URL
     */
    public AbstractHttpClientRequest(String url) {
        if (StringUtils.isEmpty(url))
            throw new NullPointerException("Cannot constract a HttpClientRequest with empty url.");
        
        this.url = url;
        this.params = new HashMap<String, Object>();
    }

    /**
     * 添加request参数
     * @param name 参数名
     * @param value 参数值
     */
    public void addParam(String name, Object value) {
        this.params.put(name, value);
    }
    
    /**
     * 执行请求
     * @throws HttpClientException httpClient请求异常
     */
    public void process(HttpClientResponseHandler httpClientResponseHandler) throws HttpClientException {
        
        //获取子类的具体的HttpMethod实现
        HttpMethod httpMethod = this.getHttpMethod();
        
        if (ObjectUtils.isNull(httpMethod))
            throw new NullPointerException("Cannot process request because the httpMethod is null.");
        
        HttpClient httpClient = new HttpClient();
        httpClient.getParams().setParameter(HttpMethodParams.HTTP_CONTENT_CHARSET, "UTF-8");
        
        try {
            long start = System.currentTimeMillis();
            logger.info("Begin to visit {}.", httpMethod.getURI());
            
            httpClient.executeMethod(httpMethod);
            logger.info("End to visit and take: {} ms.", (System.currentTimeMillis() - start));
        } catch (IOException e) {
            throw new HttpClientException(httpMethod.getPath(), e.getMessage());
        }
        
        //利用HttpClientResponseHandler处理响应结果
        if (ObjectUtils.isNotNull(httpClientResponseHandler))
            try {
                BufferedReader reader = new BufferedReader(new InputStreamReader(httpMethod.getResponseBodyAsStream()));  
                StringBuilder builder = new StringBuilder();  
                String str = null;  
                while((str = reader.readLine()) != null){  
                    builder.append(str);  
                }  
                String response = builder.toString(); 
                httpClientResponseHandler.handle(response);
            } catch (IOException e) {
                logger.error(e.getMessage(), e);
            }
            
        httpMethod.releaseConnection();
    }

    /**
     * 子类实现返回具体的HttpMethod对象
     * @return HttpMethod
     */
    public abstract HttpMethod getHttpMethod();
    
}


四、实现一个HttpClientGetRequest:
/**
 * 通过HttpClient GET请求服务器数据的Request
 * @author boyce
 * @version 2014-1-23
 */
public class HttpClientGetRequest extends AbstractHttpClientRequest {
    
    public HttpClientGetRequest(String url) {
        super(url);
    }
    
    public HttpMethod getHttpMethod() {
        StringBuilder builder = new StringBuilder();
        for (Entry<String, Object> entry : params.entrySet()) {
                builder.append(entry.getKey()).append("=")
                        .append(String.valueOf(entry.getValue()))
                        .append("&");
        }
        String param = null;
        if (builder.length() != 0)
            param = builder.deleteCharAt(builder.length()-1).toString();
        
        String url = null;
        if (StringUtils.isEmpty(param))
            url = this.url;
        else
            url = this.url + "?" + param;
        
        HttpMethod httpMethod = new GetMethod(url);
        return httpMethod;
    }
    
}


五、实现一个HttpClientPostRequest:
    /**
 * 通过HttpClient Post请求服务器数据的Request
 * @author boyce
 * @version 2014-1-23
 */
public class HttpClientPostRequest extends AbstractHttpClientRequest {

    public HttpClientPostRequest(String url) {
        super(url);
    }

    public HttpMethod getHttpMethod() {
        NameValuePair[] pairs = new NameValuePair[this.params.size()];
        NameValuePair pair = null;
        int i = 0;
        for (Entry<String, Object> entry : params.entrySet()) {
            pair = new NameValuePair(entry.getKey(), String.valueOf(entry.getValue()));
            pairs[i++] = pair;
        }
        
        PostMethod httpMethod = new PostMethod(this.url);
        httpMethod.setRequestBody(pairs);
        
        if (StringUtils.isNotEmpty(contentType))
            httpMethod.setRequestHeader("Content-Type", contentType);
        
        return httpMethod;
    }

}


六、客户端使用:
HttpClientRequest request = new HttpClientGetRequest("http://www.baidu.com");
request.process(new HttpClientResponseHandler() {
    /**
     * 处理response的数据
     */
    public void handle(String response) throws HttpClientException {
        System.out.println(response);
    }
});


有需要的同学参考,当然你可以按照自己的业务对HttpClientResponseHandler接口做更丰富的封装,
包括HttpClientRequest接口也可以更加丰富。
各位同学有什么改进意见和建议欢迎留言,共同学习,感激不尽!


2
0
分享到:
评论
1 楼 jahu 2014-04-03  
已经封装好了。还有处理机制。。

相关推荐

    httpclient4.5.4 开发文档

    httpclient4.5.4 开发文档 超文本传输协议(HTTP)或许是最重要的互联网上使用的协议。Web服务、网络功能和网络计算的增长继续扩展HTTP协议的作用超出用户的Web浏览器、应用数量的增加,需要支持HTTP。 尽管net包提供...

    封装一个类搞定90%安卓客户端与服务器端交互

    本实例封装了一个处理安卓客户端与服务器端交互的几个方法,对于中文乱码问题本实例也找到了解决方案.本例可以处理的场景如下: 1.与服务器端交互json数据. 2.Get方式与服务器端交互数据. 3.Post方式与服务器端交互...

    HttpClient

    HttpClient旨在填补这一空白,提供一个高效,同比增长日期,且功能丰富的封装,实现客户端的无效最新的HTTP标准和建议。 设计为可扩展,同时提供强大的支持HTTP协议的基础,HttpClient可提供给任何HTTP客户端应用...

    httpclient4.5.6依赖的jar包(全)

    支持httpclient开发依赖的jar包,httpclient是客户端请求服务端开发的非常的工具,封装好的get,post,等方法。

    如何在WPF应用程序中通过HttpClient调用Web API

    本教程是继使用HttpClient调用Web API只有的补充教程,主要讲解了如何在WPF中异步调用Web API且不阻塞主线程。

    一个基于HttpClient封装的Http组件.rar

    HttpClient是Apache Jakarta Common下的子项目,用来提供高效的、最新的、功能丰富的支持HTTP协议的客户端编程工具包,并且它支持HTTP协议最新的版本和建议。 HttpClient相比传统JDK自带的URLConnection,增加了...

    《第二新闻》安卓客户端-是一个资讯类新闻客户端,包括首页新闻、详情、图片浏览、视频观看等,

    3.网络上使用个人封装的httpClient请求来进行网络请求。 4.使用glide:3.7.0作为图片加载库 5.使用com.github.chrisbanes:PhotoView:latest.release扩展ImageView 支持通过单点/多点触摸来进行图片缩放 6.使用可上拉...

    使用java的HttpClient实现多线程并发

    主要介绍了使用java的HttpClient实现多线程并发的相关资料,需要的朋友可以参考下

    JSON客户端服务器端demo

    实现了最简单的在Android客户端将数据封装为json格式,并且传到服务器,服务器将数据解析出来,并封装自己的数据到json中传回到客户端,客户端解析服务器传过来的数据并显示,采用HttpClient进行通信,亲自测试,...

    HttpClient.rar

    使用C++封装的http客户端,支持post ,get,方便快速,直接添加文件使用,不需要依赖其他库

    C++ Http客户端

    C++ http client,可以直接封装到自身的c++项目中,采用的是linux下的curl库

    httpClient:httphttps请求客户端

    httpClient1.基于Apache HttpClient4.4,配置...对post和get方式进行了再次封装,更易使用4.支持xml和json报文使用方法参考test包下HttpClientTest.java如您觉得该项目对您有用,欢迎点击右上方的Star按钮,给予支持!

    Golang实现的HTTP客户端下载限速功能包.rar

    这里实现比较简单和粗浅,让我想起FunTester测试框架一开始的时候,也是从封装HttpClient.jar提供的API开始的,感慨万千。 这里我从了Golang SDK自带的net/http包提供的HTTP相关API,虽然本身提供了http.PostForm()...

    OptimusClient:一个基于 Apache 的 HttpClient 库的 Android 异步、基于回调的 Http 客户端

    这是一个基于Apache HttpClient实现的一个异步Http客户端。 特征: 1.异步以回调实现http请求。 2.使用线程池并发请求限制资源的使用。 3.支持Http的所有谓词。 4.封装请求参数,使调用更加容易。 5.可配置化的实现...

    HttpClient入门教程

    HttpClient入门教程 HttpClient 是 apache 组织下面的一个用于处理 HTTP 请求和响应的开源工具。它不是一个浏览器,也不处理客户端缓存等浏览器的功能。它只是一个类库!它在 JDK 的基本类库基础上做了更好的封装!

    custom-http:基于httpclient自定义http请求工具类

    http客户端调用包,基于最新的httpclient4.5.3开发和spring容器,针对现有市民支付和二维码业务需求做封装。 1、http连接池。2、可配置正向代理。3、可配置忽略https中CA用户证书认证。4、提供form表单和body两种...

    声明式HTTP客户端API框架,让Java发送HTTP/HTTPS请求不再难

    声明式HTTP客户端API框架,让Java发送HTTP/HTTPS...它比OkHttp和HttpClient更高层,是封装调用第三方restful api client接口的好帮手,是retrofit和feign之外另一个选择。通过在接口上声明注解的方式配置HTTP请求接口

    使用基于Python的Tornado框架的HTTP客户端的教程

    由于tornado内置的AsyncHTTPClient功能过于单一, 所以自己写了一个基于Tornado的HTTP...听取了仙子君的意见, 直接对tornado.curl_httpclient.CurlAsyncHTTPClient进行封装 安装 首先从git clone 下代码 git clone h

    Forest - 声明式HTTP客户端框架,让Java发送HTTP/HTTPS请求不再难

    声明式HTTP客户端API框架,让Java发送HTTP/HTTPS...它比OkHttp和HttpClient更高层,是封装调用第三方restful api client接口的好帮手,是retrofit和feign之外另一个选择。通过在接口上声明注解的方式配置HTTP请求接口

Global site tag (gtag.js) - Google Analytics