`

httpClient4.2官方文档研究(9)第8章

 
阅读更多

 原创出处:http://xcxn.iteye.com/blog/1827167

 

第八章

8.高级主题

8.1.自定义客户端连接

在某些情况下,可能有必要通过线路发送HTTP消息浏览超出什么是可能的,以便能够处理非标准,不符合规定的行为使用HTTP参数的方式来定制。例如,对于Web爬虫,它可能是需要强制的HttpClient接受格式错误的响应头,以挽救内容的消息。

通常情况下,插入一个自定义的的消息解析器或一个自定义的连接实现的过程包括几个步骤:

提供自定义LineParser / LineFormatter接口的实现。实现消息的解析/格式化逻辑的要求。

 

class MyLineParser extends BasicLineParser {
    @Override
    public Header parseHeader(
            final CharArrayBuffer buffer) throws ParseException {
        try {
            return super.parseHeader(buffer);
        } catch (ParseException ex) {
            // Suppress ParseException exception
            return new BasicHeader("invalid", buffer.toString());
        }
    }
}

 请提供一个自定义OperatedClientConnection实现。更换默认的请求/响应解析器,请求/响应格式化用自定义的需要。实现读/写代码,如果需要不同的信息。

 

class MyClientConnection extends DefaultClientConnection {
    @Override
    protected HttpMessageParser createResponseParser(
            final SessionInputBuffer buffer,
            final HttpResponseFactory responseFactory, 
            final HttpParams params) {
        return new DefaultResponseParser(
                buffer, 
                new MyLineParser(), 
                responseFactory, 
                params);
    }
    
}

 提供一个自定义ClientConnectionOperator接口实现,以创建新类的连接。必要时,实现不同的套接字初始化代码。

 

class MyClientConnectionOperator extends DefaultClientConnectionOperator {
    public MyClientConnectionOperator(final SchemeRegistry sr) {
        super(sr);
    }
    @Override
    public OperatedClientConnection createConnection() {
        return new MyClientConnection();
    }
}

 以创建新类的连接运营商提供一个自定义的ClientConnectionManager接口实现。

 

class MyClientConnManager extends SingleClientConnManager {
    public MyClientConnManager(
            final HttpParams params,
            final SchemeRegistry sr) {
        super(params, sr);
    }
    @Override
    protected ClientConnectionOperator createConnectionOperator(
            final SchemeRegistry sr) {
        return new MyClientConnectionOperator(sr);
    }
}

 

8.2.有状态的HTTP连接

尽管HTTP规范假定会话状态信息嵌入在HTTP消息中的HTTP cookies的形式,因此HTTP连接总是无状态的,这个假设并不总是成立的现实生活中。有情况下与特定的用户身份或在一个特定的安全上下文创建HTTP连接时,因此,不能与其他用户共享,并且可以重复使用只由同一用户。这种状态的HTTP连接的例子NTLM身份验证的连接和SSL连接的客户端证书身份验证。

8.2.1.用户令牌处理程序

HttpClient的依赖于UserTokenHandler接口,以确定是否在给定的执行上下文是用户特定的,或并不。由该处理程序返回的唯一标识当前用户如果上下文是用户特定的背景下为空,如果不包含任何资源或具体到当前用户的令牌对象。将被使用的用户令牌,以确保用户特定的资源不会被共享或其他用户重复使用。

默认实现的UserTokenHandler接口使用的主要类的一个实例代表一个状态对象为HTTP连接,如果它可以从指定的执行上下文。 DefaultUserTokenHandler将使用基于连接的认证计划,如NTLM或打开客户端身份验证的SSL会话的用户的原则。如果两者都无法使用,将返回null标记。

用户可以提供自定义默认的执行情况,如果不符合他们的需求:

DefaultHttpClient httpclient = new DefaultHttpClient();
httpclient.setUserTokenHandler(new UserTokenHandler() {
    public Object getUserToken(HttpContext context) {
        return context.getAttribute("my-token");
    }
    
});

 

8.2.2.用户令牌和执行上下文

在HTTP请求执行的过程中,HttpClient的将下面的用户身份相关的对象到执行上下文:

http.user ClientContext.USER_TOKEN='令牌':对象实例代表实际的用户身份,一般预期的原理接口的一个实例

人们可以发现,或不使用的连接是否执行的要求是有状态的请求被执行后,检查本地HTTP上下文的内容。

DefaultHttpClient httpclient = new DefaultHttpClient();
HttpContext localContext = new BasicHttpContext();
HttpGet httpget = new HttpGet("http://localhost:8080/"); 
HttpResponse response = httpclient.execute(httpget, localContext);
HttpEntity entity = response.getEntity();
EntityUtils.consume(entity);
Object userToken = localContext.getAttribute(ClientContext.USER_TOKEN);
System.out.println(userToken);

 

8.2.2.1.持久性状态的连接

请注意,只有在相同的状态对象被绑定到执行上下文中执行请求时,可以重复使用一个持久连接,带有一个状态对象。因此,它是非常重要的,以确保无论是重复使用相同的情况下执行随后的HTTP请求由同一个用户或用户令牌绑定之前请求执行的背景下。

DefaultHttpClient httpclient = new DefaultHttpClient();
HttpContext localContext1 = new BasicHttpContext();
HttpGet httpget1 = new HttpGet("http://localhost:8080/"); 
HttpResponse response1 = httpclient.execute(httpget1, localContext1);
HttpEntity entity1 = response1.getEntity();
EntityUtils.consume(entity1);
Principal principal = (Principal) localContext1.getAttribute(
        ClientContext.USER_TOKEN);

HttpContext localContext2 = new BasicHttpContext();
localContext2.setAttribute(ClientContext.USER_TOKEN, principal);
HttpGet httpget2 = new HttpGet("http://localhost:8080/"); 
HttpResponse response2 = httpclient.execute(httpget2, localContext2);
HttpEntity entity2 = response2.getEntity();
EntityUtils.consume(entity2);

 

 

分享到:
评论

相关推荐

    HttpClient4.2

    HttpClient 4.2版本是这个库的一个重要迭代,提供了许多增强的功能和改进的性能。在本篇文章中,我们将深入探讨HttpClient 4.2的核心概念、使用方法以及其在实际应用中的价值。 一、HttpClient核心概念 1. `...

    HttpClient 4.2 Api.chm

    最新HttpClient help文档,根据官方网站提供的doc制作。支持Index,Search等功能。

    httpclient cache 4.2

    本文将深入探讨HttpClient 4.2中的缓存机制及其相关组件。 1. HttpClient 4.2的核心组件 - HttpClient 4.2.jar:这是HttpClient的主要库,包含了执行HTTP请求的基本功能。 - httpcore-4.2.jar:这是HTTP核心库,...

    Httpclient4.2

    HttpClient 是 Apache Jakarta Common 下的子项目,可以用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议。

    http client 4.2

    《HttpClient 4.2详解——构建高效可靠的网络通信》 HttpClient是Apache软件基金会下的一个开源项目,主要用于HTTP协议的客户端编程。HttpClient 4.2版本是其发展过程中的一个重要里程碑,它提供了许多改进和增强的...

    httpClient官方文档

    在讨论HttpClient的文档时,首先应该明确它的使用范围,也即HttpClient能够做什么,以及它不做什么。在文档中,这一点被明确地指出,以帮助用户正确地利用HttpClient。 文档中提到了HttpClient的基础知识,包括以下...

    httpclient-4.5.3官方API中文文档_最新译版_2886K

    《HttpClient 4.5.3官方API中文文档详解》 HttpClient是Apache软件基金会下的一个开源项目,主要用于构建HTTP客户端应用程序,提供了丰富的功能和强大的性能。本文将基于4.5.3版本的HttpClient官方API中文文档,...

    HttpClient4.5官方文档翻译-部分

    HttpClient4.5已经发布有一段时间了,但网上一直没有完整的中文教程 .曾经看到过一个HttpClient4.1中文教程,但有两个问题:1.并不适用当前版本; 2.错误较多,语言不通顺。所以笔者在这里发布翻译过的HttpClient4.5...

    JAVA 人人网登陆实例代码(基于Apache httpclient 4.2.X)

    基于apache httpclient 4.2.X开发 自动处理redirect url jsoup解析response text log4j 自动生成日志 源代码基于UTF-8编码,如果出现乱码请切换到此编码 压缩包 包含所有jar文件。

    httpclient-4.2-beta1.jar

    httpclient-4.2-beta1.jar

    httpclient-4.5.6-API文档-中文版.zip

    包含翻译后的API文档:httpclient-4.5.6-javadoc-API文档-中文(简体)版.zip; Maven坐标:org.apache.httpcomponents:httpclient:4.5.6; 标签:apache、httpcomponents、httpclient、jar包、java、中文文档; 使用...

    httpclient-4.5.5-API文档-中文版.zip

    包含翻译后的API文档:httpclient-4.5.5-javadoc-API文档-中文(简体)版.zip 对应Maven信息:groupId:org.apache.httpcomponents,artifactId:httpclient,version:4.5.5 使用方法:解压翻译后的API文档,用...

    org.apache.commons.httpclient资源包(4.2)

    9. **自定义实现**:HttpClient允许用户自定义处理器和拦截器,可以实现特定的逻辑,如认证、重试策略等。 10. **国际化和本地化**:HttpClient 4.2支持多种语言和地域的设置,适应不同地区的应用需求。 总之,...

    HttpClient4.2.1版本的Jar包

    9. **自定义拦截器**:HttpClient 4.2.1允许通过`RequestInterceptor`和`ResponseInterceptor`接口自定义请求和响应处理逻辑,提供了更细粒度的控制。 10. **国际化和本地化**:HttpClient 4.2.1考虑了国际化和本地...

    httpclient4.2+httpcore4.0.rar

    hiveserver2的jdbc调用时需要用到的两个包httpclient+httpcore. org.apache.http.*

    HttpClient 4.3.6 帮助文档

    HttpClient 4.3.6 api文档,支持目录,索引,搜索。

    httpclient-4.2.5-API文档-中文版.zip

    包含翻译后的API文档:httpclient-4.2.5-javadoc-API文档-中文(简体)版.zip; Maven坐标:org.apache.httpcomponents:httpclient:4.2.5; 标签:apache、httpcomponents、httpclient、中文文档、jar包、java; 使用...

    HttpClient中文文档,快速开发

    这个标题"HttpClient中文文档,快速开发"表明我们有了一份关于HttpClient的中文版使用指南,对于快速理解和应用HttpClient进行开发来说非常有价值。 HttpClient允许开发者执行各种HTTP方法,如GET、POST、PUT、...

    httpclient 4.5 api文档

    ### httpclient 4.5 API文档知识点概览 #### 一、基础知识 ##### 1.1 请求执行 **1.1.1 HTTP请求** - **定义**:HTTP客户端通过发送HTTP请求来与服务器进行交互。 - **组成**: - 方法(GET、POST等); - URI...

    httpclient-4.5.12-API文档-中文版.zip

    包含翻译后的API文档:httpclient-4.5.12-javadoc-API文档-中文(简体)版.zip; Maven坐标:org.apache.httpcomponents:httpclient:4.5.12; 标签:apache、httpcomponents、httpclient、中文文档、jar包、java; ...

Global site tag (gtag.js) - Google Analytics