已弃用的Java HttpClient - 它有多难?

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

我能找到的几乎每一个HttpClient的例子,包括apache网站上的例子,看起来都像......

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

public void blah() {
    HttpClient client = new DefaultHttpClient();
    ...
}

但是,Netbeans 告诉我,这已被弃用。我已经尝试了谷歌搜索和我能想到的尽可能多的其他变化,但找不到任何有用的结果,所以我显然错过了一些东西。DefaultHttpClientDefaultHttpClient deprecated

Java7下载网页内容的正确方法是什么?真的没有像样的Http客户端作为语言的一部分吗?我发现这很难相信。

我对此的 Maven 依赖是...

<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpclient</artifactId>
    <version>LATEST</version>
    <type>jar</type>
</dependency>

答案 1

相关进口:

import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import java.io.IOException;

用法:

HttpClient httpClient = HttpClientBuilder.create().build();

编辑(在朱尔斯的建议之后):

当该方法返回 a is-a 时,您可以将声明放在 try-with-resources 语句 (Java 7+) 中:build()CloseableHttpClientAutoClosable

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

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

} catch (IOException e) {

    // handle

}

答案 2

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

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

现在你有要使用的类,因为没有构造函数来获取生成器实例,你可能会猜到一定有一个静态方法:。一旦你有了构建器,你也可以猜到对于大多数构建器来说,有一个构建方法,因此:HttpClientBuildercreate

org.apache.http.impl.client.HttpClientBuilder.create().build();

自动关闭:

正如Jules在注释中暗示的那样,返回的类实现,因此,如果您使用Java 7或更高版本,您现在可以执行以下操作:java.io.Closable

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

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

其他相关信息

此外,请务必阅读有关连接池的信息并设置超时


推荐