已弃用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>
相关进口:
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
}
这是给我 - 线程“主”java.lang.NoSuchFieldError异常:INSTANCE – jagamot 2014-03-11 16:14:59
您使用的版本低于4.3(它应该是Apache HTTPClient,而不是Commons HTTPClient) – Alfishe 2014-03-15 15:58:59
注意返回值是一个'CloseableHttpClient',你应该在使用后关闭它。它实现了'AutoCloseable',所以你可以在Java 7+的try-with-resources语句中使用它:'try(CloseableHttpClient httpclient = ...){...}'。 – Jules 2014-04-19 05:35:27
使用HttpClientBuilder打造HttpClient而是采用DefaultHttpClient
例如:
MinimalHttpClient httpclient = new HttpClientBuilder().build();
// Prepare a request object
HttpGet httpget = new HttpGet("http://www.apache.org/");
为什么'新HttpClientBuilder()'而不是'HttpClientBuilder.create()'? – ADTC 2015-07-14 07:07:43
该代码是错误的......谁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();
对于原来的问题,我会要求你申请以下逻辑:
CloseableHttpClient httpClient = HttpClientBuilder.create().build();
HttpPost httpPostRequest = new HttpPost();
与接受的答案有何不同? – 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
不错的选择,谢谢 – 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。
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()
的代码与此处接受的答案相同。
得到错误“引发java.lang.VerifyError:org/apache/http/conn/ssl/DefaultHostnameVerifier” 当使用HttpClient client = HttpClients.createDefault(); – 2017-07-06 05:47:52
NetBeans告诉你错了,或者你在误读某些东西。 'DefaultHttpClient'肯定不会被弃用。您在POM中指定了哪个版本? – Perception 2013-03-11 10:41:29
在4.3-alpha1中似乎不推荐使用 – 2013-03-11 10:45:09
@sreemanth谢谢,但尽管我最终打算将此用于Json,但实际问题根本与Json无关。 – Basic 2013-03-11 10:49:20