什么是最好的Java库用于HTTP POST、GET等操作?

115

在性能、稳定性和成熟度等方面,使用哪个Java库进行HTTP POST、GET等操作最佳?是否有一种特定的库比其他库更常用?

我的要求是向远程服务器提交HTTPS POST请求。我过去曾使用java.net.*包和org.apache.commons.httpclient.*包。这两种库都能完成工作,但我想听听您的意见/建议。

7个回答

116

我个人认为:Apache HTTP Client

使用示例:

import org.apache.commons.httpclient.*;
import org.apache.commons.httpclient.methods.*;
import org.apache.commons.httpclient.params.HttpMethodParams;

import java.io.*;

public class HttpClientTutorial {

  private static String url = "http://www.apache.org/";

  public static void main(String[] args) {
    // Create an instance of HttpClient.
    HttpClient client = new HttpClient();

    // Create a method instance.
    GetMethod method = new GetMethod(url);

    // Provide custom retry handler is necessary
    method.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, 
            new DefaultHttpMethodRetryHandler(3, false));

    try {
      // Execute the method.
      int statusCode = client.executeMethod(method);

      if (statusCode != HttpStatus.SC_OK) {
        System.err.println("Method failed: " + method.getStatusLine());
      }

      // Read the response body.
      byte[] responseBody = method.getResponseBody();

      // Deal with the response.
      // Use caution: ensure correct character encoding and is not binary data
      System.out.println(new String(responseBody));

    } catch (HttpException e) {
      System.err.println("Fatal protocol violation: " + e.getMessage());
      e.printStackTrace();
    } catch (IOException e) {
      System.err.println("Fatal transport error: " + e.getMessage());
      e.printStackTrace();
    } finally {
      // Release the connection.
      method.releaseConnection();
    }  
  }
}

一些值得注意的特点:

  • 基于标准、纯Java实现HTTP版本1.0和1.1
    • 在可扩展的面向对象框架中全面实现所有HTTP方法(GET、POST、PUT、DELETE、HEAD、OPTIONS和TRACE)。
    • 支持使用HTTPS(SSL上的HTTP协议)加密。
    • 细粒度的非标准配置和跟踪。
    • 通过HTTP代理进行透明连接。
    • 通过CONNECT方法,通过HTTP代理进行隧道化的HTTPS连接。
    • 使用本机Java套接字支持的SOCKS代理(版本4和5)进行透明连接。
    • 使用基本、摘要和加密NTLM(NT Lan Manager)方法进行身份验证。
    • 插件机制用于定制身份验证方法。
    • 用于上传大文件的多部分Form POST。
    • 可插拔的安全套接字实现,使第三方解决方案更易于使用。
    • 连接管理支持用于多线程应用程序中。支持设置最大总连接数以及每个主机的最大连接数。检测并关闭失效的连接。
    • 自动Cookie处理,从服务器读取Set-Cookie:头并在适当时将它们作为Cookie:头发送回去。
    • 插件机制用于自定义Cookie策略。
    • 请求输出流,避免通过直接流式传输到服务器套接字来缓冲任何内容体。
    • 响应输入流,通过直接从服务器套接字流式传输来高效地读取响应体。
    • 使用HTTP / 1.0中的KeepAlive进行持久连接,并使用HTTP / 1.1进行持久性。
    • 直接访问服务器发送的响应代码和标头的能力。
    • 设置连接超时的能力。
    • HttpMethods实现命令模式,允许并行请求和有效地重用连接。
    • 源代码在Apache软件许可下免费提供。

31
文档已经过时。HttpClient不再是具体的类,而是一个接口。因此,上面的代码将无法工作,因为它试图实例化这个HttpClient接口。相反,您需要实例化实现HttpClient接口的类,例如DefaultHttpClient。 - therobyouknow
5
感觉每次更新都有太多重大改变...这个库让我在这些年里感到非常沮丧....现在似乎还会从池中泄漏连接,而我最多只设置了20个连接...真是气死人。 - Dean Hiller
6
现在 Apache HttpClient 似乎已经停止维护,有一个新的 Apache 库可供使用。 - Andrew Aylett
22
亲爱的投票反对者,这个回答是在将近5年前创建的... - Chris
2
@Chris 最好更新代码片段。 - Amriteya
显示剩余2条评论

28

16

我比较偏爱Jersey,我们在所有项目中都使用1.10版本,并且没有遇到过无法解决的问题。

以下是我喜欢它的一些原因:

  • 提供者 - 在Jersey中创建了soap 1.1/1.2提供程序,消除了使用笨重的AXIS进行JAX-WS调用的需要
  • 过滤器 - 创建了数据库日志记录过滤器,记录整个请求(包括请求/响应头),同时防止敏感信息被记录。
  • JAXB - 支持从请求/响应直接序列化/反序列化对象
  • API易于使用

事实上,HTTPClient和Jersey在实现和API上非常相似。 Jersey还有扩展程序,可以支持HTTPClient。

一些Jersey 1.x的代码示例: https://blogs.oracle.com/enterprisetechtips/entry/consuming_restful_web_services_with

http://www.mkyong.com/webservices/jax-rs/restful-java-client-with-jersey-client/

使用Jersey Client的HTTPClient: https://blogs.oracle.com/PavelBucek/entry/jersey_client_apache_http_client


我建议现在不要使用Jersey,它会带来太多的依赖关系,最糟糕的是,它还有与Spring Web冲突的服务器端依赖关系。 - Erwan Leroux

11

我同意httpclient是一种标准——但我想你正在寻找选项,因此...

Restlet提供了一个专门为与Restful Web服务交互而设计的http客户端。

示例代码:

    Client client = new Client(Protocol.HTTP);
    Request r = new Request();
    r.setResourceRef("http://127.0.0.1:8182/sample");
    r.setMethod(Method.GET);
    r.getClientInfo().getAcceptedMediaTypes().add(new Preference<MediaType>(MediaType.TEXT_XML));
    client.handle(r).getEntity().write(System.out);

详细信息请参见https://restlet.talend.com/


7

我想提到Ning Async Http Client Library。虽然我从来没有使用过它,但是我的同事对它比起我一直使用的Apache Http Client大加赞赏。尤其让我感兴趣的是它基于Netty,这是一个高性能的异步I/O框架。我更加熟悉Netty并且对其非常看重。


6

我可以向你推荐corn-httpclient。它简单易用,速度快,并且对大多数情况都足够。

HttpForm form = new HttpForm(new URI("http://localhost:8080/test/formtest.jsp"));
//Authentication form.setCredentials("user1", "password");
form.putFieldValue("input1", "your value");
HttpResponse response = form.doPost();
assertFalse(response.hasError());
assertNotNull(response.getData());
assertTrue(response.getData().contains("received " + val));

Maven 依赖

<dependency>
    <groupId>net.sf.corn</groupId>
    <artifactId>corn-httpclient</artifactId>
    <version>1.0.0</version>
</dependency>

6

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接