2009-08-24 44 views
72

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

Yêu cầu của tôi là gửi yêu cầu HTTPS POST tới máy chủ từ xa. Tôi đã sử dụng gói java.net. * Trong quá khứ 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 một số ý kiến ​​/ đề xuất của bạn.

Trả lời

81

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:

  • tiêu chuẩn dựa, tinh khiết Java, thực hiện phiên bản HTTP 1.0 và 1,1
    • Thực hiện đầy đủ của tất cả các phương thức HTTP (GET, POST, PUT, DELETE, HEAD, OPTIONS và TRACE) trong khung công tác OO mở rộng .
    • Hỗ trợ mã hóa bằng giao thức HTTPS (HTTP qua SSL).
    • Cấu hình và theo dõi không theo tiêu chuẩn chi tiết.
    • Kết nối trong suốt thông qua proxy HTTP.
    • Kết nối HTTPS đường hầm 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) bằng cách sử dụng hỗ trợ ổ cắm Java bản địa .
    • Xác thực bằng phương thức NTLM cơ bản, Thông báo và mã hóa NTLM (NT Trình quản lý Lan).
    • Cơ chế trình cắm cho các phương thức xác thực tùy chỉnh.
    • ĐĂNG KÝ dạng đa phần để tải lên các tệp lớn.
    • Pluggable ổ cắm an toàn hiện thực, làm cho nó dễ dàng hơn để sử dụng thứ ba giải pháp của bên
    • hỗ trợ quản lý kết nối để sử dụng trong đa luồng ứng dụng. Hỗ trợ đặt tổng số kết nối tối đa cũng như các kết nối tối đa cho mỗi máy chủ. Phát hiện và đóng các kết nối cũ.
    • Xử lý cookie tự động để đọc Set-Cookie: tiêu đề từ máy chủ và gửi chúng trở lại 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 đệm bất kỳ nội dung nội dung nào bằng cách truyền trực tiếp đến ổ cắm tới máy chủ.
    • 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ừ socket đến máy chủ.
    • Kết nối liên tục bằng KeepAlive trong HTTP/1.0 và kiên trì trong HTTP/1.1
    • Truy cập trực tiếp vào mã phản hồi và tiêu đề được máy chủ gửi.
    • Khả năng đặt thời gian chờ kết nối.
    • HttpMethods triển khai Mẫu lệnh để cho phép yêu cầu song song và sử dụng lại 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.
+4

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

+17

Tài liệu là NGÀY RA. HttpClient không phải là một lớp cụ thể nữa, nó là một giao diện, do đó mã trên sẽ S WORK KHÔNG LÀM VIỆC 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 thực hiện giao diện HttpClient, ví dụ DefaultHttpClient. – therobyouknow

+3

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

8

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

Restlet cung cấp một khách hàng http thiết kế đặc biệt cho interactong với các dịch vụ web Restful.

Ví dụ mã:

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

15

Tôi phần nào là một phần của 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 phải vấn đề gì mà chúng tôi không thể giải quyết được.

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

  • nhà cung cấp - tạo xà phòng 1.1/1.2 cung cấp ở Jersey và đã loại bỏ sự cần thiết phải sử dụng AXIS cồng kềnh cho JAX-WS của chúng tôi gọi
  • Filters - tạo cơ sở dữ liệu ghi nhật ký bộ lọc để 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 việc ghi nhật ký thông tin nhạy cảm.
  • JAXB - hỗ trợ marshaling đến/từ đối tượng trực tiếp từ request/response
  • API rất dễ dàng để sử dụng

Trong sự thật, HttpClient và Jersey rất giống nhau trong việc thực hiện 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 Jersey Chủ đầu tư: https://blogs.oracle.com/PavelBucek/entry/jersey_client_apache_http_client

4

Tôi có thể khuyên bạn nên corn-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)); 

maven phụ thuộc

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

Tôi muốn đề cập đến số Ning Async Http Client Library. Tôi đã không bao giờ sử dụng nó nhưng đồng nghiệp của tôi raves về nó so với Apache Http Client, mà tôi đã luôn luôn được sử dụng trong quá khứ. Tôi đặc biệt quan tâm để tìm hiểu nó dựa trên Netty, khung công tác không đồng bộ hiệu suất cao i/o, mà tôi quen thuộc hơn và giữ lòng tự trọng cao.

Các vấn đề liên quan