前言: 在這篇博客中我主要講述了Http協(xié)議的一些內(nèi)容,因?yàn)槲覀冮_發(fā)的是基于網(wǎng)頁(B/S)的引用程序開發(fā),,所以我們不得不和Http協(xié)議打交道,,這篇博客就是我們初步學(xué)習(xí)如何和Http協(xié)議打交道的。
(1) web開發(fā)是和Http協(xié)議打交道的,,必須了解Http協(xié)議,,Http協(xié)議版本:Http/0.9,Http/1.0,,Http/1.1,,現(xiàn)在主流的都是Http/1.1版本 (2) Http協(xié)議分析工具 1) DebugBar,Http(s)標(biāo)簽的內(nèi)容,免費(fèi)的,,只能分析當(dāng)前瀏覽器中的內(nèi)容,。 2) HttpWatch,收費(fèi)的,,只能分析當(dāng)前瀏覽器中的內(nèi)容,。 3) HttpAnalyzer,收費(fèi)的,能分析計(jì)算機(jī)上所有的Http數(shù)據(jù),。 (3) Http協(xié)議的幾個概念 1) 連接(Connection):瀏覽器和服務(wù)器之間傳輸數(shù)據(jù)的通道,,一般請求完畢就關(guān)閉,不會保持連接,。 2) 請求(Request):瀏覽器向服務(wù)器發(fā)送”我要……”的消息,,包含請求的類型,請求的數(shù)據(jù),,瀏覽器的信息(語言,,瀏覽器版本等)。 3) 響應(yīng)(Response):服務(wù)器對瀏覽器的請求返回?cái)?shù)據(jù),,包含是否成功,,錯誤碼等。
(1) 用HttpWatch查看訪問一個網(wǎng)站(用Discu2n測試環(huán)境)的響應(yīng)情況,,敲入一個網(wǎng)址后,,瀏覽器向服務(wù)器發(fā)出請求,頁面中的JS,圖片,,CSS在單獨(dú)的請求中,。 (2) Get/Http/1.1表示向服務(wù)器用Get方式請求首頁,使用Http/1.1協(xié)議,。 (3) Accept-Encoding gzip,,deflate表示瀏覽器支持gzip,deflate兩種壓縮算法,。 (4) Accept-language zh-cn表示瀏覽器支持的語言,很多網(wǎng)站進(jìn)入后就是自動就是中文界面的國際網(wǎng)站就是通過讀取這個頭的值來實(shí)現(xiàn)的,。 (5) Connection keep-Alive,。一般情況下,一旦Web服務(wù)器向?yàn)g覽器發(fā)送了請求數(shù)據(jù),,他就要關(guān)閉TCP連接,,然后如果瀏覽器或者服務(wù)器在其頭信息中加入了Connection Keep-Alive,則TCP連接在發(fā)送后將任然保持打開狀態(tài),,于是瀏覽器可以繼續(xù)通過相同的連接發(fā)送請求,保持連接節(jié)省了為每個請求建立新連接所需要的時(shí)間,,還節(jié)約了網(wǎng)絡(luò)帶寬,。 (6) Cookie是瀏覽器向服務(wù)器發(fā)送和當(dāng)前網(wǎng)站關(guān)聯(lián)的Cookie,這樣在服務(wù)器端也能讀取到瀏覽器端的Cookie了,。 (7) User-Agent為瀏覽器的版本信息,,通過這個信息可以讀取到瀏覽器是IE還是FireFox,支持的插件,,.net版本等,。
(1) 瀏覽器向服務(wù)器發(fā)出請求,服務(wù)器處理可能會成功,,可能會失敗,,可能沒有權(quán)限訪問,服務(wù)器會通過響應(yīng)碼來告訴瀏覽器處理結(jié)果,。 1) “200”:OK 成功,。 2) “301”: Moved Permanently 永久轉(zhuǎn)移。 3) “302”:Found 暫時(shí)轉(zhuǎn)移,。 4) “307”:Tempoay Redirect,。 5) “400”:Bad Request錯誤請求,發(fā)出錯誤的不符合Http協(xié)議的要求,。 6) “401”:Unauthoried 未認(rèn)證,,一般需要用戶名,密碼登錄,。 7) “403”:Forbidden 禁止,。 8) “404”:Not Found 未找到(*)。 9) “500”:Internal Server Error 服務(wù)器錯誤,。 10) “503”:Server Unavailable:一般是訪問人數(shù)過多,。 (2) 200段是成功,300段需要對請求作進(jìn)一步處理,,400段表示客戶端請求錯誤,,500段表示服務(wù)器錯誤,。
(1) Server:Cassini/3.5,0.5表示服務(wù)器的類型。 (2) content-Type:text/html;Charset=utf-8表示返回?cái)?shù)據(jù)的類型,。 (3) 服務(wù)器通過content-type告訴客戶端響應(yīng)的數(shù)據(jù)類型,,這樣瀏覽器就根據(jù)返回?cái)?shù)據(jù)的類型來進(jìn)行不同的處理,如果是圖片類型就顯示,,如果是文本類型就直接顯示內(nèi)容,,如果是HTML類型就用瀏覽器顯示內(nèi)容,如果是下載類型就彈出下載工具等,。 (4) 常用Content-Type:text/html,,image/gif,image/jpeg,,text/plain,,text/javascript,application/x-excel,,application/octet-stream(二進(jìn)制文件),。 (5) Content-Length:19944表示后續(xù)數(shù)據(jù)消息體的長度,報(bào)文頭只是描述,,返回的具體數(shù)據(jù)(比如:Html文本,,圖片數(shù)據(jù)等)在兩個回車之后的內(nèi)容中。
(1) 網(wǎng)頁中如果有圖片,,CSS,JS的報(bào)告外部文件的話,,圖片,CSS,JS都在單獨(dú)的請求中,,也就是并不是頁面的所有內(nèi)容都在一個請求中完成,,而是每個資源一個請求。 (2) 一般情況下,,只有瀏覽器請求服務(wù)器端,,服務(wù)器端才會給瀏覽器響應(yīng)數(shù)據(jù),不會主動向?yàn)g覽器推送數(shù)據(jù),,這樣是安全考慮,,也是提高服務(wù)器的性能考慮,如果要服務(wù)器向?yàn)g覽器推送數(shù)據(jù),,則需要使用ServerPush等額外的技術(shù),。 (3) Http是”請求—響應(yīng)”的工作方式,因此頁面會不斷刷新,,如果不希望頁面刷新則要使用Ajax技術(shù),。
(1)按鈕實(shí)現(xiàn)表格刪除的效果,使用超鏈接進(jìn)行刪除。 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的值,,然后執(zhí)行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中數(shù)據(jù)綁定控件中行按鈕和行超鏈接實(shí)現(xiàn)方式的不同,,ListView中Button,HyperLink兩種行刪除的方式,按鈕方式是將行的Id通過表單提交到服務(wù)器,,行超鏈接的方式是通過超鏈接的URL通過get方式提交給處理頁面,,超鏈接的方式由于沒有提交所有的表單信息,因此很多服務(wù)器端控件的高級用法用不了,。 (3) 用aspx重寫,,超鏈接的因?yàn)闆]有向服務(wù)器提交viewState等隱藏字段,所以處理時(shí)IspostBack是false,,而按鈕的則是提交了表單,,所以IsPostBack=True,,可以在超鏈接的Href中寫表單提交的JavaScript,,這樣就是WebForm中的LinkButton的原理。 (4) 客戶端,,服務(wù)器由于在兩臺計(jì)算機(jī)中,,所以無法做到兩邊的變量的互相讀取或者兩邊函數(shù)的互相調(diào)用,所以如果相看起來好像做到,,那么必須通過提交的方式來將客戶端變量值作為一個表單字段提交到服務(wù)器,,或者服務(wù)器端將服務(wù)端變量打印到客戶端代碼中。 注釋:Http協(xié)議我們就說到這里了,,下節(jié)博客是wen開發(fā)的一些基本原則,,希望我們共同來學(xué)習(xí),我們的群號是:159227188,,歡迎大家在這里交流,。 |
|