Устаревший Java HttpClient - насколько это сложно?

Все, что я пытаюсь сделать, это загрузить некоторый 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 устарел. Я пробовал googling для DefaultHttpClient deprecated и как многие другие варианты, о которых я могу думать, и не могу найти полезных результатов, поэтому я, очевидно, что-то не хватает.

Каков правильный способ Java7 для загрузки содержимого веб-страницы? Действительно ли нет достойного Http-клиента как часть языка? Мне трудно поверить.

Моя зависимость Maven для этого...

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

Ответ 1

Соответствующие импорта:

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() возвращает a CloseableHttpClient, который есть-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

}

Ответ 2

ИМХО принятый ответ правильный, но пропускает какое-то "учение", поскольку он не объясняет, как ответить на этот вопрос. Для всех устаревших классов посмотрите на 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();

AutoClosable:

Как отметил Jules в комментариях, возвращаемый класс реализует java.io.Closable, поэтому, если вы используете Java 7 или выше, вы можете теперь:

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

Преимущество состоит в том, что вам не нужно иметь дело с finally и null.

Другая соответствующая информация

Также не забудьте прочитать о пуле соединений и установить таймауты.

Ответ 3

Примеры из Apache используют это:

HttpClient httpclient = HttpClients.createDefault();

Класс org.apache.http.impl.client.HttpClients существует с версии 4.3. Код для HttpClients.createDefault() совпадает с принятым ответом здесь.

Ответ 4

Он устарел в версии 4.3-alpha1, которую вы используете из-за спецификации версии LATEST. Если вы посмотрите на javadoc класса, он скажет вам, что использовать вместо этого: HttpClientBuilder.

В последней стабильной версии (4.2.3) DefaultHttpClient еще не устарели.

Ответ 5

Попробуйте 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

Ответ 6

Я бы предложил использовать метод ниже, если вы пытаетесь читать только данные 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();

Ответ 7

Вы можете добавить следующую зависимость от 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);

Ответ 8

Используйте HttpClientBuilder, чтобы построить HttpClient вместо использования DefaultHttpClient

Пример:

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

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

Ответ 9

Это решение, которое я применил к проблеме, которую HTTP-клиент устарел в этой версии 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;
    }
}

Ответ 10

Для исходной проблемы я попрошу вас применить ниже логику:

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