模擬提交就是說我們不自己登陸到客戶端,僅僅靠發送請求就模擬了客戶端的操作,在現實使用的時候經常用來接收一些需要登錄才能獲取到的數據,來模擬表單的提交,所以很多時候也被稱作虛擬登錄,這次的例子是我自己為學校實驗室開發的官方網站的納新報名系統,設置有一個管理員,管理員通過登錄就可以查看報名人的信息,做一個虛擬登錄來獲取到報名信息頁面,因為如果沒有登錄直接到達這個頁面,頁面是不給訪問的,具體技術我開發的時候用到了session,就不詳細描述了。
那么獲取數據的條件為:(報名信息URL為...省略\FreshTable.html,登錄頁面為...省略\login.html)
1.必須登錄
2.為POST請求方式
首先是先直接輸入報名信息的頁面我們會看到頁面直接跳到了登錄頁面。如果直接沒有登錄的時候抓取網頁的時候我們可以看到的現象是(URL:...省略\FreshTable.html):
1 <div class="msg2 fl">歡迎管理員登錄</div> 2 <div class="hline fr"> 3 </div> 4 </div> 5 <div class="inputer"> 6 <form action="FreshTable.html" method="post"> 7 <input class="inputext" type="text" name="UserName" id="UserName" placeholder="用戶名" onkeydown="if(event.keyCode==13) event.keyCode=9"> 8 <input class="inputext" type="password" name="Password" id="Password" placeholder="密碼"> 9 <input type="submit" id="submitbtn" value="登錄"/>
現在開始我們的主題。
經過研究發現,昨天的HttpClient的包官方已經不用了,現在屬於遺留的包,Maven都找不到昨天的包,所以今天重新換了新的包,之前的common下的HttpClient包,這次使用的是
org.apache.http.impl.client.HttpClients;
這個包。
這個包在Maven中配置是:
1 <dependency> 2 <groupId>org.apache.httpcomponents</groupId> 3 <artifactId>httpclient</artifactId> 4 <version>4.5.1</version> 5 </dependency>
這里我選用了4.5.1的包,也可以選擇其他版本。
現在進行編碼,今天這個包的操作和之前有一定的區別,所以代碼就改了
1 CloseableHttpClient httpClient= HttpClients.createDefault(); 2 HttpPost post=new HttpPost("××××××××/FreshTable.html"); 3 try { 4 CloseableHttpResponse response=httpClient.execute(post); 5 System.out.println(EntityUtils.toString(response.getEntity())); 6 } catch (IOException e) { 7 e.printStackTrace(); 8 } 9 10 }
以上代碼的功能為輸出這個URL的內容然而並不是我們想要的內容:獲得的HTML代碼為之前開始的HTML代碼。這是就需要一個虛擬登錄了。
首先我們要知道表單的代碼,這里表單的代碼為:
1 <input class="inputext" type="text" name="UserName" id="UserName" placeholder="用戶名" onkeydown="if(event.keyCode==13) event.keyCode=9"> 2 <input class="inputext" type="password" name="Password" id="Password" placeholder="密碼"> 3 <input type="submit" id="submitbtn" value="登錄"/>
我們可以看到name的值分別為UserName和password,分別對應這用戶名和密碼,所以我們就可以通過這個來登錄。
先解釋幾個類和方法:
BasicNameValuePair
用來寫入Name值和對應的value值
UrlEncodedFormEntity
這個將那些name和value寫到實例中,構造方法對應的兩個是BasicNameValuePair的數據和字符編碼。之后在用post來發送請求。
整體代碼為:
1 public class TestSp01 { 2 public static void main(String[] args){ 3 CloseableHttpClient httpClient= HttpClients.createDefault(); 4 HttpPost post=new HttpPost("http://×××××××××/FreshTable.html"); 5 List<NameValuePair> formparams=new ArrayList<NameValuePair>(); 6 formparams.add(new BasicNameValuePair("UserName","××××××")); 7 formparams.add(new BasicNameValuePair("Password","××××××")); 8 UrlEncodedFormEntity entity=new UrlEncodedFormEntity(formparams, Consts.UTF_8); 9 post.setEntity(entity); 10 try { 11 CloseableHttpResponse response=httpClient.execute(post); 12 System.out.println(EntityUtils.toString(response.getEntity())); 13 } catch (IOException e) { 14 e.printStackTrace(); 15 } 16 17 } 18 }
以上代碼運行就執行了使用post方式登錄,那么這時獲取到的數據也就成為了:
1 <tr> 2 <td>×××××</td> 3 <td>×××××</td> 4 <td>1×××××××××37</td> 5 <td>光電××××</td> 6 <td>0</td> 7 <td>10××××××80</td> 8 <td>104××××××@××.com</td> 9 </tr> 10 11 <tr> 12 …… 13 </tr>
完成了一次模擬提交。
=========================================