我知道 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/