5.1 HttpClient门面
HttpClient接口代表了最重要的HTTP请求执行的契约。它没有在请求执行处理上强加限制或特殊细节,而在连接管理,状态管理,认证和处理重定向到具体实现上留下了细节。这应该使得很容易使用额外的功能,比如响应内容缓存来装饰接口。
DefaultHttpClient是HttpClient接口的默认实现。这个类扮演了很多特殊用户程序或策略接口实现负责处理特定HTTP协议方面,比如重定向到处理认证或做出关于连接持久化和保持活动的持续时间决定的门面。这使得用户可以选择使用定制,具体程序等来替换某些方面默认实现。
DefaultHttpClient httpclient = new DefaultHttpClient();
httpclient.setKeepAliveStrategy(new DefaultConnectionKeepAliveStrategy() {
@Override
public 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参数
这些是可以用于定制默认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接口代表了最重要的HTTP请求执行的契约。它没有在请求执行处理上强加限制或特殊细节,而在连接管理,状态管理,认证和处理重定向到具体实现上留下了细节。这应该使得很容易使用额外的功能,比如响应内容缓存来装饰接口。
DefaultHttpClient是HttpClient接口的默认实现。这个类扮演了很多特殊用户程序或策略接口实现负责处理特定HTTP协议方面,比如重定向到处理认证或做出关于连接持久化和保持活动的持续时间决定的门面。这使得用户可以选择使用定制,具体程序等来替换某些方面默认实现。
DefaultHttpClient httpclient = new DefaultHttpClient();
httpclient.setKeepAliveStrategy(new DefaultConnectionKeepAliveStrategy() {
@Override
public 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参数
这些是可以用于定制默认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());
发表评论
-
代码混淆
2013-05-18 14:31 836代码混淆: http://wenku.baidu.com/ ... -
apk签名方法
2012-12-17 14:36 859签名证书,方式相同包名的不同apk互相覆盖安装。 1. ... -
Ubuntu安装Android开发环境
2012-11-17 00:38 17081、JDK安装 在下载JDK,官网地址为:http://ww ... -
Android之完美退出所有activity方法
2012-07-10 18:52 1064/*还有一种比较流行的Android经典完美退出方法,使用单例 ... -
android 焦点问题
2012-06-04 12:31 4046参考地址:http://blog.csdn.net/zhang ... -
Android报表工具
2012-05-11 16:11 1399Android报表工具下载地址:http://code.goo ... -
Android 推送
2012-04-01 13:44 1406关于服务器端向Android客户端的推送,主要有三种方 ... -
HttpClient 教程 (六)
2012-03-21 13:26 826HttpClient 教程 (六) 第六章 高级主题 6.1 ... -
HttpClient 教程 (五)
2012-03-21 13:26 898第五章 HTTP客户端服务 5.1 HttpClient门 ... -
HttpClient 教程 (四)
2012-03-21 13:26 1058第四章 HTTP认证 HttpClient ... -
HttpClient 教程 (三)
2012-03-21 13:26 1260HttpClient 教程 (三) 第三章 HTTP状态管理 ... -
HttpClient 教程 (二)
2012-03-20 15:48 1056HttpClient 教程 (二) 第二章 连接管理 Htt ... -
HttpClient 教程 (一)
2012-03-20 15:47 990HttpClient 教程 (一) 前言 ... -
Android 网络开发详解
2012-03-19 16:41 1219// 创建一个 HttpClient 实例 // 注意 H ... -
关于虚拟机AVD:Android Virtual Devices
2012-03-15 15:51 9721.拷贝虚拟SD卡文件至本地: DDMS视图->File ... -
向SD卡写文件
2012-03-15 15:47 989AndroidManifest.xml: SD卡创建与删除文 ... -
Android 近百个项目的源代码,覆盖Android开发的每个领域
2012-03-08 12:18 871Android PDF 阅读器 http://sourcefo ... -
关于谷歌地图的问题:requires unavailable shared library com.google.android.maps
2012-03-08 09:28 6486关于谷歌地图和百度地图的抉择: 补充:http://news ... -
Android Google Maps API key 申请
2012-03-07 15:17 20081.找debug.keystore文件路径: Eclipse- ... -
Android的断点设置
2012-03-07 14:46 3905Note: 在onCreate方法中加入Debug.waitF ...
相关推荐
基于Http客户端服务器Demo,服务器是轻量级的HTTP框架,客户端有用到线程池哦,记得是跑在linux环境上的,打开压缩包,会有一个server,client文件夹,本来一个make就可以编译运行demo,但是代码是我的IP,所以亲爱的您...
此代码用c++实现了http客户端的编写,其中包括了多字节转utf8(已在ExecuteRequest函数中实现,不用再引用所给的编码转换),get和post两种请求方式,后面有json数据的解析以及实现,详情可去博客...
本实验课主要涵盖了HTTP客户端与服务器以及RMI客户端和服务器的使用,旨在帮助学习者理解网络通信的基本原理和实现方式。 首先,我们来详细探讨HTTP(超文本传输协议)。HTTP是互联网上应用最广泛的一种网络协议,...
本描述中的工具“DaoyiHttp”就是一个这样的工具,它具备双重功能:既可以模拟HTTP客户端进行请求,也可以作为HTTP服务端来模拟不同的返回情况。这对于开发、调试、测试HTTP应用程序非常有用。 作为HTTP客户端,...
在这个场景下,我们关注的是使用VC++(Microsoft Visual C++)来实现HTTP客户端和服务器端的功能。本文将详细讲解如何利用VC++进行HTTP GET和POST请求,以及构建HTTP服务器端。 首先,我们要理解HTTP的基本概念。...
接下来,我们转向Qt中的HTTP客户端(qhttpclient)。QHttpClient是Qt网络模块的一部分,用于发起HTTP请求并与服务器进行通信。关键特性包括: 1. **请求构造**:开发者可以轻松构建GET、POST、PUT、DELETE等各种...
首先,客户端-服务器架构是一种分布式计算模型,其中服务器负责处理请求并提供服务,而客户端则发送请求并接收响应。在VC++环境中,我们可以利用Windows套接字(Winsock)API来构建这种通信模型。Winsock是Windows...
"Java HTTP 客户端" Java HTTP 客户端是指使用 Java 语言实现的 HTTP 客户端程序,它能够根据给定的 URL,获得指定 URL 所指向的内容,并对获得的内容进行进一步的解析和处理。下面是关于 Java HTTP 客户端的详细...
本文将深入探讨一个简单的HTTP客户端,该客户端不依赖任何外部组件,而是通过纯代码实现与web服务的通讯。 首先,我们来理解HTTP客户端的基本原理。HTTP客户端负责发起HTTP请求到服务器,请求可能包括GET、POST等...
客户端服务器连接通信是计算机网络中常见的一种交互模式,它基于TCP/IP协议栈,广泛应用于互联网服务,如HTTP、FTP、SMTP等。在这个模式中,客户端是发起请求的一方,而服务器则是等待并响应请求的一方。 客户端...
服务器则是一个专门处理客户端请求并提供服务的系统,它存储、处理并返回数据给客户端。 在文件传输过程中,客户端会通过特定的协议(如HTTP、HTTPS、FTP、SFTP等)向服务器发送请求,请求可以是上传文件、下载文件...
STM32LWIP客户端服务器源代码是针对嵌入式系统设计的一个重要示例,它展示了如何在STM32微控制器上实现TCP/IP协议栈,包括客户端和服务器功能。LwIP(Lightweight TCP/IP)是一个轻量级的TCP/IP协议栈,特别适合资源...
Visual Studio 2017 实现HTTP 服务器,客户端请求等
Java提供了一系列API和工具来支持这种通信,如Socket编程、NIO(非阻塞I/O)和HTTP客户端库。 1. **Socket编程**:Java的`java.net.Socket`和`java.net.ServerSocket`类是实现基本TCP/IP通信的基础。客户端创建...
二、HTTP客户端 客户端主要负责发起HTTP请求并接收服务器的响应。在Java中,可以使用`HttpURLConnection`或第三方库如Apache HttpClient来实现。 1. 创建连接:客户端首先需要建立一个到服务器的TCP连接,这同样...
四、构建HTTP客户端 1. 建立SSL连接:客户端同样使用Winsock API创建套接字,但需通过OpenSSL的SSL_CTX对象进行SSL握手,建立安全连接。 2. 发送HTTP请求:在安全连接建立后,客户端构造HTTP请求报文,如GET、POST...
最近的Android项目开发过程中一个问题困扰自己很长时间,Android客户端与服务器交互有几种方式,最常见的就是webservices和json。要在Android手机客户端与pc服务器交互,需要满足下面几种条件:跨平台、传输数据格式...
HTTP客户端是网络编程中的一个重要概念,它用于向服务器发送HTTP请求并接收响应。在这个主题中,我们将深入探讨HTTP客户端的工作原理、C++实现HTTP客户端的关键技术以及如何通过GET、POST和其他HTTP方法进行通信。 ...
此外,为了实现类似QQ的实时通信,客户端还需要用到推送服务,如Google的Firebase Cloud Messaging (FCM)。 3. **数据库**:在数据库层面,一般会使用关系型数据库(如MySQL)来存储用户信息、好友关系、聊天记录等...
`client.py`可能是实现HTTP客户端的部分,它使用`socket`模块来建立与服务器的连接并发送请求。`socket`模块提供了一种在Python中进行网络通信的基本方式。通过创建一个socket对象,我们可以设置TCP连接(HTTP基于...