2010-09-12 33 views
7

Tôi di chuyển để phát triển ứng dụng khách http trong Java cho dự án đại học đăng nhập vào trang web, lấy dữ liệu từ dữ liệu HTML, hoàn thành và gửi biểu mẫu. Tôi không biết sử dụng lib http nào: Máy khách HTTP HTTP - không tạo mô hình DOM nhưng làm việc với chuyển hướng http, đa luồng. HTTPUnit - tạo mô hình DOM và dễ làm việc với biểu mẫu, trường, bảng, v.v. nhưng tôi không biết cách làm việc với cài đặt đa luồng và proxy.Thư viện HTTP tốt nhất cho Java?

Bạn có lời khuyên nào không?

Trả lời

8

Có vẻ như bạn đang cố tạo ứng dụng tìm kiếm trên web. Với mục đích này, tôi khuyên bạn nên sử dụng thư viện HtmlUnit.

Giúp dễ dàng làm việc với biểu mẫu, proxy và dữ liệu được nhúng trong các trang web. Dưới mui xe tôi nghĩ rằng nó sử dụng HttpClient của Apache để xử lý các yêu cầu HTTP, nhưng điều này có lẽ là quá thấp để bạn lo lắng.

Với thư viện này, bạn có thể kiểm soát trang web bằng Java giống như cách bạn kiểm soát trang web trong trình duyệt web: nhấp vào nút, nhập văn bản, chọn giá trị.

Dưới đây là một số ví dụ từ HtmlUnit's getting started page:

Nộp một hình thức:

@Test 
public void submittingForm() throws Exception { 
    final WebClient webClient = new WebClient(); 

    // Get the first page 
    final HtmlPage page1 = webClient.getPage("http://some_url"); 

    // Get the form that we are dealing with and within that form, 
    // find the submit button and the field that we want to change. 
    final HtmlForm form = page1.getFormByName("myform"); 

    final HtmlSubmitInput button = form.getInputByName("submitbutton"); 
    final HtmlTextInput textField = form.getInputByName("userid"); 

    // Change the value of the text field 
    textField.setValueAttribute("root"); 

    // Now submit the form by clicking the button and get back the second page. 
    final HtmlPage page2 = button.click(); 

    webClient.closeAllWindows(); 
} 

Sử dụng một máy chủ proxy:

@Test 
public void homePage_proxy() throws Exception { 
    final WebClient webClient = new WebClient(BrowserVersion.FIREFOX_2, "http://myproxyserver", myProxyPort); 

    //set proxy username and password 
    final DefaultCredentialsProvider credentialsProvider = (DefaultCredentialsProvider) webClient.getCredentialsProvider(); 
    credentialsProvider.addProxyCredentials("username", "password"); 

    final HtmlPage page = webClient.getPage("http://htmlunit.sourceforge.net"); 
    assertEquals("HtmlUnit - Welcome to HtmlUnit", page.getTitleText()); 

    webClient.closeAllWindows(); 
} 

Lớp WebClient là đơn ren, vì vậy mỗi chủ đề đó giao dịch với một trang web sẽ cần một cá thể WebClient của riêng nó.

Trừ khi bạn cần để xử lý Javascript hoặc CSS, bạn cũng có thể tắt những khi bạn tạo cho khách hàng:

WebClient client = new WebClient(); 
client.setJavaScriptEnabled(false); 
client.setCssEnabled(false); 
1

HTTPUnit dùng để kiểm tra đơn vị. Trừ khi bạn có nghĩa là "thử nghiệm khách hàng", tôi không nghĩ rằng nó thích hợp cho việc tạo ra một ứng dụng.

tôi cây đũa phép để phát triển khách hàng http trong Java

Bạn nhận ra, tất nhiên, mà khách hàng Apache HTTP không phải là câu trả lời của bạn, hoặc. Bạn có vẻ như muốn tạo một ứng dụng web đầu tiên.

Bạn sẽ cần servlets và JSP. Nhận Tomcat của Apache và tìm hiểu đủ JSP và JSTL để làm những gì bạn cần làm. Đừng bận tâm với các khung công tác, vì đó là khung công tác đầu tiên của bạn.

Khi bạn chạy, hãy thử một khung như Spring.

+0

Câu hỏi có vẻ khá rõ ràng phía máy khách. Servlets và JSP không liên quan đến chức năng phía máy khách. – lexicore

+0

Nghe có vẻ như jorik1000 đang cố gắng phát triển một ứng dụng phía máy chủ, nhưng đúng hơn là một ứng dụng web chuyên dụng có thể gửi và gửi thông tin. HttpUnit được thiết kế để làm cho việc kiểm tra đơn vị của các trang web trở nên dễ dàng, nhưng kết quả là nó cũng là một công cụ tốt để làm việc với một trang web ở mức cao đến các công cụ chung như kéo thông tin ra và điền vào biểu mẫu. –

+1

JSP không phải là phía khách hàng? – duffymo

1

Nó có vẻ là một sự hỗ trợ cURL cho java:
http://curl.haxx.se/libcurl/java/

+3

Tôi thích cURL, nhưng tại sao lại phụ thuộc vào thư viện C nguyên gốc khi có một thư viện Java thuần túy như Apache HTTPClient? –

1

Phụ thuộc vào độ phức tạp các trang web của bạn. Các tùy chọn là Apache HttpClient (cộng thêm một cái gì đó như JTidy) hoặc các gói thử nghiệm theo định hướng như HtmlUnit hoặc Canoo WebTest. HtmlUnit khá mạnh mẽ - ví dụ bạn có thể xử lý JavaScript.

+0

+1 để chỉ ra [Canoo WebTest] (http://webtest.canoo.com/webtest/manual/WebTestHome.html). Nó mới với tôi. Nhưng có vẻ như nó được thiết kế đặc biệt hơn cho các trang thử nghiệm và không phù hợp cho thao tác trên trang chung và trích xuất dữ liệu. So sánh với HtmlUnit như thế nào? –

0

Jetty có một thư viện phía khách hàng thoải mái. Tôi thích sử dụng nó vì tôi thường cần phải tạo một máy chủ cùng với khách hàng.Apache HTTP Client thực sự tốt và dường như có thêm một số tính năng hoạt động giống như khả năng phân giải proxy bằng SSL.

5

HTTPUnit dành cho mục đích thử nghiệm, tôi không nghĩ rằng nó phù hợp nhất để được nhúng vào bên trong ứng dụng của bạn.

Khi bạn muốn sử dụng tài nguyên HTTP (như trang web), tôi khuyên bạn nên sử dụng Apache HTTPClient. Nhưng bạn có thể thấy khuôn khổ này ở mức thấp đối với trường hợp sử dụng của bạn, đó là tìm kiếm trang web. Vì vậy, tôi muốn giới thiệu một khung tích hợp như Apache Camel cho mục đích này. Ví dụ: tuyến đường sau đây đọc một trang web (sử dụng Apache HTTPClient), biến đổi HTML thành HTML được định dạng tốt (sử dụng TagSoup) và biến đổi kết quả thành một biểu diễn XML để xử lý tiếp.

from("http://mycollege.edu/somepage.html).unmarshall().tidyMarkup().to("xslt:mystylesheet.xsl") 

Bạn có thể xử lý thêm XML bằng cách sử dụng XPath hoặc chuyển đổi nó thành POJO bằng JAXB chẳng hạn.

+0

Tôi sử dụng HtmlUnit vì nó dễ dàng. Tôi có thể rút ra những thông tin tôi cần từ một trang của XPath và sau đó chạy đi. Những gì bạn đang đề xuất âm thanh như quá mức cần thiết. Tại sao bạn giới thiệu theo cách này? Có gì sai khi sử dụng HtmlUnit trong một ứng dụng? –

+0

+1 để đề cập đến kết hợp HttpClient + TagSoup. Khi tôi cuộn thư viện cạo của riêng tôi, những công việc này tuyệt vời với nhau, và nhanh hơn HtmlUnit đầy chất béo. –

+1

Lưu ý phần 'Đơn vị', các thư viện này chủ yếu tập trung vào thử nghiệm (đơn vị). Tuy nhiên tôi đã loại bỏ các tham chiếu đến HTMLUnit vì nó cung cấp chức năng cạo tổng quát hơn. –

0

Nếu bạn thực sự muốn mô phỏng trình duyệt, thì Selenium RC

+0

selenium RC chạy thử nghiệm trên trình duyệt thực tế –

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