htmlunit无法调用post ajax请求

时间:2018-02-09 06:29:11

标签: java ajax htmlunit

我有一个网页填充datagrid这样的发布ajax请求

$.ajax({
  type: "POST",
  url: "http://bss.bimser.com.tr/Handlers/eBADataGridHandler.ashx",
  data: '{"ID":"dgSearchTickets","Type":0,"Page":"2","FilterInput":[],"QuickFilterText":null,"SortedColumn":""}',
  success: function(msg){
    console.log(msg);
  }
});

当我用下面的代码尝试这个时,我不能得到HTML结果;我的代码;

webClient.getOptions().setJavaScriptEnabled(true);
        webClient.setAjaxController(new NicelyResynchronizingAjaxController());
        UnexpectedPage upage = webClient.getPage(webRequestPost);
        HtmlPage page = HTMLParser.parseHtml(upage.getWebResponse(), webClient.getCurrentWindow());

        WebRequest webRequestPost2 = new WebRequest(new URL(".../DataGridHandler.ashx"), HttpMethod.POST);
        webRequestPost2.setAdditionalHeader("Content-Type", "application/x-www-form-urlencoded");
        webRequestPost2.setRequestBody(DefaultValues.searchPagingJson2);
        page = webClient.getPage(webRequestPost2);

此代码返回错误网页。我怎样才能获得HTML信息?

修改

page.executeJavaScript("var request = new XMLHttpRequest();\n" +
            "request.open('POST', 'http://bss.bimser.com.tr/Handlers/eBADataGridHandler.ashx', true);\n" +
            "request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');\n" +
            "request.onload = function() {\n" +
            "  document.getElementsByTagName(\"body\")[0].innerHTML = request.responseText;\n" +
            "  console.log(request.responseText);\n" +
            "};\n" +
            "request.send('{\"ID\":\"dgSearchTickets\",\"Type\":0,\"Page\":\"%s\",\"FilterInput\":[],\"QuickFilterText\":null,\"SortedColumn\":\"Sent Date\"}');\n");

我能够通过执行上面的代码来解决问题。现在问题是没有手动等待htmlunit不等待结果。我试过这个

WebClient webClient = new WebClient(BrowserVersion.FIREFOX_52);
webClient.getOptions().setJavaScriptEnabled(true);
webClient.setAjaxController(new AjaxController() {
            @Override
            public boolean processSynchron(HtmlPage page, WebRequest request, boolean async) {
                return true;
            }
        });

1 个答案:

答案 0 :(得分:0)

一般情况下,HtmlUnit可以执行ajax请求。

创建自己的Web请求不是HtmlUnit的设计理念。想想HtmlUnit更像是由您的代码自动化的浏览器。请查看HtmlUnit主页上的示例。

如果您真的想创建自己的请求,则需要对整个请求负责。这包括用于安全性或会话信息的各种标头。安装像Chares这样的Web代理并观察真实页面的通信。然后,您可以创建类似的请求。并查看返回的网页可能有一个提示(如登录缺失)。