Java的最佳HTTP库?

时间:2010-09-12 11:57:46

标签: java http

我用Java开发用于大学项目的http客户端登录到站点,从HTML数据中获取数据,完成并发送表单。 我不知道使用哪个http lib: Apache HTTP客户端 - 不要创建DOM模型,而是使用http重定向,多线程。 HTTPUnit - 创建DOM模型,并且易于使用表单,字段,表格等,但我不知道如何使用多线程和代理设置。

有什么建议吗?

7 个答案:

答案 0 :(得分:8)

听起来您正在尝试创建一个抓取网页的应用程序。为此,我推荐使用HtmlUnit库。

它可以轻松处理网页中嵌入的表单,代理和数据。我认为它使用Apache的HttpClient来处理HTTP请求,但这可能太低了,你不必担心。

使用此库,您可以像在Web浏览器中控制一样使用Java控制网页:单击按钮,键入文本,选择值。

以下是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);

答案 1 :(得分:5)

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。

答案 2 :(得分:1)

HTTPUnit用于单元测试。除非您的意思是“测试客户”,否则我认为它不适合创建应用程序。

  

我用Java开发http客户端

当然,您意识到Apache HTTP客户端也不是您的答案。您听起来像是想要创建第一个Web应用程序。

您需要servlet和JSP。获取Apache的Tomcat并学习足够的JSP和JSTL来完成您需要做的事情。不要打扰框架,因为它是你的第一个。

当你运行它时,请尝试像Spring这样的框架。

答案 3 :(得分:1)

这似乎是对java的cURL支持:
http://curl.haxx.se/libcurl/java/

答案 4 :(得分:1)

取决于您的网站有多复杂。选项包括Apache HttpClient(加上类似JTidy)或面向测试的软件包,如HtmlUnit或Canoo WebTest。 HtmlUnit功能非常强大 - 例如,您可以处理JavaScript。

答案 5 :(得分:0)

Jetty有一个不错的客户端库。我喜欢使用它,因为我经常需要与客户端一起创建服务器。 Apache HTTP Client非常好,似乎还有一些功能可以像使用SSL解析代理一样。

答案 6 :(得分:0)

如果你真的想模拟浏览器,那么Selenium RC