模拟浏览器,请求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库,通过不同的配置来模拟ChromeFirefoxIE浏览器。下面是实现的部分代码:

 

 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里面写的返回值。

 

posted @ 2020-12-30 21:31  划水De雁小明  阅读(334)  评论(0编辑  收藏  举报