`

HttpClient优化指南

阅读更多

简介

默认情况下HttpClient配置为了提供最大的可靠性和标准遵从性而非性能。有多个配置选项和优化技术能够显著提高HttpClient的性能。此指南列出了实现HttpClient的性能最大化的各种技术。

内容

  • 重用HttpClient实例
  • 连接持久性
  • 并发执行HTTP方法
  • 请求/响应实体流
  • 期望继续握手
  • 陈旧连接检查
  • Cookie处理

重用HttpClient实例

一般,推荐的做法每个通信组件或甚至每个应用程序都只有一个HttpClinet的实例,如果应用程序很少使用HttpClient,在内存中保持闲置HttpClient实例是不恰当的,我们极力建议您显式关闭多线程连接管理器的之前先释放HttpClient的实例,这将确保正确地关闭HTTP连接池中的所有连接。

连接持久性

HttpClient重复使用连接是好的做法。连接持久性默认就开启了,并不需要特别的配置,但是在某些情况下这可能会导致泄露,因此失去了资源的连接。最简单方法就是禁用连接持久性,提供或扩展一个在连接管理器,并在其releaseConnection方法中强制关闭释放连接。

并发执行HTTP方法

如果应用程序逻辑允许并发执行多个HTTP请求(也就是说,针对不同站点的多个请求,或是代表不同的用户身份的多个请求),每个HTTP会话中使用一个专门的线程可能会产生重大的性能提升。当使用一个线程安全的连接管理器(如MultiThreadedHttpConnectionManage)时,HttpClient完全线程安全的。请注意,每个执行的线程都必须具有它自己的HttpMethod类的实例,并且可以具有HttpState或(和) 表示一个特定的主机配置HostConfiguration本地实例和会话状态。同时,为了最大效率,HttpClient实例和连接管理器在所有的线程中共享。 HttpClient的使用多个线程的详细信息,请参阅HttpClient线程指南。

请求/响应实体流

HttpClient具有高效处理请求/响应正文流的能力。大型实体可能在内存中设置缓存下提交或接收。如果同时执行多个HTTP方法,这尤其重要。虽然有便利的方法来处理实体,诸如字符串或字节数组,但是都不是最好的处理方法。除非小心地使用,它们很容易导致内存不足的情况,因为它们暗示着内存中的缓冲完整实体。 响应流:建议使用 HttpMethod#getResponseBodyAsStream的方法把HTTP响应内容作为字节/字符流来处理。强烈不建议使用HttpMethod#getResponseBody 和 HttpMethod#getResponseBodyAsString。

HttpClient httpclient = new HttpClient();
 GetMethod httpget = new GetMethod("http://www.myhost.com/");
  try {
    httpclient.executeMethod(httpget);
    Reader reader = new InputStreamReader(
    httpget.getResponseBodyAsStream(), httpget.getResponseCharSet());
// consume the response entity
  } finally {
httpget.releaseConnection();
  }

请求流:遇到的主要的困难是实体流包装的一些方法在认证失败或者是IO失败需要重试。显然,非缓冲实体无法重新读取和重新提交。建议的方法是创建一个能够重建基础的输入流自定义请求实体(RequestEntity)。

public class FileRequestEntity implements RequestEntity {

    private File file = null;

    public FileRequestEntity(File file) {
        super();
        this.file = file;
    }

    public boolean isRepeatable() {
        return true;
    }

    public String getContentType() {
        return "text/plain; charset=UTF-8";
    }

    public void writeRequest(OutputStream out) throws IOException {
        InputStream in = new FileInputStream(this.file);
        try {
            int l;
            byte[] buffer = new byte[1024];
            while ((l = in.read(buffer)) != -1) {
                out.write(buffer, 0, l);
            }
        } finally {
            in.close();
        }
    }

    public long getContentLength() {
        return file.length();
    }

}

File myfile = new File("myfile.txt");
PostMethod httppost = new PostMethod("/stuff");
httppost.setRequestEntity(new FileRequestEntity(myfile));

期待继续握手

HTTP 100的状态的目的就是,在客户端发送请求实体前,允许客户端发送一个请求实体去确认目标服务器将是否接受此请求(基于请求头)。如果服务器拒绝了此次请求而没有去查看请求正文,那么对于客户端来说是非常低效率的。基于请求头的请求被拒绝的最常见的原因就是身份验证失败。因此,'期望继续'握手的用法是特别推荐这些需要HTTP身份验证的目标服务器。 从事旧HTTP1.0代理服务器必须慎重对待,因为可能无法正确处理'期望继续'握手。 更多的信息http.protocol.expect-continue 参数文档。

陈旧的连接检查

HTTP规范允许客户端和服务器随时终止持续(keep-alive)连接而无须通知对方的,这就会让连接无效或 陈旧。默认情况下,在执行请求之前,HttpClient执行检查去确认连接是否已陈旧,这个操作耗时15-30毫秒,依赖于使用的JRE(JDK)。禁用陈旧的连接的检查可能会有轻微的性能提升,尤其是对小有效载荷的响应,但是在执行一个服务端已关闭的连接时将冒着IO错误的风险。

Cookie处理

如果一个应用程序,像网络爬虫,不需要维护与目标服务器的会话状态,禁用Cookie处理能够获取小的性能提升。关于Cookie处理详细的信息,请参考HttpClient Cookie指南。

分享到:
评论

相关推荐

    HTTPCLIENT 中文指南

    ### HTTPCLIENT 中文指南知识点详解 #### 一、HttpCore概览 **1.1 HTTP报文** **1.1.1 结构** HTTP报文主要由头部和可选的内容体构成。对于HTTP请求报文而言,头部由请求行和一系列头部字段组成;而HTTP响应报文...

    httpclient 4 中文指南

    这个中文指南是官方翻译版,旨在帮助开发者更好地理解和使用HttpClient。 1. **HTTP 请求与响应**: - **HTTP请求**:HttpClient允许创建和执行各种HTTP方法,如GET、POST、PUT、DELETE等。开发者可以自定义请求头...

    HttpClient 3.x to HttpComponents HttpClient 4.x

    综上所述,升级到HttpComponents HttpClient 4.x是一个复杂的过程,涉及到对新API的深入学习,理解新的编程模型和网络编程的优化。升级的好处包括性能的提升、更好的错误处理机制以及对最新HTTP协议特性的支持。通过...

    HttpClient中文文档,快速开发

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

    httpclient4.4

    8. **错误处理**:HttpClient 4.4对错误处理进行了优化,提供了更丰富的异常类,便于开发者定位和解决网络通信问题。 9. **国际化支持**:HttpClient 4.4支持多种字符集编码,满足了全球化应用的需求。 10. **测试...

    HttpClient4.5 Jar包

    在使用HttpClient 4.5时,可以通过"使用说明.txt"文件获取详细的配置和使用指南,了解如何导入httpclient-4.5所需jar包,以及如何创建和配置HttpClient实例,进行GET、POST等请求,处理响应,管理连接和会话,以及...

    httpclient手册

    《HttpClient手册》是针对Java开发者的实用指南,主要聚焦于Apache HttpClient库的使用,这个库在构建网络应用程序,特别是处理HTTP请求和响应时非常常见。HttpClient是一个强大的客户端编程工具包,它提供了丰富的...

    httpClient4.3文档 PDF

    这个压缩包包含两份文档,一份是.docx格式,一份是.pdf格式,两者内容相同,都是关于HttpClient 4.3的中文版指南。 HttpClient的核心功能在于它能够创建和管理HTTP连接,发送请求,接收响应,并支持各种HTTP方法如...

    httpClient4 最新帮助文档

    HttpClient 4的最新帮助文档会详细讲解这些知识点,并可能包含示例代码和故障排查指南,帮助开发者更好地理解和使用这个强大的HTTP客户端库。通过深入学习和实践,可以有效地处理各种HTTP通信需求。

    httpclient-4.5.5

    二、HttpClient 4.5.5 使用指南 1. **初始化配置**:创建一个 HttpClient 实例,通常会涉及设置连接池、超时、重试策略等。例如: ```java CloseableHttpClient httpClient = HttpClients.custom() ....

    commons-httpclient-3.1jar

    这有助于优化性能,特别是在需要频繁通信或长时间保持连接的情况下。 3. **Cookie管理**: HttpClient支持Cookie规范,能够自动处理服务器返回的Cookie,并在后续请求中自动添加。同时,也支持自定义Cookie策略以...

    HttpClient

    `HttpClient-4.0.1+官方教程.pdf`则提供了HttpClient 4.0.1及后续版本的官方指南,通常会包含最新的特性和最佳实践。 学习HttpClient时,应关注其配置、连接管理、错误处理以及与其他网络库(如OkHttp)的对比。...

    httpclient资料

    通过学习HttpClient的用户指南,开发者可以有效地实现高效、可靠的网络通信,而HttpCore则提供了底层的HTTP处理能力,为HttpClient提供了坚实的基础。无论是初学者还是经验丰富的开发者,深入理解和掌握这两个库都能...

    httpclient完美教程

    《HttpClient完美教程》是一本专为Java开发者设计的详尽指南,主要聚焦于HttpClient库的使用,该库是Java环境中进行HTTP网络编程的重要工具。HttpClient允许开发者构建高效、灵活且可扩展的网络应用,能够执行复杂的...

    HtmlParser和HttpClient学习资料

    - HttpClient的使用指南:详述如何利用HttpClient发送HTTP请求并处理响应。 - 网络爬虫项目实例:提供完整的爬虫代码,供学习者参考和实践。 - 爬虫进阶话题:可能涵盖反爬虫策略、多线程爬虫、数据清洗等高级主题。...

    Android高级应用源码-通过httpclient获取到JSON数据,展示到ListView.zip

    9. **性能优化**:在处理大量数据时,可能需要使用`ViewHolder`模式优化ListView的滚动性能,避免不必要的视图复用。 10. **本源码使用帮助.txt**:这个文件可能是提供给开发者的一份简短指南,解释了如何导入和...

    网络机器人Java编程指南源代码

    总的来说,学习和理解"网络机器人Java编程指南源代码"将使开发者深入掌握Java网络编程、HTML解析、数据处理和并发控制等重要技能,这对于任何想要从事数据抓取、搜索引擎优化或网站分析的IT专业人员都是极其宝贵的...

    QHttpClient:秦晋之巅-HttpClient

    《QHttpClient:秦晋之巅-HttpClient的深度解析与实战指南》 在Java的世界里,HttpClient作为一款强大的HTTP客户端库,被广泛应用于网络请求的发送和处理。QHttpClient,一个基于HttpClient的项目,旨在提供更加...

Global site tag (gtag.js) - Google Analytics