HttpClient 教程 (五)
第五章 HTTP客户端服务
5.1 HttpClient门面
HttpClient接口代表了最重要的HTTP请求执行的契约。它没有在请求执行处理上强加限制或特殊细节,而在连接管理,状态管理,认证和处理重定向到具体实现上留下了细节。这应该使得很容易使用额外的功能,比如响应内容缓存来装饰接口。
DefaultHttpClient是HttpClient接口的默认实现。这个类扮演了很多特殊用户程序或策略接口实现负责处理特定HTTP协议方面,比如重定向到处理认证或做出关于连接持久化和保持活动的持续时间决定的门面。这使得用户可以选择使用定制,具体程序等来替换某些方面默认实现。
DefaultHttpClient httpclient = new DefaultHttpClient();httpclient.setKeepAliveStrategy(new DefaultConnectionKeepAliveStrategy() {@Overridepublic long getKeepAliveDuration(HttpResponse response,HttpContext context) {long keepAlive = super.getKeepAliveDuration(response, context);if (keepAlive == -1) {// 如果keep-alive值没有由服务器明确设置,那么保持连接持续5秒。keepAlive = 5000;}return keepAlive;}});
DefaultHttpClient也维护一组协议拦截器,意在处理即将离开的请求和即将到达的响应,而且提供管理那些拦截器的方法。新的协议拦截器可以被引入到协议处理器链中,或在需要时从中移除。内部的协议拦截器存储在一个简单的java.util.ArrayList中。它们以被加入到list中的自然顺序来执行。
DefaultHttpClient httpclient = new DefaultHttpClient();httpclient.removeRequestInterceptorByClass(RequestUserAgent.class);httpclient.addRequestInterceptor(new HttpRequestInterceptor() {public void process(HttpRequest request, HttpContext context)throws HttpException, IOException {request.setHeader(HTTP.USER_AGENT, "My-own-client");}});
DefaultHttpClient是线程安全的。建议相同的这个类的实例被重用于多个请求的执行。当一个DefaultHttpClient实例不再需要而且要脱离范围时,和它关联的连接管理器必须调用ClientConnectionManager#shutdown()方法关闭。
HttpClient httpclient = new DefaultHttpClient();// 做些有用的事httpclient.getConnectionManager().shutdown();
5.2 HttpClient参数
- 'http.protocol.handle-redirects':定义了重定向是否应该自动处理。这个参数期望得到一个java.lang.Boolean类型的值。如果这个参数没有被设置,HttpClient将会自动处理重定向。
- 'http.protocol.reject-relative-redirect':定义了是否相对的重定向应该被拒绝。HTTP规范需要位置值是一个绝对URI。这个参数期望得到一个java.lang.Boolean类型的值。如果这个参数没有被设置,那么就允许相对重定向。
- 'http.protocol.max-redirects':定义了要遵循重定向的最大数量。这个重定向数字的限制意在防止由破碎的服务器端脚本引发的死循环。这个参数期望得到一个java.lang.Integer类型的值。如果这个参数没有被设置,那么只允许不多余100次重定向。
- 'http.protocol.allow-circular-redirects':定义环形重定向(重定向到相同路径)是否被允许。HTTP规范在环形重定向没有足够清晰的允许表述,因此这作为可选的是可以开启的。这个参数期望得到一个java.lang.Boolean类型的值。如果这个参数没有被设置,那么环形重定向就不允许。
- 'http.connection-manager.factory-class-name':定义了默认的ClientConnectionManager实现的类型。这个参数期望得到一个java.lang.String类型的值。如果这个参数没有被设置,对于每个默认的将使用SingleClientConnManager。
- 'http.virtual-host':定义了在头部信息Host中使用的虚拟主机名称,来代替物理主机名称。这个参数期望得到一个HttpHost类型的值。如果这个参数没有被设置,那么将会使用目标主机的名称或IP地址。
- 'http.default-headers':定义了每次请求默认发送的头部信息。这个参数期望得到一个包含Header对象的java.util.Collection类型值。
- 'http.default-host':定义了默认主机。如果目标主机没有在请求URI(相对URI)中明确指定,那么就使用默认值。这个参数期望得到一个HttpHost类型的值。
5.3 自动重定向处理
HttpClient处理所有类型的自动重定向,除了那些由HTTP规范明令禁止的,比如需要用户干预的。参考其它(状态码303)POST和PUT请求重定向转换为由HTTP规范需要的GET请求。
5.4 HTTP客户端和执行上下文
DefaultHttpClient将HTTP请求视为不变的对象,也从来不会假定在请求执行期间改变。相反,它创建了一个原请求对象私有的可变副本,副本的属性可以基于执行上下文来更新。因此,如目标主键和请求URI的final类型的请求参数可以在请求执行之后,由检查本地HTTP上下文来决定。
DefaultHttpClient httpclient = new DefaultHttpClient();HttpContext localContext = new BasicHttpContext();HttpGet httpget = new HttpGet("http://localhost:8080/");HttpResponse response = httpclient.execute(httpget, localContext);HttpHost target = (HttpHost) localContext.getAttribute(ExecutionContext.HTTP_TARGET_HOST);HttpUriRequest req = (HttpUriRequest) localContext.getAttribute(ExecutionContext.HTTP_REQUEST);System.out.println("Target host: " + target);System.out.println("Final request URI: " + req.getURI());System.out.println("Final request method: " + req.getMethod());
HttpClient 教程 (五)的更多相关文章
- CRL快速开发框架系列教程五(使用缓存)
		本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ... 
- C#微信公众号开发系列教程五(接收事件推送与消息排重)
		微信公众号开发系列教程一(调试环境部署) 微信公众号开发系列教程一(调试环境部署续:vs远程调试) C#微信公众号开发系列教程二(新手接入指南) C#微信公众号开发系列教程三(消息体签名及加解密) C ... 
- 无废话ExtJs 入门教程五[文本框:TextField]
		无废话ExtJs 入门教程五[文本框:TextField] extjs技术交流,欢迎加群(201926085) 继上一节内容,我们在表单里加了个两个文本框.如下所示代码区的第42行位置,items: ... 
- Android Studio系列教程五--Gradle命令详解与导入第三方包
		Android Studio系列教程五--Gradle命令详解与导入第三方包 2015 年 01 月 05 日 DevTools 本文为个人原创,欢迎转载,但请务必在明显位置注明出处!http://s ... 
- Laravel教程 五:MVC的基本流程
		Laravel教程 五:MVC的基本流程 此文章为原创文章,未经同意,禁止转载. Controller 期间受到很多私事影响,终于还是要好好写写laravel的教程了. 上一篇我们说了数据库和Eloq ... 
- WCF入门教程五[WCF的通信模式]
		一.概述 WCF在通信过程中有三种模式:请求与答复.单向.双工通信.以下我们一一介绍. 二.请求与答复模式 描述: 客户端发送请求,然后一直等待服务端的响应(异步调用除外),期间处于假死状态,直到服务 ... 
- NGUI系列教程五(角色信息跟随)
		在一些网络游戏中,我们常常可以看到角色的上方显示着角色的名称,等级,血量等信息.它们可以跟随角色移动,并且可以显示和隐藏.今天我们就来学习一下这些功能的实现方法.1. 新建unity工 程,导入NGU ... 
- 黄聪:Microsoft Enterprise Library 5.0 系列教程(五) Data Access Application Block
		原文:黄聪:Microsoft Enterprise Library 5.0 系列教程(五) Data Access Application Block 企业库数据库访问模块通过抽象工厂模式,允许用户 ... 
- 无废话WCF入门教程五[WCF的通信模式]
		一.概述 WCF在通信过程中有三种模式:请求与答复.单向.双工通信.以下我们一一介绍. 二.请求与答复模式 描述: 客户端发送请求,然后一直等待服务端的响应(异步调用除外),期间处于假死状态,直到服务 ... 
随机推荐
- eclipse git提交代码
			1.安装git 2.安装好后,进行,一个简单配置,填入我们的用户名和邮箱 >>Preferences>Team>Git>Configuration 设置自定义仓库 3.登 ... 
- tomcat 如何查看tomcat版本及位数
			tomcat 如何查看tomcat版本及位数 CreationTime--2018年8月31日10点16分 Author:Marydon 1.tomcat展示 2.具体操作 实现方式:在cmd命令 ... 
- Timus 1149. Sinus Dances 打印复杂公式
			就是打印以下这两个复杂的式子: Let An = sin(1–sin(2+sin(3–sin(4+-sin(n))-) Let Sn = (-(A1+n)A2+n–1)A3+-+2)An+1 For ... 
- ORACLE检查死锁
			一.数据库死锁的现象程序在执行的过程中,点击确定或保存按钮,程序没有响应,也没有出现报错.二.死锁的原理当对于数据库某个表的某一列做更新或删除等操作,执行完毕后该条语句不提交,另一条对于这一列数据做更 ... 
- springMVC + hadoop + httpclient 文件上传请求直接写入hdfs
			1.首先是一个基于httpclient的java 应用程序,代码在这篇文章的开头:点击打开链接 2.我们首先写一个基于springMVC框架的简单接收请求上传的文件保存本地文件系统的demo,程序代码 ... 
- 深入了解MyBatis参数
			参考1 参考2 参考3 
- cxf之Exception in thread "main" java.lang.NoSuchMethodError: org.apache.cxf.jaxrs.provider.ProviderFactory.<init>(Lorg/apache/cxf/Bus;)V
			pom.xml中关于cxf的配置jar包冲突??? 1.http://blog.csdn.net/yzl_8877/article/details/53216923 2.https://www.cnb ... 
- HDUOJ -----1864  最大报销额(动态规划)
			最大报销额 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submi ... 
- HDUOJ----1250 Hat's Fibonacci
			Hat's Fibonacci Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)T ... 
- RHEL7 -- 识别文件系统和设备
			逻辑卷依赖于设备映射程序(DM)内核驱动程序. 比如有个逻辑卷组rhel中有一个逻辑卷root,对应的设备为/dev/rhel/root.符号链接/dev/rhel/root指向/dev/dm-< ... 
