2013-03-11 10 views
138

Tutto quello che sto cercando di fare è scaricare alcuni JSON e deserializzare in un oggetto. Non ho ancora scaricato il JSON.HttpClient Java deprecato: quanto può essere difficile?

Quasi ogni singolo esempio HttpClient posso trovare, compresi quelli sul sito Apache sembra qualcosa di simile ...

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

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

Tuttavia, Netbeans mi dice che DefaultHttpClient è deprecato. Ho provato googling per DefaultHttpClient deprecated e come molte altre varianti che posso pensare e non riesco a trovare risultati utili, quindi ovviamente mi manca qualcosa.

Qual è il modo corretto di Java7 per scaricare il contenuto di una pagina Web? Non c'è davvero un client Http decente come parte della lingua? Lo trovo difficile da credere.

mio Maven dipendenza per questo è ...

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

NetBeans ti sta dicendo male o stai fraintendendo qualcosa. 'DefaultHttpClient' non è sicuramente deprecato. Quale versione hai specificato nel tuo POM? – Perception

+7

in 4.3-alpha1 sembra essere deprecato –

+0

@sreemanth Grazie ma anche se alla fine intendo utilizzarlo per Json, la vera domanda non è affatto collegata a JSON. – Basic

risposta

222

importazioni rilevanti:

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 (dopo Jules' suggerimento):

Dato che il metodo build() restituisce un CloseableHttpClient che is-aAutoClosable, è possibile inserire la dichiarazione in una dichiarazione try-con-le risorse (Java 7+):

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

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

} catch (IOException e) { 

    // handle 

} 
+0

Questo mi sta dando - Eccezione nel thread "main" java.lang.NoSuchFieldError: INSTANCE – jagamot

+2

Stai usando la versione successiva a 4.3 (e dovrebbe essere Apache HTTPClient, non Commons HTTPClient) – Alfishe

+7

Nota che il valore restituito è un "CloseableHttpClient", che dovresti chiudere dopo l'uso. Implementa 'AutoCloseable', quindi puoi usarlo in una dichiarazione try-with-resources in Java 7+:' prova (CloseableHttpClient httpclient = ...) {...} '. – Jules

7

ha ottenuto obsolete nella versione 4.3-alpha1 che si utilizza a causa della specifica LATEST versione. Se dai un'occhiata al javadoc della classe, ti dirà invece cosa usare: HttpClientBuilder.

Nell'ultima versione stabile (4.2.3) il DefaultHttpClient non è ancora stato deprecato.

+0

Grazie per la risposta - Netbeans non mostra alcun JavaDocs per nessuna delle cose di org.apache - ma suppongo che sia un problema diverso – Basic

+0

Probabilmente non hai i sorgenti collegati alla libreria. Non uso Netbeans, ma immagino ci sia un modo per chiedergli di scaricare i sorgenti delle dipendenze. – zagyi

2

Usa HttpClientBuilder per costruire il HttpClient invece di utilizzare DefaultHttpClient

es:

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

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

Perché 'new HttpClientBuilder()' e non 'HttpClientBuilder.create()'? – ADTC

+0

Il codice è semplicemente sbagliato ... chi lo ha svalutato? – unwichtich

3

Io suggerirei di usare il methodd qui sotto se si sta tentando di leggere solo i dati 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(); 
+0

Le domande dicono che "DefaultHttpClient" è deprecato e si suggerisce di utilizzarlo nella risposta ... – Basic

+0

Oopps..sorry..will edit. – Anubhab

+0

Grazie per l'approccio alternativo. Sono già andato con la risposta accettata, ma questo sembra abbastanza leggero da farci provare la prossima volta. – Basic

-2

Per il rilascio originale, vorrei chiedere di applicare sotto logica:

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

Com'è diverso dalla risposta accettata? – Basic

6

Try jcabi-http, che è un fluente client Java HTTP, ad esempio:

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

controllare anche questo post del blog: http://www.yegor256.com/2014/04/11/jcabi-http-intro.html

+0

bella alternativa, grazie – Basic

47

IMHO la risposta accettata è corretta ma manca un po 'di' insegnamento 'in quanto non spiega come ottenere la risposta. Per tutte le classi deprecate guarda allo JavaDoc (se non ce l'hai o scaricalo o go online), farà capire a quale classe usare per sostituire il vecchio codice. Ovviamente non ti dirà tutto, ma questo è un inizio. Esempio:

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

Ora si ha la classe da utilizzare, HttpClientBuilder, in quanto non v'è alcun costruttore per ottenere un costruttore esempio si può immaginare che ci deve essere un metodo statico invece: create. Una volta che hai il costruttore si può anche immaginare che, come per la maggior parte dei costruttori c'è un metodo accumulo, in tal modo:

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

AutoClosable:

Come Jules accennato nei commenti, gli attrezzi classe restituita java.io.Closable, quindi se si utilizza Java 7 o superiore è ora possibile fare:

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

Il vantaggio è che non si ha a che fare con finalmente e nullo S.

Altre informazioni rilevanti

Assicurarsi inoltre di leggere su connection pooling e impostare l'timeouts.

+5

UP per 'teaching' errore –

1

Questa è la soluzione che ho applicato al problema che httpclient deprecato in questa versione di 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; 
    } 
} 
9

Examples from Apache uso questo:

HttpClient httpclient = HttpClients.createDefault(); 

La classe org.apache.http.impl.client.HttpClients è lì dal versione 4.3. Il codice per HttpClients.createDefault() corrisponde alla risposta accettata qui.

+0

get "causato da: java.lang.VerifyError: org/apache/http/conn/ssl/DefaultHostnameVerifier" quando l'uso HttpClient client = HttpClients.createDefault(); –

Problemi correlati