什么是用于HTTP POST,GET等的最佳Java库?

时间:2009-08-24 13:13:48

标签: java http

在性能,稳定性,成熟度等方面,用于HTTP POST,GET等的最佳Java库是什么?是否有一个特定的库比其他库使用更多?

我的要求是向远程服务器提交HTTPS POST请求。我过去使用过java.net。*包以及org.apache.commons.httpclient。*包。两人都完成了工作,但我想要你的一些意见/建议。

7 个答案:

答案 0 :(得分:94)

imho: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) 可扩展的OO框架。
    • 支持使用HTTPS(HTTP over SSL)协议进行加密。
    • 精细的非标准配置和跟踪。
    • 通过HTTP代理进行透明连接。
    • 通过HTTP代理通过CONNECT进行隧道连接 方法
    • 通过SOCKS代理(版本4和5)使用的透明连接 本机Java套接字支持。
    • 使用Basic,Digest和加密NTLM进行身份验证(NT Lan Manager)方法。
    • 自定义身份验证方法的插件机制。
    • 用于上传大文件的多部分表格POST。
    • 可插拔安全套接字实现,使其更容易 使用第三方解决方案
    • 支持在多线程中使用的连接管理 应用。支持设置 最大总连接数以及 每个主机的最大连接数。 检测并关闭陈旧连接。
    • 自动Cookie处理,用于读取Set-Cookie:标题 服务器并将它们发送回来 Cookie:适当的标题。
    • 自定义Cookie政策的插件机制。
    • 请求输出流以避免缓冲任何内容正文 直接流到套接字 服务器。
    • 响应输入流以有效地读取响应主体 直接从套接字流式传输到 服务器。
    • 在HTTP / 1.0中使用KeepAlive的持久连接和持久性 在HTTP / 1.1
    • 直接访问服务器发送的响应代码和标头。
    • 设置连接超时的功能。
    • HttpMethods实现命令模式以允许并行 要求和有效的再利用 连接。
    • 源代码可在Apache软件许可下免费获得。

答案 1 :(得分:20)

我会推荐Apache HttpComponents HttpClientCommons HttpClient

的继任者http://htmlunit.sourceforge.net/

我还建议你看一下HtmlUnit。 HtmlUnit是一个“用于Java程序的GUI-Less浏览器”。 {{3}}

答案 2 :(得分:16)

我有点偏向Jersey。我们在所有项目中使用1.10,并没有遇到我们用它无法解决的问题。

我喜欢它的一些原因:

  • 提供商 - 在泽西岛创建了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客户端的HTTPClient: https://blogs.oracle.com/PavelBucek/entry/jersey_client_apache_http_client

答案 3 :(得分:10)

我同意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);

有关详细信息,请参阅http://www.restlet.org/

答案 4 :(得分: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>

答案 5 :(得分:3)

Google HTTP Java Client看起来不错,因为它也可以在Android和App Engine上运行。

答案 6 :(得分:3)

我想提一下Ning Async Http Client Library。我曾经从未使用它,但与我过去常用的Apache Http Client相比,我的同事对此赞不绝口。我特别感兴趣的是它基于Netty,这是一个高性能的异步i / o框架,我对此更为熟悉,并且备受推崇。