HttpClient Java yang sudah usang - Seberapa sulit?

172

Yang saya coba lakukan adalah mengunduh beberapa JSON dan menghapusnya menjadi objek. Saya belum bisa mengunduh JSON.

Hampir setiap contoh HttpClient tunggal yang dapat saya temukan, termasuk yang ada di situs apache terlihat seperti ...

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

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

Namun, Netbeans memberi tahu saya bahwa DefaultHttpClientitu sudah usang. Saya sudah mencoba googling untuk DefaultHttpClient deprecateddan banyak variasi lain yang dapat saya pikirkan dan tidak dapat menemukan hasil yang bermanfaat, jadi saya jelas kehilangan sesuatu.

Apa cara Java7 yang benar untuk mengunduh konten halaman web? Apakah benar-benar tidak ada Klien Http yang layak sebagai bagian dari bahasa? Saya merasa sulit untuk percaya.

Ketergantungan Maven saya untuk ini adalah ...

<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpclient</artifactId>
    <version>LATEST</version>
    <type>jar</type>
</dependency>
Dasar
sumber
2
NetBeans mengatakan Anda salah, atau Anda salah membaca sesuatu. DefaultHttpClientpasti tidak usang. Versi apa yang Anda tentukan dalam POM Anda?
Persepsi
8
di 4.3-alpha1 tampaknya sudah usang
Arun P Johny
3
Anda benar, httpclient API adalah trainwreck
Hans Westerbeek
2
Saya akan merekomendasikan Anda mengatur versi ke beberapa nomor rilis utama, bukan TERBARU. Ini akan memungkinkan Anda untuk mengontrol proses pemutakhiran secara manual dan tidak membiarkan Maven memutuskan untuk Anda.
Christophe Roussy
1
@Basic itu dapat berubah kapan saja saat Anda mengerjakannya bahkan dalam proyek baru, ini mungkin membingungkan jika Anda tidak mengaturnya sendiri. Misalnya itu berfungsi dan dikompilasi dan Anda komit kode. Orang lain tiba pada hari berikutnya, checkout dan bahkan tidak dapat dikompilasi karena versi TERBARU berubah. Tentu saja Anda melakukan apa yang Anda inginkan tetapi saya akan menghindari menggunakannya untuk alasan ini (versi).
Christophe Roussy

Jawaban:

259

Impor yang relevan:

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

Pemakaian:

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

EDIT (setelah saran Jules):

Saat build()metode mengembalikan CloseableHttpClientyang is-a AutoClosable , Anda bisa menempatkan deklarasi dalam pernyataan try-with-resources (Java 7+):

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

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

} catch (IOException e) {

    // handle

}
hthserhs
sumber
2
Anda menggunakan versi di bawah 4.3 (dan itu harus Apache HTTPClient, bukan Commons HTTPClient)
Alfishe
7
Perhatikan bahwa nilai kembali adalah a CloseableHttpClient, yang harus Anda tutup setelah digunakan. Menerapkan AutoCloseable, sehingga Anda dapat menggunakannya dalam mencoba-dengan-sumber pernyataan di Jawa 7+: try (CloseableHttpClient httpclient = ...) { ... }.
Jules
2
CloseableHttpClient httpClient = HttpClientBuilder.create (). Build (); ini bekerja untuk saya
Sameer Kazi
6
Pertanyaan: Haruskah kita berpegang pada instance HttpClientBuilder yang dikembalikan oleh create()metode statis? Atau bisakah kita menelepon create()kapan saja kita membutuhkannya? ... Btw, import org.apache.http.impl.client.HttpClientBuilderuntuk siapa saja yang membutuhkannya. [Tidak suka jawaban tanpa pernyataan impor. Jangan khawatir, saya masih
ter
1
@HartmutPfitzinger menggunakan OkHttp di Android. Mereka mengacaukan dengan Klien Http Apache bercabang, yang sekarang warisan.
sschrass
59

IMHO jawaban yang diterima sudah benar tetapi melewatkan beberapa 'pengajaran' karena tidak menjelaskan bagaimana memunculkan jawabannya. Untuk semua kelas yang sudah usang lihatlah JavaDoc (jika Anda tidak memilikinya, unduh atau online ), itu akan memberi petunjuk pada kelas mana yang akan digunakan untuk mengganti kode lama. Tentu saja itu tidak akan memberi tahu Anda segalanya, tetapi ini adalah awal. Contoh:

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

Sekarang Anda memiliki kelas untuk digunakan, HttpClientBuilderkarena tidak ada konstruktor untuk mendapatkan pembangun contoh Anda mungkin menduga bahwa harus ada metode statis sebagai gantinya: create. Setelah Anda memiliki builder, Anda juga dapat menebak bahwa untuk sebagian besar builder ada metode build , jadi:

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

AutoClosable:

Seperti Jules mengisyaratkan dalam komentar, kelas yang dikembalikan mengimplementasikan java.io.Closable, jadi jika Anda menggunakan Java 7 atau lebih baru sekarang Anda dapat melakukannya:

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

Keuntungannya adalah Anda tidak harus berurusan dengan akhirnya dan nol.

Info relevan lainnya

Pastikan juga untuk membaca tentang penyatuan koneksi dan mengatur batas waktu .

Christophe Roussy
sumber
11

Contoh dari Apache menggunakan ini:

CloseableHttpClient httpclient = HttpClients.createDefault();

Kelas org.apache.http.impl.client.HttpClientssudah ada sejak versi 4.3.

Kode untuk HttpClients.createDefault()ini sama dengan jawaban yang diterima di sini.

IvanRF
sumber
dapatkan kesalahan "Disebabkan oleh: java.lang.VerifyError: org / apache / http / conn / ssl / DefaultHostnameVerifier" ketika menggunakan HttpClient client = HttpClients.createDefault ();
Md Imran Choudhury
7

Itu menjadi usang dalam versi 4.3-alpha1yang Anda gunakan karena LATESTspesifikasi versi. Jika anda melihat pada javadoc kelas, ia memberitahu Anda apa yang harus digunakan sebagai gantinya: HttpClientBuilder.

Dalam versi stabil terbaru ( 4.2.3) DefaultHttpClientbelum ditinggalkan.

zagyi
sumber
Terima kasih atas tanggapannya - Netbeans tidak menampilkan JavaDocs untuk hal-hal org.apache - tapi saya kira itu masalah yang berbeda
Basic
Anda mungkin tidak memiliki sumber yang dilampirkan ke perpustakaan. Saya tidak menggunakan Netbeans, tapi saya kira ada cara untuk memintanya mengunduh sumber-sumber dependensi.
zagyi
7

Coba jcabi-http, yang merupakan klien HTTP Java yang lancar, misalnya:

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

Periksa juga posting blog ini: http://www.yegor256.com/2014/04/11/jcabi-http-intro.html

yegor256
sumber
4

Saya akan menyarankan menggunakan metode di bawah ini jika Anda mencoba membaca data json saja.

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();
Anubhab
sumber
Pertanyaan mengatakan DefaultHttpClientsudah usang dan Anda menyarankan untuk menggunakannya dalam jawaban Anda ...
Basic
Terima kasih atas pendekatan alternatifnya. Saya sudah menggunakan jawaban yang sudah ada tetapi ini terlihat cukup ringan sehingga saya akan mencobanya lain kali.
Dasar
2

Gunakan HttpClientBuilder untuk membangun HttpClient alih-alih menggunakan DefaultHttpClient

ex:

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

 // Prepare a request object
 HttpGet httpget = new HttpGet("http://www.apache.org/");
Arun P Johny
sumber
Kenapa new HttpClientBuilder()dan tidak HttpClientBuilder.create()?
ADTC
2

Anda bisa menambahkan ketergantungan Maven berikut.

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

Anda dapat menggunakan impor berikut dalam kode java Anda.

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;

Anda bisa menggunakan blok kode berikut dalam kode java Anda.

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

HttpResponse response = client.execute(httpUriRequest);
System.out.println("Response:"+response);
Bocah Merah
sumber
Terima kasih telah meluangkan waktu untuk menjawab, tetapi bagaimana ini berbeda dari jawaban yang diterima?
Dasar
1
Sebagian besar jawaban adalah kode psuedo, saya mencoba melakukan kode Java dasar end-to-end bekerja dengan Apache HTTP Client API bersama dengan ketergantungan maven. Tidak ada yang bagus.
Red Boy
1

Ini adalah solusi yang telah saya terapkan pada masalah yang httpclient usang dalam versi android 22 ini

 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;
    }
}
Frutos Marquez
sumber
-2

Untuk masalah asli, saya akan meminta Anda untuk menerapkan logika di bawah ini:

 CloseableHttpClient httpClient = HttpClientBuilder.create().build();
 HttpPost httpPostRequest = new HttpPost();
Pra_A
sumber