不推荐使用Java HttpClient - 它有多难?

Bas*_*sic 168 java apache-commons-httpclient apache-httpclient-4.x

我要做的就是下载一些JSON并将其反序列化为一个对象.我还没有下载JSON.

我能找到的几乎所有HttpClient示例,包括apache站点上的那些看起来都像......

import org.apache.http.client.HttpClient;
import org.apache.http.impl.client.DefaultHttpClient;

public void blah() {
    HttpClient client = new DefaultHttpClient();
    ...
}
Run Code Online (Sandbox Code Playgroud)

但是,Netbeans告诉我,这DefaultHttpClient已被弃用.我已经尝试使用谷歌搜索DefaultHttpClient deprecated和其他许多变化,我无法找到任何有用的结果,所以我显然错过了一些东西.

下载网页内容的正确Java7方式是什么?作为语言的一部分,真的没有像样的Http客户端吗?我觉得很难相信.

我对Maven的依赖是......

<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpclient</artifactId>
    <version>LATEST</version>
    <type>jar</type>
</dependency>
Run Code Online (Sandbox Code Playgroud)

Nis*_*hth 256

相关进口:

import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import java.io.IOException;
Run Code Online (Sandbox Code Playgroud)

用法:

HttpClient httpClient = HttpClientBuilder.create().build();
Run Code Online (Sandbox Code Playgroud)

编辑(在Jules的建议之后):

由于build()方法返回一个CloseableHttpClient是-一个 AutoClosable,你可以放置在一个try-与资源语句(Java 7+)的声明:

try (CloseableHttpClient httpClient = HttpClientBuilder.create().build()) {

    // use httpClient (no need to close it explicitly)

} catch (IOException e) {

    // handle

}
Run Code Online (Sandbox Code Playgroud)

  • 请注意,返回值是一个`CloseableHttpClient`,您应该在使用后关闭它.它实现了`AutoCloseable`,因此您可以在Java 7+中的try-with-resources语句中使用它:`try(CloseableHttpClient httpclient = ...){...}`. (7认同)
  • **问题:**我们应该继续使用`create()`静态方法返回的HttpClientBuilder实例吗?或者我们可以在需要的时候调用`create()`吗?...顺便说一句,`import org.apache.http.impl.client.HttpClientBuilder`给任何需要的人.*[不喜欢进口声明,不喜欢答案.别担心我仍然被投票:)]* (5认同)
  • 你使用的是4.3以下的版本(它应该是Apache HTTPClient,而不是Commons HTTPClient) (2认同)
  • CloseableHttpClient httpClient = HttpClientBuilder.create().build(); 这项工作对我来说 (2认同)

Chr*_*ssy 59

恕我直言,接受的答案是正确的,但错过了一些"教学",因为它没有解释如何提出答案.对于所有已弃用的类,请查看JavaDoc(如果您没有下载或上线),它将提示用于替换旧代码的类.当然它不会告诉你一切,但这是一个开始.例:

...
 *
 * @deprecated (4.3) use {@link HttpClientBuilder}.  <----- THE HINT IS HERE !
 */
@ThreadSafe
@Deprecated
public class DefaultHttpClient extends AbstractHttpClient {
Run Code Online (Sandbox Code Playgroud)

现在你有了要使用的类HttpClientBuilder,因为没有构造函数来获取构建器实例,你可能会猜测必须有一个静态方法:create.一旦你有了构建器,你也可以猜测,对于大多数构建器,有一个构建方法,因此:

org.apache.http.impl.client.HttpClientBuilder.create().build();
Run Code Online (Sandbox Code Playgroud)

AutoClosable:

正如Jules在评论中暗示的那样,返回的类实现了java.io.Closable,所以如果你使用Java 7或更高版本,你现在可以:

    try (CloseableHttpClient httpClient = HttpClientBuilder.create().build()) {...}
Run Code Online (Sandbox Code Playgroud)

优点是您不必处理finally和null.

其他相关信息

还要确保阅读有关连接池的信息并设置超时.


Iva*_*nRF 10

Apache的例子使用这个:

HttpClient httpclient = HttpClients.createDefault();
Run Code Online (Sandbox Code Playgroud)

org.apache.http.impl.client.HttpClients从4.3版开始,该课程就在那里.代码HttpClients.createDefault()与此处的接受答案相同.


zag*_*gyi 7

4.3-alpha1由于LATEST版本规范,在您使用的版本中已弃用.如果您看一下该类的javadoc,它会告诉您使用什么:HttpClientBuilder.

在最新的稳定版本(4.2.3)中,DefaultHttpClient尚未弃用.


yeg*_*256 7

尝试jcabi-http,这是一个流畅的Java HTTP客户端,例如:

String html = new JdkRequest("https://www.google.com")
  .header(HttpHeaders.ACCEPT, MediaType.TEXT_HTML)
  .fetch()
  .as(HttpResponse.class)
  .assertStatus(HttpURLConnection.HTTP_OK)
  .body();
Run Code Online (Sandbox Code Playgroud)

请查看此博客文章:http://www.yegor256.com/2014/04/11/jcabi-http-intro.html