我在wap上爲大學項目開發了http客戶端,用於登錄站點,從HTML數據獲取數據,完成併發送表單。 我不知道要使用哪個http庫: Apache HTTP客戶端 - 不要創建DOM模型,但要使用http重定向,多線程。 HTTPUnit - 創建DOM模型,很容易處理表單,字段,表等,但我不知道如何使用多線程和代理設置。最適合Java的HTTP庫?
有什麼建議嗎?
我在wap上爲大學項目開發了http客戶端,用於登錄站點,從HTML數據獲取數據,完成併發送表單。 我不知道要使用哪個http庫: Apache HTTP客戶端 - 不要創建DOM模型,但要使用http重定向,多線程。 HTTPUnit - 創建DOM模型,很容易處理表單,字段,表等,但我不知道如何使用多線程和代理設置。最適合Java的HTTP庫?
有什麼建議嗎?
這聽起來像你正試圖創建一個網絡抓取應用程序。爲此,我推薦HtmlUnit庫。
它可以輕鬆處理網頁中嵌入的表單,代理和數據。在底層,我認爲它使用Apache的HttpClient來處理HTTP請求,但這可能太低級了,你不必擔心。
有了這個庫,您可以用Java控制網頁,就像您在Web瀏覽器中控制它一樣:單擊按鈕,輸入文本,選擇值。
以下是HtmlUnit's getting started page一些例子:
提交形式:
@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();
}
使用代理服務器:
@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();
}
的WebClient
類是單線程的,所以每一個線程交易與一個網頁將需要它自己的WebClient
實例。
除非你需要處理Javascript或CSS,你也可以在創建客戶端禁用這些:
WebClient client = new WebClient();
client.setJavaScriptEnabled(false);
client.setCssEnabled(false);
HTTPUnit用於單元測試。除非你的意思是「測試客戶端」,否則我認爲不適合創建應用程序。
我的魔杖開發http客戶端在Java中
你意識到,當然,前提是Apache的HTTP客戶端不是你的答案無論是。你聽起來像你想創建第一個Web應用程序。
您需要servlet和JSP。獲取Apache的Tomcat並學習足夠的JSP和JSTL來完成你需要做的事情。不要打擾框架,因爲這是你的第一個。
當你運行它,然後嘗試像Spring一樣的框架。
這似乎是對Java的捲曲支持:在你的網站是多麼複雜
http://curl.haxx.se/libcurl/java/
我喜歡cURL,但爲什麼在有一個純Java庫(如Apache HTTPClient)時依賴於本機C庫? – 2010-09-12 12:10:04
依賴。選項是Apache HttpClient(加上類似JTidy的)或面向測試的軟件包,如HtmlUnit或Canoo WebTest。 HtmlUnit非常強大 - 例如,您可以處理JavaScript。
+1指出[Canoo WebTest](http://webtest.canoo.com/webtest/manual/WebTestHome.html)。這對我來說是新的。但它看起來更專門爲測試頁面而設計,並不適合於一般的頁面操作和數據提取。它與HtmlUnit相比如何? – 2010-09-12 12:31:17
Jetty有一個很好的客戶端庫。我喜歡使用它,因爲我經常需要與客戶端一起創建服務器。Apache HTTP Client非常好,似乎還有一些功能可以像使用SSL解析代理一樣工作。
HTTPUnit是爲了測試目的,我不認爲它是最適合嵌入裏面您的應用程序。
當你想消費HTTP資源(比如網頁)時,我建議使用Apache HTTPClient。但是你可能會發現這個框架對於你的用例來說是低級的,這是網頁抓取。所以我會推薦一個像Apache Camel這樣的集成框架。例如,以下路徑讀取網頁(使用Apache HTTPClient),將HTML轉換爲格式良好的HTML(使用TagSoup),並將結果轉換爲XML表示以供進一步處理。
from("http://mycollege.edu/somepage.html).unmarshall().tidyMarkup().to("xslt:mystylesheet.xsl")
您可以使用XPath進一步處理生成的XML,或者使用JAXB將其轉換爲POJO。
我使用HtmlUnit,因爲它很容易。我可以通過XPath從頁面中提取需要的信息,然後逃跑。你的建議聽起來像是過度殺傷。你爲什麼推薦這種方式?在應用程序中使用HtmlUnit有什麼問題? – 2010-09-12 13:17:25
提及HttpClient + TagSoup組合。當我推出我自己的拼圖庫時,這些工作很好,比全胖的HtmlUnit快。 – 2010-09-12 13:20:13
注意'單元'部分,這些庫主要關注(單元)測試。不過,我已經刪除了對HTMLUnit的引用,因爲它提供了更一般的抓取功能。 – 2010-09-12 13:48:25
如果你真的想模擬一個瀏覽器,那麼Selenium RC
selenium RC通過實際瀏覽器運行測試 – 2013-03-08 15:56:18
這個問題似乎很清楚客戶端。 Servlet和JSP與客戶端功能無關。 – lexicore 2010-09-12 12:07:07
聽起來不像jorik1000正在嘗試開發一個服務器端應用程序,而是一個專門的Web客戶端,它可以提取和提交信息。 HttpUnit設計用於簡化網頁的單元測試,因此它也是一個很好的工具,用於處理高級別的網頁,以便處理一般信息,如提取信息和填寫表單。 – 2010-09-12 12:27:33
JSP不是客戶端? – duffymo 2010-09-12 13:18:55