前言: 在這篇部落格中我主要講述了Http協議的一些內容,因為我們開發的是基於網頁(B/S)的引用程式開發,所以我們不得不和Http協議打交道,這篇部落格就是我們初步學習如何和Http協議打交道的。
- HTTP協議
(1) web開發是和Http協議打交道的,必須瞭解Http協議,Http協議版本:Http/0.9,Http/1.0,Http/1.1,現在主流的都是Http/1.1版本
(2) Http協議分析工具
1) DebugBar,Http(s)標籤的內容,免費的,只能分析當前瀏覽器中的內容。
2) HttpWatch,收費的,只能分析當前瀏覽器中的內容。
3) HttpAnalyzer,收費的,能分析電腦上所有的Http資料。
(3) Http協議的幾個概念
1) 串連(Connection):瀏覽器和伺服器之間傳輸資料的通道,一般請求完畢就關閉,不會保持串連。
2) 請求(Request):瀏覽器向伺服器發送”我要……”的訊息,包含請求的類型,請求的資料,瀏覽器的資訊(語言,瀏覽器版本等)。
3) 響應(Response):伺服器對瀏覽器的請求返回資料,包含是否成功,錯誤碼等。
- HTTP請求報文
(1) 用HttpWatch查看訪問一個網站(用Discu2n測試環境)的響應情況,敲入一個網址後,瀏覽器向伺服器發出請求,頁面中的JS,圖片,CSS在單獨的請求中。
(2) Get/Http/1.1表示向伺服器用Get方式請求首頁,使用Http/1.1協議。
(3) Accept-Encoding gzip,deflate表示瀏覽器支援gzip,deflate兩種壓縮演算法。
(4) Accept-language zh-cn表示瀏覽器支援的語言,很多網站進入後就是自動就是中文介面的國際網站就是通過讀取這個頭的值來實現的。
(5) Connection keep-Alive。一般情況下,一旦Web伺服器向瀏覽器發送了請求資料,他就要關閉TCP串連,然後如果瀏覽器或者伺服器在其頭資訊中加入了Connection Keep-Alive,則TCP串連在發送後將任然保持開啟狀態,於是瀏覽器可以繼續通過相同的串連發送請求,保持串連節省了為每個請求建立新串連所需要的時間,還節約了網路頻寬。
(6) Cookie是瀏覽器向伺服器發送和當前網站關聯的Cookie,這樣在伺服器端也能讀取到瀏覽器端的Cookie了。
(7) User-Agent為瀏覽器的版本資訊,通過這個資訊可以讀取到瀏覽器是IE還是FireFox,支援的外掛程式,.net版本等。
- HTTP響應碼
(1) 瀏覽器向伺服器發出請求,伺服器處理可能會成功,可能會失敗,可能沒有許可權訪問,伺服器會通過響應碼來告訴瀏覽器處理結果。
1) “200”:OK 成功。
2) “301”: Moved Permanently 永久轉移。
3) “302”:Found 暫時轉移。
4) “307”:Tempoay Redirect。
5) “400”:Bad Request錯誤請求,發出錯誤的不符合Http協議的要求。
6) “401”:Unauthoried 未認證,一般需要使用者名稱,密碼登入。
7) “403”:Forbidden 禁止。
8) “404”:Not Found 未找到(*)。
9) “500”:Internal Server Error 伺服器錯誤。
10) “503”:Server Unavailable:一般是訪問人數過多。
(2) 200段是成功,300段需要對請求作進一步處理,400段表示用戶端請求錯誤,500段表示伺服器錯誤。
- 伺服器返回的報文
(1) Server:Cassini/3.5,0.5表示伺服器的類型。
(2) content-Type:text/html;Charset=utf-8表示返回資料的類型。
(3) 伺服器通過content-type告訴用戶端響應的資料類型,這樣瀏覽器就根據返回資料的類型來進行不同的處理,如果是圖片類型就顯示,如果是文本類型就直接顯示內容,如果是HTML類型就用瀏覽器顯示內容,如果是下載類型就彈出下載工具等。
(4) 常用Content-Type:text/html,image/gif,image/jpeg,text/plain,text/javascript,application/x-excel,application/octet-stream(二進位檔案)。
(5) Content-Length:19944表示後續資料訊息體的長度,報文頭只是描述,返回的具體資料(比如:Html文本,圖片資料等)在兩個斷行符號之後的內容中。
- HTTP其他
(1) 網頁中如果有圖片,CSS,JS的報告外部檔案的話,圖片,CSS,JS都在單獨的請求中,也就是並不是頁面的所有內容都在一個請求中完成,而是每個資源一個請求。
(2) 一般情況下,只有瀏覽器請求伺服器端,伺服器端才會給瀏覽器響應資料,不會主動向瀏覽器推送資料,這樣是安全考慮,也是提高伺服器的效能考慮,如果要伺服器向瀏覽器推送資料,則需要使用ServerPush等額外的技術。
(3) Http是”請求—響應”的工作方式,因此頁面會不斷重新整理,如果不希望頁面重新整理則要使用Ajax技術。
- 請求響應模型的例子
(1)按鈕實現表格刪除的效果,使用超連結進行刪除。
1) 建立一個html頁面,起名為delete.htm,在建立一個一般處理常式,起名為delete.ashx,在其中寫入代碼如下:
1 context.Response.ContentType = "text/html";2 3 string name = context.Request["Name"];4 5 context.Response.Write(name + "被刪除了");
在delete.htm頁面中寫入如下代碼:
1 <form action="delete.ashx" id="form1" method="get"> 2 3 <input type="hidden" name="Name" id="Name" /> 4 5 <table> 6 7 <tr><td>姓名</td><td>年齡</td><td>操作</td></tr> 8 9 <tr><td>Tom</td><td>20</td>10 11 <td><a href="delete.ashx?Name=tom">刪除</a>12 13 <!--<input />控制項的作用是最先擷取到Name的值,然後執行Form表單-->14 15 <input type="button" value="刪除" onclick="document.getElementById('Name').value='Tom';document.getElementById('form1').submit();" /></td>16 17 </tr>18 19 <tr><td>Jerry</td><td>30</td><td><a href="delete.ashx?Name=Jerry">刪除</a></td></tr>20 21 </table>22 23 </form>
2) 在建立一個Web表單頁面,在其頁面下面輸入如下作業碼,在Page_Load中的代碼是:
1 if (IsPostBack)2 3 {4 5 string name = Request["Name"];6 7 Response.Write(name + "被刪除了");8 9 }
頁面配置為:
1 <body> 2 3 <form id="form1" runat="server" method="post"> 4 5 <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox> 6 7 <input type="hidden" name="Name" id="Name" /> 8 9 <div>10 11 <table>12 13 <tr><td>姓名</td><td>年齡</td><td>操作</td></tr>14 15 <tr>16 17 <td>tom</td><td>20</td><td>18 19 <input type="button" value="刪除" onclick="document.getElementById('Name').value='tom';document.getElementById('form1').submit()" />20 21 <a href="javascript:document.getElementById('Name').value='tom';document.getElementById('form1').submit()">刪除</a>22 23 </td>24 25 </tr>26 27 <tr><td>Jerry</td><td>30</td><td><a href="Delete.aspx?Name=Jerry">刪除</a></td></tr>28 29 </table>30 31 </div>32 33 </form>34 35 </body>
(2) 這就是asp.net中資料繫結控制項中行按鈕和行超連結實現方式的不同,ListView中Button,HyperLink兩種行刪除的方式,按鈕方式是將行的Id通過表單提交到伺服器,行超連結的方式是通過超連結的URL通過get方式提交給處理頁面,超連結的方式由於沒有提交所有的表單資訊,因此很多伺服器端控制項的進階用法用不了。
(3) 用aspx重寫,超連結的因為沒有向伺服器提交viewState等隱藏欄位,所以處理時IspostBack是false,而按鈕的則是提交了表單,所以IsPostBack=True,可以在超連結的Href中寫表單提交的JavaScript,這樣就是WebForm中的LinkButton的原理。
(4) 用戶端,伺服器由於在兩台電腦中,所以無法做到兩邊的變數的互相讀取或者兩邊函數的互相調用,所以如果相看起來好像做到,那麼必須通過提交的方式來將用戶端變數值作為一個表單欄位提交到伺服器,或者伺服器端將服務端變數列印到用戶端代碼中。
注釋:Http協議我們就說到這裡了,下節部落格是wen開發的一些基本原則,希望我們共同來學習,我們的群號是:159227188,歡迎大家在這裡交流。