2017-03-24 44 views
2

我知道HtmlUnit模擬瀏覽器,而HttpClient沒有。HttpClient vs HtmlUnit

HtmlUnit,當一個頁面被加載,並且裏面有一個JavaScript,腳本會被執行嗎?如果腳本設置了cookie,那麼cookie是否會設置在HtmlUnit的瀏覽器中,並且可以從Java代碼訪問?

有什麼可以使用HttpClient來完成,但沒有使用HtmlUnit?在HtmlUnit中,我們可以從POST請求開始,修改HTTP請求的任何部分,包括方法,URI,HTTP版本,頭文件和正文嗎?

HttpClient優於HtmlUnit的優點是什麼?

回答

4

HttpClient是一個較低級別的庫,用於發送HTTP請求並檢索響應。

HtmlUnit是在一個較高的水平,並在內部使用HttpClient使HTTP請求,也處理JavaScript(通過Rhino和內部DOM實現),XPath的(通過Xalan),CSS(通過CSSParser),畸形的HTML(通過NekoHtml )的WebSockets(通過Jetty)等

您可以像修改HtmlUnit的傳出請求和響應:

new WebConnectionWrapper(webClient) { 

    public WebResponse getResponse(WebRequest request) throws IOException { 
     WebResponse response = super.getResponse(request); 
     if (request.getUrl().toExternalForm().contains("my_url")) { 
      String content = response.getContentAsString("UTF-8"); 

      //change content 

      WebResponseData data = new WebResponseData(content.getBytes("UTF-8"), 
        response.getStatusCode(), response.getStatusMessage(), response.getResponseHeaders()); 
      response = new WebResponse(data, request, response.getLoadTime()); 
     } 
     return response; 
    } 
}; 

一s暗示here

您可以通過覆蓋HttpWebConnection.createHttpClient()來更改HttpClient中的。

您可以POST要求是:

WebRequest webRequest = new WebRequest(url, HttpMethod.POST); 
HtmlPage page = webClient.getPage(webRequest); 
+1

涼爽的例子很好的回答。 – vanloc