前言: 在這篇博客中我主要講述了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,歡迎大家在這里交流。