wake-up-neo.com

Veraltet Java HttpClient - Wie schwer kann es sein?

Ich versuche nur, JSON herunterzuladen und in ein Objekt zu deserialisieren. Ich habe den JSON noch nicht heruntergeladen.

Fast jedes einzelne HttpClient-Beispiel, das ich finden kann, einschließlich der auf der Apache-Site, sieht ungefähr so ​​aus ...

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

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

Netbeans teilt mir jedoch mit, dass DefaultHttpClient veraltet ist. Ich habe versucht, nach DefaultHttpClient deprecated Und so vielen anderen Variationen zu googeln, wie mir einfällt, und kann keine nützlichen Ergebnisse finden. Daher fehlt mir offensichtlich etwas.

Was ist die richtige Java7-Methode, um den Inhalt einer Webseite herunterzuladen? Gibt es wirklich keinen anständigen HTTP-Client als Teil der Sprache? Ich finde das schwer zu glauben.

Meine Maven-Abhängigkeit dafür ist ...

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

Relevante Einfuhren:

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

Verwendungszweck:

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

EDIT (nach Jules Vorschlag):

Da die Methode build() ein CloseableHttpClient zurückgibt, das is-aAutoClosable ist, können Sie die Deklaration in eine try-with-resources-Anweisung einfügen ( Java 7+):

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

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

} catch (IOException e) {

    // handle

}
251

Meiner Meinung nach ist die akzeptierte Antwort korrekt, es fehlt jedoch eine Lehre, da hier nicht erklärt wird, wie die Antwort zu finden ist. Für alle veralteten Klassen schauen Sie sich das JavaDoc an (wenn Sie es nicht haben, laden Sie es entweder herunter oder Gehe online ), es wird angezeigt, welche Klasse verwendet werden soll, um den alten Code zu ersetzen. Natürlich wird es Ihnen nicht alles erzählen, aber dies ist ein Anfang. Beispiel:

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

Jetzt müssen Sie die Klasse HttpClientBuilder verwenden, da es keinen Konstruktor gibt, mit dem Sie eine Builder-Instanz abrufen können stattdessen eine statische Methode: create. Sobald Sie den Builder haben, können Sie auch davon ausgehen, dass es für die meisten Builder eine Build-Methode gibt , also:

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

AutoClosable:

Wie Jules in den Kommentaren angedeutet hat, implementiert die zurückgegebene Klasse Java.io.Closable, wenn Sie also Java 7 oder höher) verwenden, können Sie jetzt Folgendes tun:

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

Der Vorteil ist, dass Sie sich nicht mit finally und null beschäftigen müssen.

Andere relevante Informationen

Lesen Sie auch Verbindungspooling und stellen Sie die Zeitüberschreitungen ein .

59

Beispiele aus Apache benutze dies:

HttpClient httpclient = HttpClients.createDefault();

Die Klasse org.Apache.http.impl.client.HttpClients Gibt es seit Version 4.3. Der Code für HttpClients.createDefault() ist der gleiche wie die hier akzeptierte Antwort.

10
IvanRF

Versuchen jcabi-http , das ist ein fließender Java HTTP-Client, zum Beispiel:

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

Siehe auch diesen Blog-Beitrag: http://www.yegor256.com/2014/04/11/jcabi-http-intro.html

7
yegor256

In Version 4.3-alpha1, Die Sie aufgrund der Versionsangabe LATEST verwenden, ist sie veraltet. Wenn Sie sich das Javadoc der Klasse ansehen, erfahren Sie, was Sie stattdessen verwenden sollen: HttpClientBuilder.

In der neuesten stabilen Version (4.2.3) Ist DefaultHttpClient noch nicht veraltet.

7
zagyi

Ich würde vorschlagen, die folgende Methode zu verwenden, wenn Sie versuchen, nur die JSON-Daten zu lesen.

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

Sie können die folgende Maven-Abhängigkeit hinzufügen.

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

Sie könnten folgenden Import in Ihrem Java Code verwenden.

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;

Sie könnten folgenden Codeblock in Ihrem Java code. verwenden

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

Dies ist die Lösung, die ich auf das Problem angewendet habe, das httpclient in dieser Version von 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

Verwenden Sie HttpClientBuilder , um HttpClient zu erstellen, anstatt DefaultHttpClient zu verwenden

ex:

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

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