`
zhangzuanqian
  • 浏览: 270998 次
  • 来自: ...
社区版块
存档分类
最新评论

HttpClient中配置HTTP参数

阅读更多

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,肯定是不能够获取到指定网站的数据的

分享到:
评论

相关推荐

    HttpClient中文文档,快速开发

    1. HttpClient的安装与引入:如何在项目中添加HttpClient依赖,以及如何配置Maven或Gradle构建工具。 2. 基本用法:介绍如何创建HttpClient实例,发送GET和POST请求,以及处理响应。 3. 进阶特性:包括连接池管理、...

    httpclient和httpcore的jar包

    它包含了一些核心的类和接口,如HttpClientConnection(HTTP连接),HttpTransport(HTTP传输)以及HttpParams(HTTP参数)等,用于实现HTTP协议的底层通信。 HTTPClient则在此基础上提供了一个更易于使用的接口,...

    HttpClient4.1.2中英文文档

    - **连接管理器**:理解HttpClient中的HttpConnectionManager接口,以及它的实现类如PoolingHttpClientConnectionManager,学习如何设置连接池参数。 - **认证与安全性**:学习如何处理HTTP基本认证、摘要认证,...

    HttpClient 4.0中文教程

    - **HTTP参数bean**: 参数通常是通过特定的bean对象来设置的,这样可以更容易地管理和访问这些参数。 **1.7 HTTP请求执行参数** - **执行参数**: 设置这些参数可以控制请求的执行方式,例如超时时间、重试次数等。...

    最新官方资源httpclient-4.1.3.jar和httpcore-4.1.4.jar

    4. 性能优化:根据实际需求调整HttpClient的配置参数,如连接超时时间、最大连接数等。 总的来说,HTTPClient和HTTPCore是Java进行HTTP通信的重要工具,它们提供了强大的功能和灵活性,使得开发者能够方便地与远程...

    HttpClient.zip_HTTP_c++ httpclass_c++ httpclient类_http client c+

    1. **初始化与配置**:HttpClient类可能有一个构造函数,允许开发者设置基本的HTTP客户端参数,如主机地址、端口号、超时时间等。 2. **请求方法**:HttpClient应支持常见的HTTP请求方法,如GET、POST、PUT、DELETE...

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

    1. 创建HttpClient实例:通常使用HttpClientBuilder构建,可以配置各种参数,如连接池、超时时间等。 2. 构建HttpRequest:根据需求创建HttpRequestBase的子类实例,如HttpGet、HttpPost等。 3. 设置请求头:通过set...

    httpclient4.3中文教程

    HttpClient 支持指定各种请求参数,如在 URL 查询字符串中添加参数,这可以通过 URIBuilder 类来实现: ```java URI uri = new URIBuilder() .setScheme("http") .setHost("www.google.com") .setPath("/search...

    HttpServer.zip_http servlet server_httpclient_http服务器_java https

    1. HttpClient使用:创建HttpClient实例,配置请求参数,然后通过execute方法发送请求,获取响应。它可以方便地处理各种复杂的HTTP请求场景。 2. 请求与响应处理:HttpClient允许开发者精细控制请求头、请求体、...

    httpclient4.4加httpcore4.4

    在IT行业中,网络通信是不可或缺的一部分,而Apache HttpClient和HttpCore是两个非常重要的库,尤其在Java领域。本文将深入探讨这两个库的功能、用途以及如何结合使用它们来实现高效的HTTP客户端编程,包括处理支付...

    httpclient4.1访问https的配置方法

    在HttpClient中,我们需要创建一个`SSLContext`实例,并使用`SSLSocketFactory`来配置连接管理器。以下是一个简单的示例: ```java // 导入必要的库 import org.apache....

    httpClient

    HttpClient是Apache基金会开发的一个Java库,用于执行HTTP请求。它为开发者提供了强大的功能,可以方便地...在项目中,HttpClient的依赖通常保存在`lib`目录下,而项目配置信息则由`.classpath`和`.project`文件维护。

    commons-httpclient,java中使用httpclient中使用的扩展工具

    在实际应用中,你需要根据项目需求配置HttpClient实例,例如选择合适的连接管理器、设置超时、添加身份验证等。同时,注意HttpClient库已经不再更新,对于新的Java项目,推荐使用现代化的HTTP客户端库,如Apache ...

    httpclient4中文API和使用

    1. **创建HttpClient实例**:通过`HttpClientBuilder`构建`CloseableHttpClient`实例,可以配置连接池、超时时间、重试策略等参数。 2. **构建请求**:使用`HttpGet`或`HttpPost`等类,设置请求的URL、Header信息等...

    HttpClient模拟http浏览器请求

    在Java编程中,HttpClient提供了一个强大的API,允许我们创建自定义的HTTP请求,设置请求头,携带参数,处理响应等。以下是一些使用HttpClient的关键知识点: 1. **HttpClient对象创建**:首先,我们需要创建一个...

    java使用HttpClient发送http请求

    在Java编程中,HttpClient是一个非常重要的工具库,用于发送HTTP请求和处理响应。这个工具广泛应用于各种场景,如数据抓取、API交互等。本文将深入讲解如何使用HttpClient来发送HTTP请求,以及相关的源码分析。 ...

    HttpClient发送http请求需要的jar包

    7. **HttpClientBuilder**:用于构建和配置HttpClient实例,这样可以更灵活地设置各种参数。 在使用HttpClient时,你需要先添加对应的jar包到项目中。在给定的文件名`httpcomponents-client-4.2.5`中,我们可以推断...

    httpclient httpclient.jar

    通常,我们创建一个HttpClient实例,并设置其配置参数,如连接超时、重试策略等。 2. **HttpHost**:表示目标HTTP服务器的信息,包括主机名、端口和协议(HTTP或HTTPS)。 3. **HttpGet/HttpPost**:这些是执行...

    使用HttpClient必须的jar包

    10. **配置和定制**:HttpClient具有高度可配置性,可以根据项目需求调整连接超时、读取超时、连接池大小等参数。 在实际使用中,开发者还需要根据项目的具体需求,考虑是否需要引入其他辅助库,如处理JSON的Gson或...

    httpclient 最新教程

    - **HTTP参数** - 详述了参数的层次结构和HTTP参数beans的使用。 - **HTTP请求执行参数** - 描述了执行HTTP请求时可以配置的参数。 4. **连接管理** - 包括: - **连接参数** - 介绍与连接相关的各种参数设置。 ...

Global site tag (gtag.js) - Google Analytics