2009-08-24 28 views
72

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

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

回答

81

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 方法隧道式的HTTPS连接。
    • 使用 本机Java套接字支持通过SOCKS代理(版本4 & 5)的透明连接。
    • 使用基本,摘要和加密NTLM(NT Lan Manager)方法进行身份验证。
    • 定制认证方法的插件机制。
    • 用于上传大文件的多部分表单POST。
    • 可插拔安全套接字实现,使得用于多线程应用程序 更容易 使用第三方解决方案
    • 连接管理支持。支持设置最大总连接数 以及每台主机的最大连接数 。 检测并关闭陈旧的连接。
    • 自动Cookie处理,用于读取来自 服务器的Set-Cookie:标题,并在适当的时候将其发送回 Cookie:标头。
    • 自定义cookie策略的插件机制。
    • 请求输出流,以避免缓冲任何内容正文 直接流到套接字到 服务器。
    • 通过 直接从套接字流向 服务器,响应输入流以高效地读取响应正文。
    • HTTP/1.0中使用KeepAlive的持续连接和HTTP/1中的持久连接 。1
    • 直接访问服务器发送的响应代码和标头。
    • 设置连接超时的能力。
    • HttpMethods实现命令模式以允许并行 请求和高效重用 连接。
    • 源代码可以在Apache软件许可下免费获得。
+4

+1好答案:很好的例子。伟大的观点。你真的卖Apache HTTP客户端。 – therobyouknow 2010-02-11 17:10:36

+17

尽管文档已经过期。 HttpClient不再是一个具体的类,它是一个接口,因此上面的代码不会工作,因为它试图实例化这个HttpClient接口。相反,你将不得不实例化一个实现HttpClient接口的类,例如DefaultHttpClient。 – therobyouknow 2010-02-16 14:08:09

+3

感觉就像每一个版本都有太多的重大变化......这些年来,这个图书馆变得非常沮丧......现在他们似乎泄漏了我最多设置了20个的池中的连接.... grrrrrr。 – 2012-10-22 19:16:26

8

我同意HttpClient的是一个标准的东西 - 但我猜你正在寻找的选项,以便...

的Restlet提供了HTTP客户端特别为RESTful Web服务interactong设计。

示例代码:

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); 

更多细节

15

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

一些原因,我喜欢它:

  • 提供商 - 创建SOAP泽西1.1/1.2提供商,并消除了需要使用笨重的AXIS我们的JAX-WS调用
  • 过滤器 - 创建数据库记录过滤器以记录整个请求(包括请求/响应头),同时防止记录敏感信息。
  • JAXB - 支持编组到/从对象直接从请求/响应
  • API易于使用

事实上,和的HTTPClient新泽西州在实施和API非常相似。 Jersey还有一个扩展,允许它支持HTTPClient。

一些代码样本与新泽西的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/

了HTTPClient与Jersey客户端: https://blogs.oracle.com/PavelBucek/entry/jersey_client_apache_http_client

4

我可以建议你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)); 

行家依赖

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

我想提Ning Async Http Client Library。我从来没有用过它,但与我过去一直使用的Apache Http Client相比,我的同事对此大加赞赏。我特别感兴趣的是它是基于高性能的异步I/O框架Netty,我更加熟悉并高度重视它。

相关问题