模拟浏览器,请求Web服务
方法一: 直接使用Java方法调用系统浏览器,然后请求URL
1 public static void runBroswer(String url,int flag) { 2 try { 3 Desktop desktop = Desktop.getDesktop(); 4 if (desktop.isDesktopSupported() && desktop.isSupported(Desktop.Action.BROWSE)) { 5 URI uri = new URI(url); 6 desktop.browse(uri); //使用系统默认的浏览器执行这个url 7 Thread.sleep(2000); 8 //Runtime.getRuntime().exec("taskkill /F /IM Iexplore.exe"); 9 Runtime.getRuntime().exec("taskkill /IM firefox.exe"); //因为我系统默认的是火狐,然后关闭火狐浏览器 10 } 11 }
这种方法,实现的效果在实际中,就是要调用浏览器,桌面会弹出浏览器界面,然后请求url;
方法二: httpclient httpurlconnection
1 String strUrl = "http://localhost:8088/testWeb"; //这是临时建的web项目,去访问它的index.jsp界面 2 URL url = new URL(strUrl); 3 HttpURLConnection httpcon = (HttpURLConnection) url.openConnection(); 4 InputStreamReader input = new InputStreamReader(httpcon.getInputStream(), "utf-8"); 5 BufferedReader br = new BufferedReader(input); 6 StringBuffer sb = new StringBuffer(); 7 String line = ""; 8 while((line = br.readLine()) != null){ //读取每行数据 9 sb.append(line); 10 sb.append("\r\n"); 11 } 12 String sbString = sb.toString(); 13 System.out.println("result... "+sbString);
通过运行这部分代码发现.它只是完全返回HTML代码,并没有执行HTML里面的js onload()事件,也就是没有运行,js;当然这部分代码是使用HttpUrlConnection类,也可以使用Httpclient类,第三方工具类;
方法三: 使用HtmlUtil 工具类
因为第二种方法感觉他是没有运行js里面的事件,只是获取HTML代码,而HtmlUnit是一款基于Java的没有图形界面的浏览器程序。它模仿HTML document并且提供API让开发人员像是在一个正常的浏览器上操作一样,获取网页内容,填充表单,点击超链接等等。它非常好的支持JavaScript并且仍在不断改进,同时能够解析非常复杂的AJAX库,通过不同的配置来模拟Chrome、Firefox和IE浏览器。下面是实现的部分代码:
1 public static void main(String[] args) { 2 WebClient wc = new WebClient(BrowserVersion.getDefault()); 3 wc.setJavaScriptEnabled(true); //启用JS解释器,默认为true 4 wc.setJavaScriptTimeout(100000);//设置JS执行的超时时间 5 wc.setCssEnabled(false); //禁用css支持 6 wc.setThrowExceptionOnScriptError(false); //js运行错误时,是否抛出异常 7 wc.setTimeout(10000); //设置连接超时时间 ,这里是10S。如果为0,则无限期等待 8 //wc.setWebConnection( 9 10 // new WebConnectionWrapper(wc) { 11 // public WebResponse getResponse(WebRequest request) throws IOException { 12 // WebResponse response = super.getResponse(request); 13 // if (request.getUrl().toExternalForm().contains("test.js")) { 14 // String content = response.getContentAsString("GBK"); 15 // WebResponseData data = new WebResponseData(content.getBytes("UTF-8"), 16 // response.getStatusCode(), response.getStatusMessage(), response.getResponseHeaders()); 17 // response = new WebResponse(data, request, response.getLoadTime()); 18 // } 19 // return response; 20 // } 21 // } 22 23 //); 24 25 try { 26 //HtmlPage page = wc.getPage("http://192.168.0.1/Del_Bridge_Wan.html"); 27 HtmlPage page = wc.getPage("http://localhost:8088/testWeb"); 28 FileWriter fileWriter = new FileWriter("D:\\text.html"); 29 System.out.println("over..."); 30 String str = ""; 31 //获取页面的XML代码 32 str = page.asXml(); 33 fileWriter.write( str ); 34 //关闭webclient 35 //wc.close(); 36 wc.closeAllWindows(); 37 fileWriter.close(); 38 } catch (Exception e) { 39 e.printStackTrace(); 40 } 41 42 }
通过运行这部分代码后发现,(注释部分解决编码问题,可以通过重写WebConnectionWrapper类的getResponse方法来修改返回值),运行了HTML里面的onload事件,达到了不调用浏览器也能访问url,并能运行js事件,而不是直接返回该HTML的源代码.最后打开生成的test.html就可以发现是之前创建的testWeb服务index.jsp里面写的返回值。
记录有用的信息和数据,并分享!