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

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

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

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

10 ответов

Решение

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

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

Использование:

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

РЕДАКТИРОВАТЬ (после предложения Жюля):

Как 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 (если у вас его нет, либо загрузите, либо подключитесь к Интернету), он подскажет, какой класс использовать для замены старого кода. Конечно, это не скажет вам всего, но это только начало. Пример:

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

Преимущество в том, что вам не приходится иметь дело с окончательно и нулевыми значениями.

Другая важная информация

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

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

HttpClient httpclient = HttpClients.createDefault();

Класс org.apache.http.impl.client.HttpClients есть начиная с версии 4.3. Код для HttpClients.createDefault() такой же, как принятый ответ здесь.

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

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

Пытаться 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

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

например:

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

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

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

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

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

 CloseableHttpClient httpClient = HttpClientBuilder.create().build();
 HttpPost httpPostRequest = new HttpPost();
Другие вопросы по тегам