Không chấp nhận Java httpClient - Nó khó đến mức nào?


172

Tất cả những gì tôi đang cố gắng làm là tải xuống một số JSON và giải tuần tự hóa nó thành một đối tượng. Tôi chưa tải được JSON bao giờ.

Hầu như mọi ví dụ về httpClient tôi có thể tìm thấy, bao gồm cả những ví dụ trên trang apache trông giống như ...

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

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

Tuy nhiên, Netbeans nói với tôi rằng điều đó DefaultHttpClientkhông được chấp nhận. Tôi đã thử googling cho DefaultHttpClient deprecatedvà nhiều biến thể khác mà tôi có thể nghĩ ra và không thể tìm thấy bất kỳ kết quả hữu ích nào, vì vậy tôi rõ ràng đang thiếu một cái gì đó.

Cách Java7 chính xác để tải xuống nội dung của trang web là gì? Có thực sự không có khách hàng http tốt như là một phần của ngôn ngữ? Tôi thấy khó tin.

Sự phụ thuộc Maven của tôi cho điều này là ...

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

2
NetBeans đang nói với bạn sai, hoặc bạn đang đọc sai một cái gì đó. DefaultHttpClientchắc chắn không được phản đối Phiên bản nào bạn đã chỉ định trong POM của mình?
Nhận thức

8
trong 4.3-alpha1 dường như không được chấp nhận
Arun P Johny

3
Bạn nói đúng, API httpclient là một con tàu đắm
Hans Westerbeek

2
Tôi khuyên bạn nên đặt phiên bản thành một số số phát hành chính thay vì LATEST. Điều này sẽ cho phép bạn kiểm soát thủ công quá trình nâng cấp và không để Maven quyết định cho bạn.
Barshe Roussy

1
@Basic nó có thể thay đổi bất cứ lúc nào trong khi bạn làm việc với nó ngay cả trong một dự án mới, điều này có thể gây nhầm lẫn nếu bạn không tự đặt nó. Ví dụ, nó hoạt động và được biên dịch và bạn cam kết mã. Một số người khác đến vào ngày hôm sau, kiểm tra và nó thậm chí không biên dịch vì phiên bản MỚI NHẤT đã thay đổi. Tất nhiên bạn làm những gì bạn muốn nhưng tôi sẽ tránh sử dụng nó vì lý do này (phiên bản).
Barshe Roussy

Câu trả lời:


259

Nhập khẩu có liên quan:

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

Sử dụng:

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

EDIT (sau gợi ý của Jules):

Khi build()phương thức trả về một CloseableHttpClientlà-một AutoClosable , bạn có thể đặt các tuyên bố trong một tuyên bố thử-với-nguồn (Java 7+):

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

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

} catch (IOException e) {

    // handle

}

2
Bạn đang sử dụng phiên bản dưới 4.3 (và phải là HTTPClient của Apache, không phải là Commons HTTPClient)
Alfishe 15/03/2016

7
Lưu ý rằng giá trị trả về là a CloseableHttpClient, mà bạn nên đóng sau khi sử dụng. Nó triển khai AutoCloseable, do đó bạn có thể sử dụng nó trong câu lệnh try-with-resource trong Java 7+ : try (CloseableHttpClient httpclient = ...) { ... }.
Jules

2
Có thể đóngHttpClient httpClient = HttpClientBuilder.create (). Build (); công việc này đối với tôi
Sameer Kazi

6
Câu hỏi: Chúng ta có nên giữ đối tượng HttpClientBuilder được trả về bởi create()phương thức tĩnh không? Hoặc chúng ta có thể gọi create()bất cứ khi nào chúng ta cần không? ... Btw, import org.apache.http.impl.client.HttpClientBuildercho bất cứ ai cần điều đó. [Không thích câu trả lời mà không có báo cáo nhập khẩu. Đừng lo lắng tôi vẫn tăng cường :)]
ADTC

1
@HartmutPfitzinger sử dụng OkHttp trên Android. Họ đã nhắn tin với một Apache Client Client, đó là di sản.
sschrass

59

IMHO câu trả lời được chấp nhận là chính xác nhưng bỏ lỡ một số 'giảng dạy' vì nó không giải thích làm thế nào để đưa ra câu trả lời. Đối với tất cả các lớp không dùng nữa, hãy xem JavaDoc (nếu bạn không tải xuống hoặc tải trực tuyến ), nó sẽ gợi ý lớp nào sẽ sử dụng để thay thế mã cũ. Tất nhiên nó sẽ không cho bạn biết tất cả mọi thứ, nhưng đây là một sự khởi đầu. Thí dụ:

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

Bây giờ bạn có lớp để sử dụng, HttpClientBuildervì không có hàm tạo để lấy một cá thể trình xây dựng, bạn có thể đoán rằng phải có một phương thức tĩnh thay thế : create. Khi bạn có trình tạo, bạn cũng có thể đoán rằng đối với hầu hết các trình xây dựng, có một phương thức xây dựng , do đó:

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

Tự động xóa:

Như Jules đã gợi ý trong các bình luận, lớp trả về thực hiện java.io.Closable, vì vậy nếu bạn sử dụng Java 7 trở lên, bây giờ bạn có thể làm:

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

Ưu điểm là bạn không phải đối phó với cuối cùng và null.

Thông tin liên quan khác

Đồng thời đảm bảo đọc về kết nối tổng hợp và đặt thời gian chờ .


11

Các ví dụ từ Apache sử dụng điều này:

CloseableHttpClient httpclient = HttpClients.createDefault();

Lớp học org.apache.http.impl.client.HttpClientsở đó kể từ phiên bản 4.3.

Mã cho HttpClients.createDefault()giống như câu trả lời được chấp nhận ở đây.


gặp lỗi "Nguyên nhân do: java.lang.VerifyError: org / apache / http / Conn / ssl / DefaulthostnameVerifier" khi sử dụng httpClient client = HttpClrons.createDefault ();
Md Imran Choudhury

7

Nó bị phản đối trong phiên bản 4.3-alpha1mà bạn sử dụng do LATESTđặc điểm kỹ thuật của phiên bản. Nếu bạn xem javadoc của lớp, nó sẽ cho bạn biết nên sử dụng cái gì thay thế : HttpClientBuilder.

Trong phiên bản ổn định mới nhất ( 4.2.3) DefaultHttpClientvẫn chưa được phản đối.


Cảm ơn phản hồi - Netbeans không hiển thị bất kỳ JavaDocs nào cho bất kỳ nội dung org.apache nào - nhưng tôi cho rằng đó là một vấn đề khác
Basic

Bạn có thể không có các nguồn gắn liền với thư viện. Tôi không sử dụng Netbeans, nhưng tôi đoán có một cách để yêu cầu nó tải xuống các nguồn phụ thuộc.
zagyi


4

Tôi sẽ đề nghị sử dụng phương pháp dưới đây nếu bạn đang cố gắng chỉ đọc dữ liệu json.

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

Các câu hỏi nói DefaultHttpClientkhông được chấp nhận và bạn đề nghị sử dụng nó trong câu trả lời của mình ...
Basic

Cảm ơn cho cách tiếp cận thay thế. Tôi đã đi với câu trả lời khó hiểu nhưng điều này có vẻ nhẹ đến mức tôi sẽ thử lại lần sau.
Cơ bản

2

Sử dụng HttpClientBuilder để xây dựng HTTPClient thay vì sử dụng DefaultHttpClient

Ví dụ:

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

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

Tại sao new HttpClientBuilder()và không HttpClientBuilder.create()?
ADTC

2

Bạn có thể thêm phụ thuộc Maven sau.

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

Bạn có thể sử dụng nhập sau trong mã java của bạn.

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;

Bạn có thể sử dụng khối mã sau trong mã java của mình.

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

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

Cảm ơn đã dành thời gian để trả lời, nhưng nó khác với câu trả lời được chấp nhận như thế nào?
Cơ bản

1
Hầu hết các câu trả lời là mã psuedo, tôi đã thử thực hiện mã Java cơ bản hoạt động từ đầu đến cuối với API máy khách HTTP HTTP cùng với sự phụ thuộc của maven. Không có gì tuyệt vời mặc dù.
Cậu bé đỏ

1

Đây là giải pháp mà tôi đã áp dụng cho vấn đề httpclient không dùng nữa trong phiên bản Android 22 này

 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

Đối với vấn đề ban đầu, tôi sẽ yêu cầu bạn áp dụng logic dưới đây:

 CloseableHttpClient httpClient = HttpClientBuilder.create().build();
 HttpPost httpPostRequest = new HttpPost();
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.