弃用的 JavaHttpClient-能有多难?

我所要做的就是下载一些 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 告诉我,DefaultHttpClient是不推荐的。我试过用谷歌搜索 DefaultHttpClient deprecated和其他我能想到的所有变体,但没有找到任何有用的结果,所以我显然遗漏了一些东西。

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

我对玛文的依赖是..。

<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>LATEST</version>
<type>jar</type>
</dependency>
192916 次浏览

由于使用 LATEST版本规范,所以在 4.3-alpha1版本中不推荐使用它。如果您看一下这个类的 javadoc,它会告诉您改用什么: HttpClientBuilder

在最新的稳定版本(4.2.3)中,DefaultHttpClient还没有被弃用。

使用 HttpClientBuilder构建 HttpClient,而不是使用 DefaultHttpClient

例如:

MinimalHttpClient httpclient = new HttpClientBuilder().build();


// Prepare a request object
HttpGet httpget = new HttpGet("http://www.apache.org/");

如果您试图只读取 json 数据,我建议使用下面的方法。

URL requestUrl=new URL(url);
URLConnection con = requestUrl.openConnection();
BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
StringBuilder sb=new StringBuilder();
int cp;
try {
while((cp=rd.read())!=-1){
sb.append((char)cp);
}
catch(Exception e){
}
String json=sb.toString();

相关进口:

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

用法:

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

编辑(根据朱尔斯的建议) :

build()方法返回一个 CloseableHttpClient(是 A AutoClosable)时,您可以将声明放在 try-with-resources 语句(Java7 +)中:

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


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


} catch (IOException e) {


// handle


}

对于最初的问题,我要求你应用以下逻辑:

 CloseableHttpClient httpClient = HttpClientBuilder.create().build();
HttpPost httpPostRequest = new HttpPost();

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

也可以看看这篇博文: http://www.yegor256.com/2014/04/11/jcabi-http-intro.html

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

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

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

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

自动关闭:

正如 Jules 在注释中暗示的那样,返回的类实现了 java.io.Closable,所以如果使用 Java7或更高版本,现在可以这样做:

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

这样做的好处是不必处理 finally 和 null。

其他相关信息

还要确保阅读有关 连接池和设置 暂停

这是我应用于 httpclient 在这个版本的 android 22中反对的问题的解决方案

 public static String getContenxtWeb(String urlS) {
String pagina = "", devuelve = "";
URL url;
try {
url = new URL(urlS);
HttpURLConnection conexion = (HttpURLConnection) url
.openConnection();
conexion.setRequestProperty("User-Agent",
"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)");
if (conexion.getResponseCode() == HttpURLConnection.HTTP_OK) {
BufferedReader reader = new BufferedReader(
new InputStreamReader(conexion.getInputStream()));
String linea = reader.readLine();
while (linea != null) {
pagina += linea;
linea = reader.readLine();
}
reader.close();


devuelve = pagina;
} else {
conexion.disconnect();
return null;
}
conexion.disconnect();
return devuelve;
} catch (Exception ex) {
return devuelve;
}
}

Apache 的示例如下:

CloseableHttpClient httpclient = HttpClients.createDefault();

org.apache.http.impl.client.HttpClients类在4.3版本之后就已经存在了。

HttpClients.createDefault()的代码和这里的 接受的答案是一样的。

您可以添加以下 Maven 依赖项。

    <dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpmime -->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpmime</artifactId>
<version>4.5.1</version>
</dependency>

您可以在 Java 代码中使用以下导入。

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGett;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.client.methods.HttpUriRequest;

您可以在 Java 代码中使用以下代码块。

HttpClient client = HttpClientBuilder.create().build();
HttpUriRequest httpUriRequest = new HttpGet("http://example.domain/someuri");


HttpResponse response = client.execute(httpUriRequest);
System.out.println("Response:"+response);