Thư viện Java tốt nhất để sử dụng cho HTTP POST, GET, v.v. là gì? [đóng cửa]


97

Thư viện Java tốt nhất để sử dụng cho HTTP POST, GET, v.v. về hiệu suất, độ ổn định, độ trưởng thành, v.v. là gì? Có một thư viện cụ thể được sử dụng nhiều hơn những thư viện khác không?

Yêu cầu của tôi là gửi yêu cầu HTTPS POST đến máy chủ từ xa. Tôi đã sử dụng gói java.net. * Trước đây cũng như gói org.apache.commons.httpclient. *. Cả hai đều đã hoàn thành công việc, nhưng tôi muốn có một số ý kiến ​​/ đề xuất của bạn.

Câu trả lời:


107

imho: Apache HTTP Client

ví dụ sử dụng:

import org.apache.commons.httpclient.*;
import org.apache.commons.httpclient.methods.*;
import org.apache.commons.httpclient.params.HttpMethodParams;

import java.io.*;

public class HttpClientTutorial {

  private static String url = "http://www.apache.org/";

  public static void main(String[] args) {
    // Create an instance of HttpClient.
    HttpClient client = new HttpClient();

    // Create a method instance.
    GetMethod method = new GetMethod(url);

    // Provide custom retry handler is necessary
    method.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, 
            new DefaultHttpMethodRetryHandler(3, false));

    try {
      // Execute the method.
      int statusCode = client.executeMethod(method);

      if (statusCode != HttpStatus.SC_OK) {
        System.err.println("Method failed: " + method.getStatusLine());
      }

      // Read the response body.
      byte[] responseBody = method.getResponseBody();

      // Deal with the response.
      // Use caution: ensure correct character encoding and is not binary data
      System.out.println(new String(responseBody));

    } catch (HttpException e) {
      System.err.println("Fatal protocol violation: " + e.getMessage());
      e.printStackTrace();
    } catch (IOException e) {
      System.err.println("Fatal transport error: " + e.getMessage());
      e.printStackTrace();
    } finally {
      // Release the connection.
      method.releaseConnection();
    }  
  }
}

một số tính năng nổi bật:

  • Dựa trên tiêu chuẩn, Java thuần túy, triển khai HTTP phiên bản 1.0 và 1.1
    • Triển khai đầy đủ tất cả các phương thức HTTP (GET, POST, PUT, DELETE, HEAD, OPTIONS và TRACE) trong một khung OO có thể mở rộng.
    • Hỗ trợ mã hóa với giao thức HTTPS (HTTP qua SSL).
    • Cấu hình và theo dõi phi tiêu chuẩn chi tiết.
    • Kết nối trong suốt thông qua proxy HTTP.
    • Kết nối HTTPS theo đường hầm thông qua proxy HTTP, thông qua phương thức CONNECT.
    • Kết nối trong suốt thông qua proxy SOCKS (phiên bản 4 & 5) sử dụng hỗ trợ ổ cắm Java gốc.
    • Xác thực bằng cách sử dụng các phương pháp Basic, Digest và mã hóa NTLM (NT Lan Manager).
    • Cơ chế trình cắm cho các phương pháp xác thực tùy chỉnh.
    • POST của biểu mẫu Nhiều Phần để tải lên các tệp lớn.
    • Triển khai ổ cắm an toàn có thể cài đặt, giúp sử dụng các giải pháp của bên thứ ba dễ dàng hơn
    • Hỗ trợ quản lý kết nối để sử dụng trong các ứng dụng đa luồng. Hỗ trợ thiết lập tổng số kết nối tối đa cũng như kết nối tối đa trên mỗi máy chủ. Phát hiện và đóng các kết nối cũ.
    • Tự động xử lý Cookie để đọc Set-Cookie: tiêu đề từ máy chủ và gửi lại chúng trong tiêu đề Cookie: khi thích hợp.
    • Cơ chế trình cắm cho các chính sách cookie tùy chỉnh.
    • Yêu cầu luồng đầu ra để tránh lưu vào bộ đệm bất kỳ nội dung nào bằng cách truyền trực tiếp đến ổ cắm tới máy chủ.
    • Các luồng đầu vào phản hồi để đọc hiệu quả nội dung phản hồi bằng cách truyền trực tiếp từ ổ cắm tới máy chủ.
    • Các kết nối liên tục bằng KeepAlive trong HTTP / 1.0 và ổn định trong HTTP / 1.1
    • Truy cập trực tiếp vào mã phản hồi và tiêu đề do máy chủ gửi.
    • Khả năng đặt thời gian chờ kết nối.
    • HttpMethods triển khai Command Pattern để cho phép các yêu cầu song song và tái sử dụng hiệu quả các kết nối.
    • Mã nguồn có sẵn miễn phí theo Giấy phép Phần mềm Apache.

7
+1 Câu trả lời tuyệt vời: Ví dụ tuyệt vời. Những điểm tuyệt vời. Bạn thực sự bán Apache HTTP Client.
therobyouknow

23
Tuy nhiên, tài liệu đã HẾT NGÀY. HttpClient không phải là một lớp cụ thể nữa, nó là một giao diện, do đó, đoạn mã trên SẼ KHÔNG HOẠT ĐỘNG khi nó cố gắng khởi tạo giao diện HttpClient này. Thay vào đó, bạn sẽ phải khởi tạo một lớp triển khai giao diện HttpClient, ví dụ như DefaultHttpClient.
therobyouknow

4
có vẻ như mỗi bản phát hành có quá nhiều thay đổi lớn ... thực sự thất vọng với thư viện này trong những năm qua .... và bây giờ chúng dường như bị rò rỉ kết nối từ nhóm mà tôi đã thiết lập tối đa 20 ... grrrrrr .
Dean Hiller

5
Apache HttpClient hiện có vẻ là EOL, với một thư viện Apache mới có sẵn.
Andrew Aylett,

17
Thưa Down-Cử tri, câu trả lời này đã được tạo ra gần 5 năm trước ...
Chris


16

Tôi có phần thích Jersey . Chúng tôi sử dụng 1.10 trong tất cả các dự án của mình và chưa gặp sự cố mà chúng tôi không thể giải quyết với nó.

Một số lý do tại sao tôi thích nó:

  • Nhà cung cấp - đã tạo ra các nhà cung cấp xà phòng 1.1 / 1.2 ở Jersey và đã loại bỏ nhu cầu sử dụng AXIS cồng kềnh cho các cuộc gọi JAX-WS của chúng tôi
  • Bộ lọc - bộ lọc ghi nhật ký cơ sở dữ liệu được tạo để ghi lại toàn bộ yêu cầu (bao gồm cả tiêu đề yêu cầu / phản hồi) trong khi ngăn chặn việc ghi lại thông tin nhạy cảm.
  • JAXB - hỗ trợ sắp xếp đến / từ các đối tượng ngay từ yêu cầu / phản hồi
  • API rất dễ sử dụng

Trên thực tế, HTTPClient và Jersey rất giống nhau về cách triển khai và API. Ngoài ra còn có một phần mở rộng cho Jersey cho phép nó hỗ trợ HTTPClient.

Một số mẫu mã với Jersey 1.x: https://blogs.oracle.com/enterprisetechtips/entry/consuming_restful_web_services_with

http://www.mkyong.com/webservices/jax-rs/restful-java-client-with-jersey-client/

HTTPClient với ứng dụng Jersey: https://blogs.oracle.com/PavelBucek/entry/jersey_client_apache_http_client


11

Tôi đồng ý httpclient là một cái gì đó tiêu chuẩn - nhưng tôi đoán bạn đang tìm kiếm các tùy chọn để ...

Restlet cung cấp một ứng dụng khách http được thiết kế đặc biệt để tương tác với các dịch vụ web Restful.

Mã ví dụ:

    Client client = new Client(Protocol.HTTP);
    Request r = new Request();
    r.setResourceRef("http://127.0.0.1:8182/sample");
    r.setMethod(Method.GET);
    r.getClientInfo().getAcceptedMediaTypes().add(new Preference<MediaType>(MediaType.TEXT_XML));
    client.handle(r).getEntity().write(System.out);

Xem http://www.restlet.org/ để biết thêm chi tiết


6

Tôi có thể giới thiệu bạn ngô-httpclient . Nó đơn giản, nhanh chóng và đủ cho hầu hết các trường hợp.

HttpForm form = new HttpForm(new URI("http://localhost:8080/test/formtest.jsp"));
//Authentication form.setCredentials("user1", "password");
form.putFieldValue("input1", "your value");
HttpResponse response = form.doPost();
assertFalse(response.hasError());
assertNotNull(response.getData());
assertTrue(response.getData().contains("received " + val));

sự phụ thuộc của maven

<dependency>
    <groupId>net.sf.corn</groupId>
    <artifactId>corn-httpclient</artifactId>
    <version>1.0.0</version>
</dependency>


5

Tôi muốn đề cập đến Thư viện khách hàng Ning Async Http . Tôi chưa bao giờ sử dụng nó nhưng đồng nghiệp của tôi say sưa nói về nó so với Apache Http Client mà tôi đã luôn sử dụng trước đây. Tôi đặc biệt quan tâm đến việc tìm hiểu nó dựa trên Netty , khuôn khổ i / o không đồng bộ hiệu suất cao, mà tôi quen thuộc hơn và đánh giá cao.

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.