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