在性能,稳定性,成熟度等方面,用于HTTP POST,GET等的最佳Java库是什么?是否有一个特定的库比其他库使用更多?
我的要求是向远程服务器提交HTTPS POST请求.我过去使用过java.net.*包以及org.apache.commons.httpclient.*包.两人都完成了工作,但我想要你的一些意见/建议.
imho:Apache HTTP客户端
用法示例:
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的实现
在可扩展的OO框架中完全实现所有HTTP方法(GET,POST,PUT,DELETE,HEAD,OPTIONS和TRACE).
支持使用HTTPS(HTTP over SSL)协议进行加密.
精细的非标准配置和跟踪.
通过HTTP代理进行透明连接.
通过HTTP代理通过CONNECT方法进行隧道连接.
通过SOCKS代理(版本4和5)使用本机Java套接字支持进行透明连接.
使用Basic,Digest和加密NTLM(NT Lan Manager)方法进行身份验证.
用于自定义身份验证方法的插件机制.
用于上载大文件的多部分表单POST.
可插拔的安全套接字实现,使其更易于使用第三方解决方案
连接管理支持在多线程应用程序中使用.支持设置最大总连接数以及每个主机的最大连接数.检测并关闭陈旧连接.
用于读取Set-Cookie的自动Cookie处理:来自服务器的标头,并在适当时将其发送回Cookie:标头.
用于自定义cookie策略的插件机制.
请求输出流以避免通过直接流式传输到服务器的套接字来缓冲任何内容主体.
响应输入流通过直接从套接字流式传输到服务器来有效地读取响应主体.
使用HTTP/1.0中的KeepAlive和HTTP/1.1中的持久连接的持久连接
直接访问服务器发送的响应代码和标头.
设置连接超时的能力.
HttpMethods实现命令模式以允许并行请求和连接的有效重用.
源代码可在Apache软件许可下免费获得.
我会推荐Apache HttpComponents HttpClient,它是Commons HttpClient的继承者
我还建议你看看HtmlUnit.HtmlUnit是一个"用于Java程序的GUI-Less浏览器". http://htmlunit.sourceforge.net/
我有点偏爱泽西岛.我们在所有项目中使用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
我同意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.TEXT_XML)); client.handle(r).getEntity().write(System.out);
有关详细信息,请参见http://www.restlet.org/
我可以向你推荐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依赖
net.sf.corn corn-httpclient 1.0.0
Google HTTP Java Client对我来说很好,因为它也可以在Android和App Engine上运行。
我想提到Ning Async Http客户端库。我从未使用过它,但与过去我一直使用的Apache Http Client相比,我的同事对此赞不绝口。我特别感兴趣的是,它基于高性能的异步I / O框架Netty,对此我更加熟悉并深信。