copy from :http://hi.baidu.com/nickshen3/blog/item/c56528a4bbf8bffe9152ee71.html
关于HttpClient不多说,可以到apache网站下载,网上文档的也多如牛毛。针对HttpClient-3.1,我认为比较重要的一部分就是配置HTTP的参数。实际上,按HttpClient默认的参数配置也可以做简单的应用,其中对于参数配置问题,我觉得虽然比较乱,但是掌握了HttpClient应用参数继承的继承机制,就非常明白了。
HttpClient-3.1中,参数继承结构如图所示:
global--+ | DefaultHttpParams
| |
client | HttpClient
| |
+-- connection manager | HttpConnectionManager
| | |
| +-- connection | HttpConnection
| |
+-- host | HostConfiguration
| |
+-- method | HttpMethod
HttpClient中配置HTTP参数通过上面的继承结构可以看到,HttpClient在参数配置上分为6个级别,分别为:global、client、connection manager、connection、host、method。下面结合HttpClient-3.1的文档和源代码,说说这6个级别的含义。
HttpClient参数配置因为分为6个级别,可能导致在HttpClient参数的重复配置。但是,文档上也说明了,HttpClient在工作的过程中,是按照继承层次查找参数配置,如果在某个最低级别上没有配置某个参数,程序会自动向上一级别查找,直到查找到该参数在某个级别中被配置过,然后运行时按照,距离参数配置级别最低层最近的原则,进行配置。如果都没有配置,自然就按global级别执行。
当你创建HttpClient和HttpMethod实例的时候,可以不用配置就执行HttpMethod,它会按照global级别配置,如果你对它们进行了配置,而且参数配置级别低于global级别,global级别参数配置就被覆盖。通过上面的继承层次可以看到,每个不同的级别都对应着一个实体,从高到低依次为DefaultHttpParams、HttpClient、HttpConnectionManager、HttpConnection、HostConfiguration、HttpMethod。
关于各个级别是如何规定的,并在都可以配置哪些参数,可以参考Apache官方网站帮助文档http://hc.apache.org/httpclient-3.x/preference-api.html,下面举个例子说明一下:
主要通过使用http.socket.timeout参数,其中,HttpClient、HttpConnectionManager、HttpMethod都可以对干参数进行配置,代码如下所示:
package org.shirdrn.test;
import java.io.IOException;
import org.apache.commons.httpclient.HostConfiguration;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpException;
import org.apache.commons.httpclient.HttpMethodBase;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.httpclient.URI;
import org.apache.commons.httpclient.URIException;
import org.apache.commons.httpclient.methods.GetMethod;
public class MyHttpClient {
private HttpClient client;
private HttpMethodBase method;
private String stringData;
public MyHttpClient() {
this.client = new HttpClient();
this.method = new GetMethod();
}
public void setParams(String url) throws URIException, NullPointerException {
this.client.getParams().setParameter("http.socket.timeout", 1); // 为HttpClient设置参数
this.client.getHttpConnectionManager().getParams().setParameter("http.socket.timeout", 1); // 为HttpConnetionManager设置参数
this.method.getParams().setParameter("http.socket.timeout", 10000); // 为HttpMethod设置参数
HostConfiguration hostConf = new HostConfiguration();
hostConf.setHost(new URI(url, true));
this.client.setHostConfiguration(hostConf);
}
public void execute() throws HttpException, IOException {
int status = this.client.executeMethod(this.method);
if(status == HttpStatus.SC_OK) {
this.stringData = new String(this.method.getResponseBody(), "gb2312");
}
}
public void print() {
System.out.println(this.stringData);
}
public static void main(String[] args) {
MyHttpClient client = new MyHttpClient();
try {
client.setParams("http://www.csdn.net");
client.execute();
client.print();
} catch (Exception e) {
e.printStackTrace();
}
}
}
上面程序中,分别对HttpClient、HttpConnectionManager、HttpMethod三个级别配置了http.socket.timeout参数,直接运行可以看到指定网站的页面数据被下载下来,可见,是HttpMethod设置的超时参数起作用了。所以它的级别在上述三个级别中是最低的。
可以测试一下,将HttpConnectionManager、HttpMethod设置的参数全部注释掉,再执行上述程序,就会发生Socket超时异常:
java.net.SocketTimeoutException: Read timed out
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(SocketInputStream.java:129)
at java.io.BufferedInputStream.fill(BufferedInputStream.java:218)
at java.io.BufferedInputStream.read(BufferedInputStream.java:237)
at org.apache.commons.httpclient.HttpParser.readRawLine(HttpParser.java:78)
at org.apache.commons.httpclient.HttpParser.readLine(HttpParser.java:106)
at org.apache.commons.httpclient.HttpConnection.readLine(HttpConnection.java:1116)
at org.apache.commons.httpclient.HttpMethodBase.readStatusLine(HttpMethodBase.java:1973)
at org.apache.commons.httpclient.HttpMethodBase.readResponse(HttpMethodBase.java:1735)
at org.apache.commons.httpclient.HttpMethodBase.execute(HttpMethodBase.java:1098)
at org.apache.commons.httpclient.HttpMethodDirector.executeWithRetry(HttpMethodDirector.java:398)
at org.apache.commons.httpclient.HttpMethodDirector.executeMethod(HttpMethodDirector.java:171)
at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:397)
at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:323)
at org.shirdrn.test.MyHttpClient.execute(MyHttpClient.java:35)
at org.shirdrn.test.MyHttpClient.main(MyHttpClient.java:49)
因为HttpClient设置了Socket超时时间为1ms,肯定是不能够获取到指定网站的数据的
分享到:
相关推荐
1. HttpClient的安装与引入:如何在项目中添加HttpClient依赖,以及如何配置Maven或Gradle构建工具。 2. 基本用法:介绍如何创建HttpClient实例,发送GET和POST请求,以及处理响应。 3. 进阶特性:包括连接池管理、...
它包含了一些核心的类和接口,如HttpClientConnection(HTTP连接),HttpTransport(HTTP传输)以及HttpParams(HTTP参数)等,用于实现HTTP协议的底层通信。 HTTPClient则在此基础上提供了一个更易于使用的接口,...
- **连接管理器**:理解HttpClient中的HttpConnectionManager接口,以及它的实现类如PoolingHttpClientConnectionManager,学习如何设置连接池参数。 - **认证与安全性**:学习如何处理HTTP基本认证、摘要认证,...
- **HTTP参数bean**: 参数通常是通过特定的bean对象来设置的,这样可以更容易地管理和访问这些参数。 **1.7 HTTP请求执行参数** - **执行参数**: 设置这些参数可以控制请求的执行方式,例如超时时间、重试次数等。...
4. 性能优化:根据实际需求调整HttpClient的配置参数,如连接超时时间、最大连接数等。 总的来说,HTTPClient和HTTPCore是Java进行HTTP通信的重要工具,它们提供了强大的功能和灵活性,使得开发者能够方便地与远程...
1. **初始化与配置**:HttpClient类可能有一个构造函数,允许开发者设置基本的HTTP客户端参数,如主机地址、端口号、超时时间等。 2. **请求方法**:HttpClient应支持常见的HTTP请求方法,如GET、POST、PUT、DELETE...
1. 创建HttpClient实例:通常使用HttpClientBuilder构建,可以配置各种参数,如连接池、超时时间等。 2. 构建HttpRequest:根据需求创建HttpRequestBase的子类实例,如HttpGet、HttpPost等。 3. 设置请求头:通过set...
HttpClient 支持指定各种请求参数,如在 URL 查询字符串中添加参数,这可以通过 URIBuilder 类来实现: ```java URI uri = new URIBuilder() .setScheme("http") .setHost("www.google.com") .setPath("/search...
1. HttpClient使用:创建HttpClient实例,配置请求参数,然后通过execute方法发送请求,获取响应。它可以方便地处理各种复杂的HTTP请求场景。 2. 请求与响应处理:HttpClient允许开发者精细控制请求头、请求体、...
在IT行业中,网络通信是不可或缺的一部分,而Apache HttpClient和HttpCore是两个非常重要的库,尤其在Java领域。本文将深入探讨这两个库的功能、用途以及如何结合使用它们来实现高效的HTTP客户端编程,包括处理支付...
在HttpClient中,我们需要创建一个`SSLContext`实例,并使用`SSLSocketFactory`来配置连接管理器。以下是一个简单的示例: ```java // 导入必要的库 import org.apache....
HttpClient是Apache基金会开发的一个Java库,用于执行HTTP请求。它为开发者提供了强大的功能,可以方便地...在项目中,HttpClient的依赖通常保存在`lib`目录下,而项目配置信息则由`.classpath`和`.project`文件维护。
在实际应用中,你需要根据项目需求配置HttpClient实例,例如选择合适的连接管理器、设置超时、添加身份验证等。同时,注意HttpClient库已经不再更新,对于新的Java项目,推荐使用现代化的HTTP客户端库,如Apache ...
1. **创建HttpClient实例**:通过`HttpClientBuilder`构建`CloseableHttpClient`实例,可以配置连接池、超时时间、重试策略等参数。 2. **构建请求**:使用`HttpGet`或`HttpPost`等类,设置请求的URL、Header信息等...
在Java编程中,HttpClient提供了一个强大的API,允许我们创建自定义的HTTP请求,设置请求头,携带参数,处理响应等。以下是一些使用HttpClient的关键知识点: 1. **HttpClient对象创建**:首先,我们需要创建一个...
在Java编程中,HttpClient是一个非常重要的工具库,用于发送HTTP请求和处理响应。这个工具广泛应用于各种场景,如数据抓取、API交互等。本文将深入讲解如何使用HttpClient来发送HTTP请求,以及相关的源码分析。 ...
7. **HttpClientBuilder**:用于构建和配置HttpClient实例,这样可以更灵活地设置各种参数。 在使用HttpClient时,你需要先添加对应的jar包到项目中。在给定的文件名`httpcomponents-client-4.2.5`中,我们可以推断...
通常,我们创建一个HttpClient实例,并设置其配置参数,如连接超时、重试策略等。 2. **HttpHost**:表示目标HTTP服务器的信息,包括主机名、端口和协议(HTTP或HTTPS)。 3. **HttpGet/HttpPost**:这些是执行...
10. **配置和定制**:HttpClient具有高度可配置性,可以根据项目需求调整连接超时、读取超时、连接池大小等参数。 在实际使用中,开发者还需要根据项目的具体需求,考虑是否需要引入其他辅助库,如处理JSON的Gson或...
- **HTTP参数** - 详述了参数的层次结构和HTTP参数beans的使用。 - **HTTP请求执行参数** - 描述了执行HTTP请求时可以配置的参数。 4. **连接管理** - 包括: - **连接参数** - 介绍与连接相关的各种参数设置。 ...