Apache HttpComponents的替代品?[已关闭]

2022-08-31 22:10:21

因此,我得出的结论是,Apache HttpComponents 4是我遇到过的最过度的API之一。看起来应该简单的事情需要数百行代码(我仍然不确定资源是否正确清理)。

另外,它希望我做这样的事情:

List<NameValuePair> qparams = new ArrayList<NameValuePair>();
qparams.add(new BasicNameValuePair("q", "httpclient"));
qparams.add(new BasicNameValuePair("btnG", "Google Search"));
qparams.add(new BasicNameValuePair("aq", "f"));
qparams.add(new BasicNameValuePair("oq", null));
URI uri = URIUtils.createURI("http", "www.google.com", -1, "/search", 
  URLEncodedUtils.format(qparams, "UTF-8"), null);

只是...我知道这是Java,我们并不喜欢整个简洁性的东西,但这有点多。更不用说罐子高达700KB。

无论如何,咆哮够了,我想看看人们对其他HTTP客户端库有什么样的体验?

我所知道的是:JettyhotpotatoAsyncHttpClient

这是为了服务器端使用,我最感兴趣的是许多并发获取和大型文件传输的性能。

有什么建议吗?

PS 我知道古老的HttpClient 3.1仍然存在,但我想使用支持的东西。

更新

@oleg:这是文档建议的:

    HttpClient httpclient = new DefaultHttpClient();
    try {
        HttpGet httpget = new HttpGet("http://www.apache.org/");
        HttpResponse response = httpclient.execute(httpget);
        HttpEntity entity = response.getEntity();
        if (entity != null) {
            InputStream instream = entity.getContent();
            try {
                instream.read();
            } catch (IOException ex) {
                throw ex;
            } catch (RuntimeException ex) {
                httpget.abort();
                throw ex;
            } finally {
                try { instream.close(); } catch (Exception ignore) {}
            }
        }
    } finally {
        httpclient.getConnectionManager().shutdown();
    }

在使用 时使用实体内容时,我仍然收到意外错误。我确信这是我的错,但在这一点上,我真的不想弄清楚。ThreadSafeClientConnManager

嘿,我并不是要贬低任何人在这里的工作,但是自从4.0问世以来,我一直在真诚地使用HttpComponents,它只是不适合我。


答案 1

HttpClient API的复杂性只是反映了其问题域的复杂性。与流行的误解相反,HTTP是一个相当复杂的协议。作为一个低级传输库,HC 4.0 API 主要针对性能和灵活性进行了优化,而不是简单性。令人遗憾的是,您无法弄清楚,但就这样吧。欢迎您使用最适合您需求的任何库。我个人非常喜欢Jetty HttpClient。这是一个很好的选择,可能对您更有效。


答案 2

对于简单的用例,您可以使用 HttpClient Fluent API。请参阅教程

该模块基于流畅接口的概念,为 HttpClient 提供了一个易于使用的外观 API。Fluent façade API仅公开了HttpClient最基本的功能,并且对于不需要HttpClient的全部灵活性的简单用例进行了缩进。例如,流畅的外观 API 使用户不必处理连接管理和资源解除分配。

    // Execute a GET with timeout settings and return response content as String.
 Request.Get("http://somehost/")
        .connectTimeout(1000)
        .socketTimeout(1000)
        .execute().returnContent().asString();

Maven 神器。

<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>fluent-hc</artifactId>
    <version>4.2.5</version>
</dependency>

推荐