已弃用的Java HttpClient – 有多难?

所有我试图做的是下载一些JSON和反序列化到一个对象。 我还没有下载JSON。

几乎每一个HttpClient的例子,我可以find,包括那些在Apache网站上看起来像…

import org.apache.http.client.HttpClient; import org.apache.http.impl.client.DefaultHttpClient; public void blah() { HttpClient client = new DefaultHttpClient(); ... } 

但是,Netbeans告诉我, DefaultHttpClient已经被弃用了。 我已经试过使用谷歌searchDefaultHttpClient deprecated和其他许多变化,因为我能想到,找不到任何有用的结果,所以我明显缺less的东西。

什么是正确的Java7方式来下载网页的内容? 是否真的没有体面的Http客户端作为语言的一部分? 我觉得很难相信。

我的Maven依赖这是…

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

相关import:

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

用法:

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

编辑(Julesbuild议之后):

由于build()方法返回一个CloseableHttpClient ,它是一个 AutoClosable ,所以你可以把这个声明放在try-with-resources语句(Java 7+)中:

 try (CloseableHttpClient httpClient = HttpClientBuilder.create().build()) { // use httpClient (no need to close it explicitly) } catch (IOException e) { // handle } 

恕我直言,接受的答案是正确的,但错过了一些“教学”,因为它不解释如何拿出答案。 对于所有被弃用的类看JavaDoc (如果你没有它下载或上线 ),它会提示用哪个类来replace旧的代码。 当然,它不会告诉你所有的事情,但这是一个开始。 例:

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

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

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

AutoClosable:

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

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

好处是你不必最终处理和空值。

Apache的例子使用这个:

 HttpClient httpclient = HttpClients.createDefault(); 

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

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

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

尝试jcabi-http ,这是一个stream畅的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

我build议使用下面的方法,如果你只是想读取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(); 

使用HttpClientBuilder构buildHttpClient而不是使用DefaultHttpClient

例如:

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

这是我已经应用于这个版本的android 22中的httpclient弃用的问题的解决scheme

  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; } } 

对于原来的问题,我会请求你申请下面的逻辑:

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