Obsoleta de Java HttpClient – ¿Cuán difícil puede ser?

Todo lo que estoy tratando de hacer es descargar algunos JSON y deserializar un objeto. No tengo tan lejos como descargar el JSON todavía.

Casi cada uno de los HttpClient ejemplo que puedo encontrar, incluyendo aquellos en el sitio de apache, se ve algo 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. He intentado buscar en google para DefaultHttpClient deprecated y como muchas otras variaciones como yo puedo pensar y no puede encontrar ninguna, resultados de utilidad, por lo que estoy, obviamente, le falta algo.

¿Cuál es la correcta Java7 forma de descargar el contenido de una página web? Hay realmente ninguna decente Http Cliente como parte de la lengua? Me parece que resulta difícil de creer.

Mi Maven dependencia para esto es…

<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpclient</artifactId>
    <version>LATEST</version>
    <type>jar</type>
</dependency>
  • NetBeans te está diciendo mal, o que están malinterpretando algo. DefaultHttpClient no es definitivamente obsoleto. Qué versión se especifica en el POM?
  • en 4.3-alfa-1 parece ser obsoleto
  • Gracias, pero a pesar de que finalmente la intención de usar este para Json, la pregunta no está relacionada con Json en todo.
  • Tienes razón el httpclient API es un trainwreck
  • Yo recomendaría que usted establezca la versión para algún número de la versión principal en lugar de la ÚLTIMA. Esto le permitirá controlar manualmente el proceso de actualización y no dejar de Maven decidir por usted.
  • Seguro que cuando has terminado de escribir… Pero para su primera pieza de código en un nuevo proyecto, ¿por qué no utilizar la Última? Una vez que usted tiene una dependencia en una versión específica, absolutamente clava abajo
  • se puede cambiar en cualquier momento mientras trabaja en él, incluso en un nuevo proyecto, esto puede ser confuso si no se estableció a sí mismo. Por ejemplo, se trabajó y se compila y se confirme el código. Alguien más llega el día siguiente, checkout y no compila porque la ÚLTIMA versión cambiado. Por supuesto, puedes hacer lo que quieras, pero me gustaría evitar el uso de la por esta razón (versionado).
  • Vamos a estar de acuerdo en desacuerdo
  • Creo que vale la pena señalar aquí que con Java 11 ahora viene con una construida en HttpClient y, posiblemente, la libertad de apache dependencia para algunas aplicaciones, dependiendo de sus necesidades.
  • Eso es muy bienvenida en efecto, si desde hace mucho tiempo.

InformationsquelleAutor Basic | 2013-03-11

10 Kommentare

  1. 249

    Relevante de las importaciones:

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

    Uso:

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

    EDICIÓN (después de Jules sugerencia):

    Como el build() método devuelve un CloseableHttpClient que es-un AutoClosable, usted puede colocar la declaración en un intento-con-los recursos de la declaración (Java 7+):

    try (CloseableHttpClient httpClient = HttpClientBuilder.create().build()) {
    
        //use httpClient (no need to close it explicitly)
    
    } catch (IOException e) {
    
        //handle
    
    }
    • Esto me está dando Excepción en el thread «main» java.lang.NoSuchFieldError: EJEMPLO
    • Estás usando la versión 4.3 (y debe ser Apache HTTPClient, no Commons HTTPClient)
    • Tenga en cuenta que el valor de retorno es un CloseableHttpClient, que debe ser el cierre después de su uso. Se implementa AutoCloseable, así que usted puede utilizarlo en un intento-con-recursos de instrucción en Java 7+: try (CloseableHttpClient httpclient = ...) { ... }.
    • cómo construir dentro de un Resorte de configuración xml. archivo?
    • CloseableHttpClient httpClient = HttpClientBuilder.create().build(); este trabajo para mí
    • Pregunta: Deberíamos llevar a cabo en el HttpClientBuilder instancia devuelta por el create() método estático? O puede simplemente llamamos create() cuando necesitamos uno?… Por cierto, import org.apache.http.impl.client.HttpClientBuilder para cualquier persona que necesita que. [Disgustos respuestas sin importar declaraciones. No te preocupes que todavía upvoted :)]
    • también puede utilizar CloseableHttpClient httpClient = HttpClients.createDefault()
    • Con la API de 23 esto se hace mucho más complicado: hc.apache.org/httpcomponents-client-4.5.x/android-port.html
    • uso OkHttp en Android. Se desordenó con una horquilla de Apache Http de Cliente, que ahora es legado.

  2. 58

    Mi humilde opinión aceptada respuesta es correcta, pero se pierde algo de ‘enseñanza’, ya que no se explica cómo encontrar la respuesta.
    Para todos los obsoleto clases de mirar el JavaDoc (si usted no tiene que descargar o vaya en línea), que se insinúan en los que la clase a usar para reemplazar el viejo código. Por supuesto que no le dirá todo, pero este es un comienzo. Ejemplo:

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

    Ahora usted tiene la clase a utilizar, HttpClientBuilder, como no hay ningún constructor para obtener un generador de instancia es de suponer que debe haber un método estático en su lugar: create. Una vez que tenga el generador puede también supongo que como para la mayoría de los constructores hay un método de construcción, así:

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

    AutoClosable:

    Como Jules dejó entrever en los comentarios, la volvió clase implementa java.io.Closable, por lo que si el uso de Java 7 o superior que usted puede hacer ahora:

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

    La ventaja es que usted no tiene que lidiar con finalmente y los nulos.

    Otra información relevante

    También asegúrese de leer acerca de la agrupación de conexiones y establecer el los tiempos de espera.

    • Para teaching
  3. 10

    Ejemplos de Apache usar este:

    HttpClient httpclient = HttpClients.createDefault();

    La clase org.apache.http.impl.client.HttpClients existe desde la versión 4.3. El código para HttpClients.createDefault() es la misma que la aceptó responder aquí.

    • obtener el error «Causado por: java.lang.Excepción verifyerror: org/apache/http/conn/ssl/DefaultHostnameVerifier» cuando el uso de HttpClient cliente = HttpClients.createDefault();
  4. 7

    Lo tengo en desuso en la versión 4.3-alpha1 que utiliza debido a la LATEST versión de la especificación. Si usted echa un vistazo en el javadoc de la clase, se le dice lo que debe utilizar en su lugar: HttpClientBuilder.

    En la última versión estable (4.2.3) la DefaultHttpClient no es obsoleto aún.

    • Gracias por la respuesta – Netbeans no muestra ningún JavaDocs para cualquiera de las org.apache cosas – pero supongo que eso es un problema diferente
    • Usted probablemente no tiene las fuentes adjunta a la biblioteca. Yo no uso el Netbeans, pero creo que hay una manera de pedir a descargar las fuentes de las dependencias.
  5. 3

    Yo sugeriría usar el siguiente método si usted está tratando de leer los datos en json sólo.

    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();
    • La pregunta dice DefaultHttpClient está en desuso y que sugieren su uso en su respuesta…
    • Oopps..lo siento..va a editar.
    • Gracias por el enfoque alternativo. Ya he ido con el acdepted respuesta, pero esto se ve la luz-peso suficiente que voy a darle una oportunidad la próxima vez.
    • Ok no probs…..
  6. 2

    Se puede añadir la siguiente Maven de la dependencia.

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

    Usted podría utilizar la siguiente importación en el código de 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;

    Usted podría utilizar la siguiente bloque de código en el código de java.

    HttpClient client = HttpClientBuilder.create().build();
    HttpUriRequest httpUriRequest = new HttpGet("http://example.domain/someuri");
    
    HttpResponse response = client.execute(httpUriRequest);
    System.out.println("Response:"+response);
    • Gracias por tomarse el tiempo de contestar, pero ¿cómo es esto diferente al aceptado la respuesta?
    • La mayoría de las respuestas son de pseudo códigos, he intentado hacer un end-to-end de trabajo básico de Java de código con Apache HTTP API de Cliente junto con maven de la dependencia. Nada grande, aunque.
  7. 1

    Uso HttpClientBuilder para construir el HttpClient en lugar de utilizar DefaultHttpClient

    ex:

    MinimalHttpClient httpclient = new HttpClientBuilder().build();
    
     //Prepare a request object
     HttpGet httpget = new HttpGet("http://www.apache.org/");
    • Por qué new HttpClientBuilder() y no HttpClientBuilder.create()?
    • El código está mal…que upvoted esto?
  8. 1

    Esta es la solución que he aplicado al problema que httpclient obsoleto 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;
        }
    }
  9. -2

    Para el problema original, quisiera pedir a aplicar por debajo de lógica:

     CloseableHttpClient httpClient = HttpClientBuilder.create().build();
     HttpPost httpPostRequest = new HttpPost();
    • Cómo es esto diferente a la aceptada respuesta?

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea