1. 程式人生 > 實用技巧 >模擬瀏覽器,請求Web服務

模擬瀏覽器,請求Web服務

方法一: 直接使用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介面
 2
URLurl=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庫,通過不同的配置來模擬ChromeFirefoxIE瀏覽器。下面是實現的部分程式碼:

 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裡面寫的返回值。