org - HttpClient de Java en desuso: ¿Qué tan difícil puede ser?
httpclientbuilder maven (10)
Todo lo que intento hacer es descargar un poco de JSON y deserializarlo en un objeto. Todavía no he llegado a descargar el JSON.
Casi todos los ejemplos de HttpClient que puedo encontrar, incluidos los que aparecen en el sitio de Apache, parecen algo así como ...
import org.apache.http.client.HttpClient;
import org.apache.http.impl.client.DefaultHttpClient;
public void blah() {
HttpClient client = new DefaultHttpClient();
...
}
Sin embargo, Netbeans me dice que DefaultHttpClient
está en desuso. Intenté buscar Google en DefaultHttpClient deprecated
y tantas otras variaciones como pude y no puedo encontrar ningún resultado útil, así que obviamente me falta algo.
¿Cuál es la forma correcta de Java7 para descargar los contenidos de una página web? ¿Realmente no hay Http Client decente como parte del lenguaje? Me parece difícil de creer.
Mi dependencia Maven para esto es ...
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>LATEST</version>
<type>jar</type>
</dependency>
En mi humilde opinión, la respuesta aceptada es correcta, pero se pierde algo de "enseñanza", ya que no explica cómo encontrar la respuesta. Para todas las clases en desuso, mire el JavaDoc (si no lo tiene, ni lo descargue ni JavaDoc ), indicará qué clase usar para reemplazar el código anterior. Por supuesto que no te dirá todo, pero esto es un comienzo. Ejemplo:
...
*
* @deprecated (4.3) use {@link HttpClientBuilder}. <----- THE HINT IS HERE !
*/
@ThreadSafe
@Deprecated
public class DefaultHttpClient extends AbstractHttpClient {
Ahora tiene la clase para usar, HttpClientBuilder
, ya que no hay un constructor para obtener una instancia del generador , puede adivinar que debe haber un método estático en su lugar: create
. Una vez que tenga el generador también puede adivinar que, como para la mayoría de los constructores, existe un método de compilación , por lo tanto:
org.apache.http.impl.client.HttpClientBuilder.create().build();
Autoclosable:
Como Jules insinuó en los comentarios, la clase devuelta implementa java.io.Closable
, por lo que si usa Java 7 o superior ahora puede hacerlo:
try (CloseableHttpClient httpClient = HttpClientBuilder.create().build()) {...}
La ventaja es que no tiene que lidiar con nulidades finalmente.
Otra información relevante
También asegúrese de leer sobre la agrupación de conexiones y establecer los timeouts .
Esta es la solución que he aplicado al problema que httpclient desaprobó en esta versión 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;
}
}
Importaciones relevantes:
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import java.io.IOException;
Uso:
HttpClient httpClient = HttpClientBuilder.create().build();
EDITAR (después de la sugerencia de Jules):
Como el método build()
devuelve un CloseableHttpClient
que es un AutoClosable
, puede colocar la declaración en una declaración try-with-resources (Java 7+):
try (CloseableHttpClient httpClient = HttpClientBuilder.create().build()) {
// use httpClient (no need to close it explicitly)
} catch (IOException e) {
// handle
}
Para el problema original, le solicitaría que aplicara la siguiente lógica:
CloseableHttpClient httpClient = HttpClientBuilder.create().build();
HttpPost httpPostRequest = new HttpPost();
Pruebe jcabi-http
, que es un cliente HTTP Java fluido, por ejemplo:
String html = new JdkRequest("https://www.google.com")
.header(HttpHeaders.ACCEPT, MediaType.TEXT_HTML)
.fetch()
.as(HttpResponse.class)
.assertStatus(HttpURLConnection.HTTP_OK)
.body();
Verifique también esta publicación en el blog: http://www.yegor256.com/2014/04/11/jcabi-http-intro.html
Se quedó obsoleto en la versión 4.3-alpha1
que utiliza debido a la LATEST
especificación de versión. Si echas un vistazo al javadoc de la clase, te dice qué usar en su lugar: HttpClientBuilder
.
En la última versión estable ( 4.2.3
), DefaultHttpClient
aún no está en desuso.
Sugeriría usar el método siguiente si estás tratando de leer los datos json solamente.
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();
Use HttpClientBuilder para compilar HttpClient lugar de usar DefaultHttpClient
ex:
MinimalHttpClient httpclient = new HttpClientBuilder().build();
// Prepare a request object
HttpGet httpget = new HttpGet("http://www.apache.org/");
Los ejemplos de Apache usan esto:
HttpClient httpclient = HttpClients.createDefault();
La clase org.apache.http.impl.client.HttpClients
está allí desde la versión 4.3. El código para HttpClients.createDefault()
es el mismo que la respuesta aceptada aquí.
Puede agregar la siguiente dependencia de 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>
Puede usar la siguiente importación en su código 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;
Puede usar el siguiente bloque de código en su código java.
HttpClient client = HttpClientBuilder.create().build();
HttpUriRequest httpUriRequest = new HttpGet("http://example.domain/someuri");
HttpResponse response = client.execute(httpUriRequest);
System.out.println("Response:"+response);