177

我要做的就是下载一些 JSON 并将其反序列化为一个对象。我还没有下载JSON。

我能找到的几乎每一个 HttpClient 示例,包括 apache 网站上的示例,看起来都像......

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

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

但是,Netbeans 告诉我这DefaultHttpClient已被弃用。我试过谷歌搜索DefaultHttpClient deprecated以及我能想到的许多其他变体,但找不到任何有用的结果,所以我显然遗漏了一些东西。

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

我对此的 Maven 依赖是...

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

10 回答 10

270

相关进口:

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

用法:

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

编辑(根据朱尔斯的建议):

由于该build()方法返回 a CloseableHttpClientwhich is-a AutoClosable,您可以将声明放在 try-with-resources 语句(Java 7+)中:

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

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

} catch (IOException e) {

    // handle

}
于 2013-03-11T10:55:48.880 回答
60

恕我直言,接受的答案是正确的,但错过了一些“教学”,因为它没有解释如何提出答案。对于所有不推荐使用的类,请查看JavaDoc(如果您没有下载或上网),它将提示使用哪个类来替换旧代码。当然它不会告诉你一切,但这是一个开始。例子:

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

自动关闭:

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

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

优点是您不必处理finally 和nulls。

其他相关信息

还要确保阅读连接池并设置超时

于 2014-11-19T13:18:49.407 回答
13

来自 Apache 的示例使用这个:

CloseableHttpClient httpclient = HttpClients.createDefault();

org.apache.http.impl.client.HttpClients自 4.3 版以来,该课程就在那里。

的代码与此处接受HttpClients.createDefault()的答案相同。

于 2015-09-02T23:33:47.157 回答
7

Try 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

于 2014-04-30T21:56:22.860 回答
6

4.3-alpha1由于LATEST版本规范,它在您使用的版本中被弃用。如果您查看该类的 javadoc,它会告诉您使用什么来代替:HttpClientBuilder.

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

于 2013-03-11T10:45:39.663 回答
4

如果您仅尝试读取 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();
于 2013-03-11T10:55:41.817 回答
2

使用HttpClientBuilder构建HttpClient而不是使用 DefaultHttpClient

前任:

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

 // Prepare a request object
 HttpGet httpget = new HttpGet("http://www.apache.org/");
于 2013-03-11T10:48:57.033 回答
2

您可以添加以下 Maven 依赖项。

    <dependency>
        <groupId>org.apache.httpcomponents</groupId>
        <artifactId>httpclient</artifactId>
        <version>4.5.1</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpmime -->
    <dependency>
        <groupId>org.apache.httpcomponents</groupId>
        <artifactId>httpmime</artifactId>
        <version>4.5.1</version>
    </dependency>

您可以在您的 java 代码中使用以下导入。

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGett;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.client.methods.HttpUriRequest;

您可以在您的 java 代码中使用以下代码块。

HttpClient client = HttpClientBuilder.create().build();
HttpUriRequest httpUriRequest = new HttpGet("http://example.domain/someuri");

HttpResponse response = client.execute(httpUriRequest);
System.out.println("Response:"+response);
于 2018-04-02T06:19:26.213 回答
1

这是我在这个版本的android 22中不推荐使用httpclient的问题的解决方案

 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;
    }
}
于 2015-09-01T08:03:25.100 回答
-2

对于原始问题,我会要求您应用以下逻辑:

 CloseableHttpClient httpClient = HttpClientBuilder.create().build();
 HttpPost httpPostRequest = new HttpPost();
于 2014-04-22T12:39:24.377 回答