已弃用Java HttpClient - 它有多难?

已弃用Java HttpClient - 它有多难?

问题描述:

我想要做的就是下载一些JSON并将其反序列化为一个对象。我还没有下载JSON。已弃用Java HttpClient - 它有多难?

几乎每一个HttpClient的例子,我可以找到,包括那些对阿帕奇网站看起来像...

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

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

不过,NetBeans告诉我,DefaultHttpClient已被弃用。我试过用google搜寻DefaultHttpClient deprecated以及其他许多变化,但我找不到任何有用的结果,所以我明显错过了一些东西。

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

这个我Maven的依赖是...

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

NetBeans告诉你错了,或者你在误读某些东西。 'DefaultHttpClient'肯定不会被弃用。您在POM中指定了哪个版本? – Perception 2013-03-11 10:41:29

+7

在4.3-alpha1中似乎不推荐使用 – 2013-03-11 10:45:09

+0

@sreemanth谢谢,但尽管我最终打算将此用于Json,但实际问题根本与Json无关。 – Basic 2013-03-11 10:49:20

相关进口:

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

用法:

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

EDIT(朱尔斯建议后):

作为build()方法返回CloseableHttpClient其中是-一个AutoClosable,你可以将申报一试,与资源的语句(Java 7+):

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

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

} catch (IOException e) { 

    // handle 

} 
+0

这是给我 - 线程“主”java.lang.NoSuchFieldError异常:INSTANCE – jagamot 2014-03-11 16:14:59

+2

您使用的版本低于4.3(它应该是Apache HTTPClient,而不是Commons HTTPClient) – Alfishe 2014-03-15 15:58:59

+7

注意返回值是一个'CloseableHttpClient',你应该在使用后关闭它。它实现了'AutoCloseable',所以你可以在Java 7+的try-with-resources语句中使用它:'try(CloseableHttpClient httpclient = ...){...}'。 – Jules 2014-04-19 05:35:27

它得到了在4.3-alpha1的版本,您使用的,因为LATEST版本规范的弃用。如果你看看这个类的javadoc,它会告诉你使用什么:HttpClientBuilder

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

+0

感谢您的回应 - Netbeans没有显示任何org.apache的东西的任何JavaDocs - 但我想这是一个不同的问题 – Basic 2013-03-11 10:47:13

+0

您可能没有附加到库的源代码。我不使用Netbeans,但我想有一种方法可以让它下载依赖关系的来源。 – zagyi 2013-03-11 10:49:37

使用HttpClientBuilder打造HttpClient而是采用DefaultHttpClient

例如:

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

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

为什么'新HttpClientBuilder()'而不是'HttpClientBuilder.create()'? – ADTC 2015-07-14 07:07:43

+0

该代码是错误的......谁upvoted这? – unwichtich 2017-05-19 08:53:29

我会建议使用以下methodd,如果你想为只读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(); 
+0

问题说'DefaultHttpClient'已被弃用,并且您建议在您的答案中使用它... – Basic 2013-03-11 10:57:49

+0

Oopps..sorry..will编辑。 – Anubhab 2013-03-11 10:58:31

+0

感谢您的替代方法。我已经接受了答案,但这看起来很轻,我下次再试一试。 – Basic 2013-03-11 18:46:12

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

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

与接受的答案有何不同? – Basic 2014-04-22 13:24:28

尝试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

+0

不错的选择,谢谢 – Basic 2014-05-10 23:17:06

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

... 
* 
* @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(); 

AutoClosable:

正如朱在评论中暗示,返回的类实现java.io.Closable,所以如果你使用Java 7或以上,你现在可以做的:

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

的好处是,你不必应付终于和空秒。

其他相关信息

同时一定要了解connection pooling并设置timeouts

+5

UP for'teaching' – 2016-06-02 18:02:49

这是我已经申请到的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; 
    } 
} 

Examples from Apache使用过时的问题的解决方案是:

HttpClient httpclient = HttpClients.createDefault(); 

org.apache.http.impl.client.HttpClients是存在的,因为版本4.3。 HttpClients.createDefault()的代码与此处接受的答案相同。

+0

得到错误“引发java.lang.VerifyError:org/apache/http/conn/ssl/DefaultHostnameVerifier” 当使用HttpClient client = HttpClients.createDefault(); – 2017-07-06 05:47:52