模擬瀏覽器,請求Web服務
阿新 • • 發佈:2020-12-30
方法一: 直接使用Java方法呼叫系統瀏覽器,然後請求URL
1 publicstaticvoidrunBroswer(Stringurl,intflag){ 2 try{ 3 Desktopdesktop=Desktop.getDesktop(); 4 if(desktop.isDesktopSupported()&&desktop.isSupported(Desktop.Action.BROWSE)){ 5 URIuri=newURI(url); 6 desktop.browse(uri);//使用系統預設的瀏覽器執行這個url 7 Thread.sleep(2000);8 //Runtime.getRuntime().exec("taskkill/F/IMIexplore.exe"); 9 Runtime.getRuntime().exec("taskkill/IMfirefox.exe");//因為我係統預設的是火狐,然後關閉火狐瀏覽器 10 } 11 }
這種方法,實現的效果在實際中,就是要呼叫瀏覽器,桌面會彈出瀏覽器介面,然後請求url;
方法二: httpclient httpurlconnection
1 StringstrUrl="http://localhost:8088/testWeb";//這是臨時建的web專案,去訪問它的index.jsp介面 2URLurl=newURL(strUrl); 3 HttpURLConnectionhttpcon=(HttpURLConnection)url.openConnection(); 4 InputStreamReaderinput=newInputStreamReader(httpcon.getInputStream(),"utf-8"); 5 BufferedReaderbr=newBufferedReader(input); 6 StringBuffersb=newStringBuffer(); 7 Stringline=""; 8 while((line=br.readLine())!=null){//讀取每行資料 9 sb.append(line); 10 sb.append("\r\n"); 11 } 12 StringsbString=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 publicstaticvoidmain(String[]args){ 2 WebClientwc=newWebClient(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 //newWebConnectionWrapper(wc){ 11 //publicWebResponsegetResponse(WebRequestrequest)throwsIOException{ 12 //WebResponseresponse=super.getResponse(request); 13 //if(request.getUrl().toExternalForm().contains("test.js")){ 14 //Stringcontent=response.getContentAsString("GBK"); 15 //WebResponseDatadata=newWebResponseData(content.getBytes("UTF-8"), 16 //response.getStatusCode(),response.getStatusMessage(),response.getResponseHeaders()); 17 //response=newWebResponse(data,request,response.getLoadTime()); 18 //} 19 //returnresponse; 20 //} 21 //} 22 23 //); 24 25 try{ 26 //HtmlPagepage=wc.getPage("http://192.168.0.1/Del_Bridge_Wan.html"); 27 HtmlPagepage=wc.getPage("http://localhost:8088/testWeb"); 28 FileWriterfileWriter=newFileWriter("D:\\text.html"); 29 System.out.println("over..."); 30 Stringstr=""; 31 //獲取頁面的XML程式碼 32 str=page.asXml(); 33 fileWriter.write(str); 34 //關閉webclient 35 //wc.close(); 36 wc.closeAllWindows(); 37 fileWriter.close(); 38 }catch(Exceptione){ 39 e.printStackTrace(); 40 } 41 42 }
通過執行這部分程式碼後發現,(註釋部分解決編碼問題,可以通過重寫WebConnectionWrapper類的getResponse方法來修改返回值),運行了HTML裡面的onload事件,達到了不呼叫瀏覽器也能訪問url,並能執行js事件,而不是直接返回該HTML的原始碼.最後開啟生成的test.html就可以發現是之前建立的testWeb服務index.jsp裡面寫的返回值。