web-dev-qa-db-fra.com

Obsolète Java HttpClient - Comment peut-il être difficile?

Tout ce que j'essaie de faire est de télécharger du JSON et de le désérialiser en un objet. Je n'ai pas encore téléchargé le fichier JSON.

Presque tous les exemples de HttpClient que je peux trouver, y compris ceux du site Apache, ressemblent à ...

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

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

Cependant, Netbeans me dit que DefaultHttpClient est obsolète. J'ai essayé de googler pour DefaultHttpClient deprecated et autant d'autres variantes que je peux imaginer et pour lesquelles je ne trouve aucun résultat utile. Je manque donc évidemment quelque chose.

Quelle est la bonne façon pour Java7 de télécharger le contenu d’une page Web? N'y a-t-il vraiment pas de client HTTP décent dans le langage? Je trouve cela difficile à croire.

Ma dépendance Maven pour cela est ...

<dependency>
    <groupId>org.Apache.httpcomponents</groupId>
    <artifactId>httpclient</artifactId>
    <version>LATEST</version>
    <type>jar</type>
</dependency>
164
Basic

Importations pertinentes:

import org.Apache.http.impl.client.CloseableHttpClient;
import org.Apache.http.impl.client.HttpClientBuilder;
import Java.io.IOException;

Usage:

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

EDIT (après la suggestion de Jules):

Comme la méthode build() renvoie une CloseableHttpClient qui is-aAutoClosable, vous pouvez placer la déclaration dans une instruction try-with-resources (Java 7+) :

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

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

} catch (IOException e) {

    // handle

}
251
Nishant Shreshth

À mon humble avis, la réponse acceptée est correcte, mais il manque un "enseignement" car elle n'explique pas comment trouver la réponse. Pour toutes les classes obsolètes, regardez le JavaDoc (si vous ne le possédez pas, téléchargez-le ou allez en ligne ), il indiquera quelle classe utiliser pour remplacer l'ancien code. Bien sûr, cela ne vous dira pas tout, mais c'est un début. Exemple:

...
 *
 * @deprecated (4.3) use {@link HttpClientBuilder}.  <----- THE HINT IS HERE !
 */
@ThreadSafe
@Deprecated
public class DefaultHttpClient extends AbstractHttpClient {

Maintenant, vous avez la classe à utiliser, HttpClientBuilder, car il n’existe aucun constructeur pour obtenir un constructeur , vous pouvez donc deviner qu’il doit y avoir un méthode statique à la place: create. Une fois que vous avez le générateur, vous pouvez également deviner que, comme pour la plupart des constructeurs, il existe une méthode de construction , ainsi:

org.Apache.http.impl.client.HttpClientBuilder.create().build();

AutoClosable:

Comme Jules l'a laissé entendre dans les commentaires, la classe retournée implémente Java.io.Closable, donc si vous utilisez Java 7 ou une version ultérieure, vous pouvez maintenant:

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

L'avantage est que vous n'avez pas à traiter avec les null et finalement.

Autres informations pertinentes

Assurez-vous également de lire à propos de pooling de connexions et définissez le délais d'attente .

59
Christophe Roussy

Exemples de Apache utilise ceci:

HttpClient httpclient = HttpClients.createDefault();

La classe org.Apache.http.impl.client.HttpClients existe depuis la version 4.3. Le code pour HttpClients.createDefault() est identique à la réponse acceptée ici.

10
IvanRF

Essayez jcabi-http , qui est un client HTTP courant Java, par exemple:

_String html = new JdkRequest("https://www.google.com")
  .header(HttpHeaders.ACCEPT, MediaType.TEXT_HTML)
  .fetch()
  .as(HttpResponse.class)
  .assertStatus(HttpURLConnection.HTTP_OK)
  .body();
_

Vérifiez également cet article de blog: http://www.yegor256.com/2014/04/11/jcabi-http-intro.html

7
yegor256

Il est devenu obsolète dans la version 4.3-alpha1 que vous utilisez en raison de la spécification de version LATEST. Si vous regardez le javadoc de la classe, il vous dira quoi utiliser à la place: HttpClientBuilder.

Dans la dernière version stable (4.2.3), la DefaultHttpClient n'est pas encore déconseillée.

7
zagyi

Je suggère d'utiliser la méthode ci-dessous si vous essayez de lire les données JSON uniquement.

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();
3
Anubhab

Vous pouvez ajouter la dépendance Maven suivante.

    <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>

Vous pouvez utiliser l'importation suivante dans votre code 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;

Vous pouvez utiliser le bloc de code suivant dans votre code Java.

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

HttpResponse response = client.execute(httpUriRequest);
System.out.println("Response:"+response);
2
Red Boy

C’est la solution que j’ai appliquée au problème que httpclient déconseillait dans cette version de 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;
    }
}
1
Frutos Marquez

Utilisez HttpClientBuilder pour construire le HttpClient au lieu d'utiliser DefaultHttpClient

ex:

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

 // Prepare a request object
 HttpGet httpget = new HttpGet("http://www.Apache.org/");
1
Arun P Johny