2017-03-24 1 views
2

Je sais que HtmlUnit simule un navigateur, alors que HttpClient ne fonctionne pas.HttpClient vs HtmlUnit

En HtmlUnit, lorsqu'une page est chargée et il y a un JavaScript à l'intérieur, sera exécuté le script? Si le script définit un cookie, le cookie sera-t-il défini dans le navigateur de HtmlUnit et accessible à partir du code Java?

Y a-t-il quelque chose qui peut être fait en utilisant HttpClient, mais en n'utilisant pas HtmlUnit? Dans HtmlUnit, pouvons-nous commencer par une requête POST et modifier une partie de la requête HTTP, y compris la méthode, l'URI, la version HTTP, les en-têtes et le corps?

Quels sont les avantages de HttpClient sur HtmlUnit?

Répondre

4

HttpClient est une bibliothèque à un niveau inférieur, pour envoyer des requêtes HTTP et récupérer des réponses.

HtmlUnit est à un niveau supérieur, et utilise en interne HttpClient pour faire des requêtes HTTP, mais gère aussi JavaScript (par Rhino et implémentation DOM interne), XPath (par Xalan), CSS (par CSSParser), malformé HTML (par NekoHtml), WebSockets (par Jetty), etc.

Vous pouvez modifier les requêtes sortantes et la réponse à HtmlUnit par quelque chose comme:

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; 
    } 
}; 

une s fait allusion à here.

Vous pouvez modifier le HttpClient utilisé dans HtmlUnit en remplaçant HttpWebConnection.createHttpClient().

Vous pouvez faire POST demande:

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

Bonne réponse avec l'exemple cool. – vanloc