java - HttpClient 与 HtmlUnit

标签 java httpclient htmlunit

我知道 HtmlUnit 模拟浏览器,而 HttpClient 没有。

HtmlUnit中,当一个页面被加载,里面有JavaScript时,脚本会被执行吗?如果脚本设置了 cookie,该 cookie 是否会在 HtmlUnit 的浏览器中设置并可从 Java 代码访问?

有什么可以使用 HttpClient 而不是使用 HtmlUnit 来完成的吗?在 HtmlUnit 中,我们是否可以从 POST 请求开始并修改 HTTP 请求的任何部分,包括方法、URI、HTTP 版本、 header 和正文?

HttpClient 相对于 HtmlUnit 有什么优势?

最佳答案

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

如提示here .

您可以通过覆盖 HttpWebConnection.createHttpClient() 来更改 HtmlUnit 中使用的 HttpClient

您可以通过以下方式发出POST请求:

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

关于java - HttpClient 与 HtmlUnit,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42993152/

相关文章:

Java HtmlUnit 表单重定向问题

java - 如何在ModelDriven拦截器中设置refreshModelBeforeResult?

java - 从外部模块访问资源文件

java - 使用 Apache HttpClient 定义源 IP 地址

htmlunit - 给定一个 HtmlUnit HtmlPage 对象,如何获取其 Document 的 URI?

pdf-generation - HtmlUnit 并将页面保存为 PDF

java - Java 中 "^= "运算符的用途是什么?

java - 添加图像作为 jframe 背景 - 其他 jcomponent 消失

java - 在同一场 war 中从另一个 Web 服务调用 Web 服务 - apache cxf

android - 具有身份验证的服务器上的 ECONNRESET(对等方重置连接)