`
该用户名已经存在
  • 浏览: 308315 次
  • 性别: 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  
已经封装好了。还有处理机制。。

相关推荐

    httpclient 客户端发送xml报文到服务器端采用post方式(加密)传递

    本示例探讨的是如何使用HTTPClient库在客户端发送XML报文到服务器端,且报文通过POST方法传递,并可能涉及加密处理,确保数据的安全性。 首先,HTTPClient是Apache提供的一款强大的Java HTTP客户端API,它允许...

    对于C#(HttpClient)方式网络请求的封装

    标题中的“对于C#(HttpClient)方式网络请求的封装”是指使用C#编程语言,特别是通过HttpClient类来处理HTTP网络请求,并将这个过程进行抽象和封装,以便在多个地方重复使用。HttpClient是.NET Framework和.NET ...

    httpclient4.3 封装工具类

    8. **性能优化**:封装工具类可能还包括其他性能优化措施,比如使用连接池来减少TCP连接的创建和销毁,或者使用线程安全的缓存策略来减少重复请求。 9. **重试策略**:对于可能出现的网络不稳定情况,封装工具类...

    HttpClient封装工具

    在Spring框架中,我们可以将HttpClient进行封装,以便更好地利用其功能并整合到Spring的应用上下文中。下面将详细介绍如何使用Spring与HttpClient结合实现Http和Https请求。 1. **HttpClient介绍** HttpClient是一...

    httpclient模拟post请求json封装表单数据的实现方法

    在这个场景中,我们关注的是如何使用 HTTPClient 发送一个 JSON 格式的 POST 请求并封装表单数据。下面将详细介绍这个过程。 首先,我们需要创建一个 `HttpPost` 对象,并指定目标 URL。在给出的代码中,`url` 参数...

    javaeye api [java httpclient版] 简单封装

    HttpClient 是一个成熟的 Java 库,用于执行 HTTP 协议的客户端请求,而 JavaEyeClient 则是对这个库进行了一层封装,简化了开发人员在处理网络请求时的操作。 HttpClient 库允许开发者发送 GET、POST、PUT、DELETE...

    HTTPClient(Web客户端)

    HTTPClient,顾名思义,是指能够发起HTTP请求的客户端程序。在计算机网络中,HTTP(超文本传输协议)是用于在Web上进行数据交换的标准协议。VS 2005,即Visual Studio 2005,是微软提供的一款强大的开发环境,支持...

    java使用HttpClient发送http请求

    本文将深入讲解如何使用HttpClient来发送HTTP请求,以及相关的源码分析。 首先,让我们了解HttpClient的基本用法。Apache HttpClient库提供了丰富的功能,包括GET、POST、PUT等各种HTTP方法的支持。以下是一个简单...

    一个面向对象风格的JavaHTTPClient

    例如,可以创建一个HttpClient类,封装HTTP请求的创建、执行和响应处理,从而在项目中统一HTTP客户端的使用方式。 在实际应用中,为了实现一个面向对象风格的HTTP客户端,你可能需要考虑以下几个方面: 1. **请求...

    使用HttpClient调试android接口-通用方法

    4. **封装HttpClient通用方法**: - 创建一个公共类,如`HttpRequestUtil`,包含静态方法处理不同类型的HTTP请求。 - 方法参数可以包括URL、请求方法、请求头、请求体等,返回响应的字符串或解析后的数据对象。 -...

    使用httpclient方式和RestTemplate方式调用http及https接口

    它封装了HTTP客户端操作,提供了更直观的API。下面是如何使用RestTemplate调用HTTP接口的例子: ```java RestTemplate restTemplate = new RestTemplate(); ResponseEntity&lt;String&gt; response = restTemplate....

    HttpClientHelper 工具类

    HttpClientHelper 对这个类进行了封装,使得开发者无需直接与HttpClient接口打交道,而是通过更简洁、易用的方法调用来实现网络通信。这提高了代码的可读性和可维护性。 单例模式是软件设计模式的一种,确保一个类...

    【ASP.NET编程知识】.NET CORE HttpClient的使用方法.docx

    类型化客户端是指我们可以使用泛型来创建 HttpClient 实例,以便在后续的使用中可以根据类型来获取对应的 HttpClient 实例。我们可以使用以下代码来添加类型化客户端: `services.AddHttpClient();` 在上面的代码...

    HttpClient工具类封装.docx

    这个工具类是基于HttpClient 4.5.12版本进行封装,目的是简化HTTP操作并提供更便捷的使用方式。以下是关于这个工具类的一些关键知识点: 1. **Maven依赖**: - `httpclient`:Apache HttpClient的核心库,用于处理...

    使用HttpClient登录网易邮箱

    在IT行业中,网络通信是必不可少的一部分,而HTTP作为互联网上应用最为广泛的一种网络协议,它的客户端库HttpClient成为了Java开发者常用的一款工具。本篇文章将详细探讨如何利用HttpClient来实现登录网易邮箱的功能...

    httpclient4.5.4 开发文档

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

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

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

    httpclient简单使用

    使用`HttpClient`类创建一个客户端实例,这是所有操作的基础: ```java CloseableHttpClient httpClient = HttpClients.createDefault(); ``` 4. **构造HttpGet和HttpPost请求** - `HttpGet`用于发送GET请求:...

    WebApi系列-通过HttpClient来调用WebApi接口.doc

    本文将详细介绍如何使用`HttpClient`来调用Web API接口。 #### 二、HttpClient简介 `HttpClient`是一个被广泛使用的类,用于发起HTTP请求并接收响应。它在.NET框架中得到了很好的支持和封装。与其他语言如Java或...

    Java灵活易用自封装http客户端

    这个自封装的客户端支持JSON、XML以及键值对等多种数据传输格式,大大提升了开发效率。 首先,我们需要理解HTTP客户端的基本工作原理。HTTP客户端是应用程序的一种,用于向HTTP服务器发送请求并接收响应。在Java中...

Global site tag (gtag.js) - Google Analytics