已弃用的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();