Kullanımdan kaldırıldı Java HttpClient - Ne kadar zor olabilir?


172

Tüm yapmaya çalıştığım bazı JSON indirmek ve bir nesneye serileştirmek olduğunu. Henüz JSON'u indirebildim.

Apache sitesinde olanlar da dahil olmak üzere bulabildiğim hemen hemen her HttpClient örneği ...

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

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

Ancak Netbeans bana bunun DefaultHttpClientreddedildiğini söylüyor . Ben googling denedim DefaultHttpClient deprecatedve aklıma gelen gibi diğer birçok varyasyon denedim ve herhangi bir yararlı sonuç bulamıyorum, bu yüzden açıkçası bir şey eksik.

Bir web sayfasının içeriğini indirmenin doğru Java7 yolu nedir? Dilin bir parçası olarak gerçekten iyi bir Http İstemcisi yok mu? Buna inanmakta zorlanıyorum.

Bunun için Maven bağımlılığım ...

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

2
NetBeans size yanlış söylüyor veya bir şeyi yanlış okuyorsunuz. DefaultHttpClientkesinlikle reddedilmiyor. POM'nizde hangi sürümü belirttiniz?
Algı

8
4.3-alfa1'de kullanımdan kaldırılıyor gibi görünüyor
Arun P Johny

3
Httpclient API bir tren kazası haklısın
Hans Westerbeek

2
Sürümü LATEST yerine bazı büyük sürüm numaralarına ayarlamanızı tavsiye ederim. Bu, yükseltme işlemini manuel olarak kontrol etmenize ve Maven'in sizin için karar vermesine izin vermeyecektir.
Christophe Roussy

1
@Temel yeni bir projede bile üzerinde çalışırken herhangi bir zamanda değişebilir, eğer kendiniz ayarlamadıysanız bu kafa karıştırıcı olabilir. Örneğin işe yaradı ve derlendi ve kodu işlediniz. Ertesi gün başka biri gelir, ödeme yapar ve en son sürüm değiştiği için derlenmez. Tabii ki istediğinizi yaparsınız ama bu nedenle (versiyonlama) kullanmaktan kaçınırım.
Christophe Roussy

Yanıtlar:


259

İlgili ithalatlar:

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

Kullanımı:

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

EDIT (Jules'in önerisinden sonra):

Gibi build()yöntem döndürür CloseableHttpClienthangi is-a AutoClosable , bir deneyin-ile-kaynaklar deyimi (Java 7+) içinde deklarasyon yerleştirebilirsiniz:

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

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

} catch (IOException e) {

    // handle

}

2
4.3'ün altındaki sürümü kullanıyorsunuz (ve Commons HTTPClient değil, Apache HTTPClient olmalıdır)
Alfishe

7
Dönüş değerinin, CloseableHttpClientkullanımdan sonra kapatmanız gereken a olduğunu unutmayın . Bu uygular AutoCloseableEğer 7+ Java denemeye-with-kaynaklar açıklamada kullanabilirsiniz böylece,: try (CloseableHttpClient httpclient = ...) { ... }.
Jules

2
CloseableHttpClient httpClient = HttpClientBuilder.create (). Build (); benim için bu iş
Sameer Kazi

6
Soru:create() Statik yöntemle döndürülen HttpClientBuilder örneğini beklemeli miyiz? Yoksa create()ihtiyacımız olan her şeyi arayabilir miyiz? ... Btw, buna import org.apache.http.impl.client.HttpClientBuilderihtiyacı olan herkes için. [İçe aktarma ifadeleri olmadan yanıtları beğenmez. Endişelenme, hala açıldım :)]
ADTC

1
@HartmutPfitzinger Android'de OkHttp kullanıyor. Çatallı bir Apache Http İstemcisi ile uğraştılar, bu şimdi miras.
10'da sschrass

59

IMHO kabul edilen cevabı doğru ama cevabı nasıl bulacağınızı açıklamadığı için bazı 'öğretileri' kaçırıyor. Kullanımdan kaldırılan tüm sınıflar için JavaDoc'a bakın (eğer indirmezseniz veya çevrimiçi olmazsanız), eski kodu değiştirmek için hangi sınıfın kullanılacağını ima eder. Tabii ki size her şeyi anlatmayacak, ama bu bir başlangıç. Misal:

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

Şimdi kullanmak sınıf var, HttpClientBuilderbir almak için hiçbir yapıcı olmadığı için oluşturucu yerine statik bir yöntem olması gerektiğini tahmin edebilir örneği: create. Yapıcıya sahip olduktan sonra, çoğu inşaatçı için bir yapı yöntemi olduğunu tahmin edebilirsiniz , böylece:

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

AutoClosable:

Jules yorumlarda ima ettiği gibi, döndürülen sınıf uygular java.io.Closable, bu nedenle Java 7 veya üstünü kullanırsanız şunları yapabilirsiniz:

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

Avantajı, sonunda ve null'larla uğraşmak zorunda kalmamanızdır.

Diğer ilgili bilgiler

Ayrıca bağlantı havuzu oluşturma hakkında bilgi aldığınızdan ve zaman aşımlarını ayarladığınızdan emin olun .


11

Apache'den örnekler bunu kullanır:

CloseableHttpClient httpclient = HttpClients.createDefault();

Sınıf org.apache.http.impl.client.HttpClients, 4.3 sürümünden beri oradadır.

Kodu , burada kabul edilen cevaplaHttpClients.createDefault() aynıdır .


HttpClient client = HttpClients.createDefault () kullanılırken "Neden: java.lang.VerifyError: org / apache / http / conn / ssl / DefaultHostnameVerifier" hatası alma;
Md Imran Choudhury

7

Sürüm belirtimi 4.3-alpha1nedeniyle kullandığınız sürümde kullanımdan kaldırıldı LATEST. Sınıfın javadoc bakmak, bu ne yerine kullanmak söyler: HttpClientBuilder.

En son kararlı sürümde ( 4.2.3) DefaultHttpClienthenüz kullanımdan kaldırılmamıştır.


Yanıt için teşekkürler - Netbeans org.apache öğelerinin hiçbirinde JavaDocs göstermiyor - ancak bunun farklı bir sorun olduğunu düşünüyorum
Temel

Muhtemelen kaynaklara kütüphaneye bağlı değilsiniz. Netbeans kullanmıyorum, ama sanırım bağımlılıkların kaynaklarını indirmesini istemenin bir yolu var.
zagyi


4

Yalnızca json verilerini okumaya çalışıyorsanız aşağıdaki yöntemi kullanmanızı öneririm.

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();

Sorular söylendi DefaultHttpClient, kullanımdan kaldırıldı ve cevabınızda kullanmanızı öneririz ...
Temel

Alternatif yaklaşım için teşekkürler. Zaten cevaplı cevap ile gittim ama bu bir dahaki sefere denemek için yeterince hafif görünüyor.
Temel

2

Kullanım HttpClientBuilder inşa etmek HttpClient kullanmak yerine DefaultHttpClient

örn:

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

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

Neden new HttpClientBuilder()olmasın HttpClientBuilder.create()?
ADTC

2

Aşağıdaki Maven bağımlılığını ekleyebilirsiniz.

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

Java kodunuzda aşağıdaki içe aktarmayı kullanabilirsiniz.

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;

Java kodunuzda aşağıdaki kod bloğunu kullanabilirsiniz.

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

HttpResponse response = client.execute(httpUriRequest);
System.out.println("Response:"+response);

Cevaplamak için zaman ayırdığınız için teşekkür ederiz, ancak bu kabul edilen cevaptan nasıl farklıdır?
Temel

1
Cevapların çoğu psuedo kodlarıdır, maven bağımlılığı ile birlikte Apache HTTP İstemci API ile uçtan uca temel çalışma Java kodu yapmayı denedim. Ama harika bir şey yok.
Red Boy

1

Bu, android 22'nin bu sürümünde httpclient'in kullanımdan kaldırılması sorununa uyguladığım çözüm

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

-2

Orijinal sayı için, aşağıdaki mantığı uygulamanızı rica ediyorum:

 CloseableHttpClient httpClient = HttpClientBuilder.create().build();
 HttpPost httpPostRequest = new HttpPost();
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.