寫這篇部落格之前,看了裡一位前輩寫的關於get、post區別的文章,更是一頭霧水,原文:get和post有什麼區別?及為什麼網上的多數答案都是錯的。瞬間顛覆我之前的觀點,於是各種找資料,參考**http中get與post的區別,總算有了一點眉目,get和post是http協議傳送資料的兩種方式,那就先來看看http是怎樣工作的。http工作原理非常詳細的分析了http通訊的工作流程。簡單總結了下,http工作步驟:
1.建立連線
瀏覽器(客戶端)通過網路,用tcp建立與伺服器的連線,預設埠為80.
2.打包資料
瀏覽器分析請求位址,從中分解出協議名(http)、主機名(www.baidu.com)、埠、物件路徑,這個過程需要dns解析網域名稱得到主機ip.(這就是為什麼很多時候能上qq,但是不能刷網頁的原因,因為dns解析出的ip位址是錯誤的),然後將分解出的各個部分,結合主機資訊打包為請求報文。
3.傳送請求報文
請求報文由請求行、請求頭部、空行和請求資料4部分組成。
4.伺服器接收請求並響應
乙個響應由狀態行、響應頭部、空行和響應資料4部分組成。狀態行包含(資訊的協議版本號、成功or錯誤**、mime資訊),響應資訊傳送完畢後,伺服器會傳送一段空白行,表示響應頭部結束,然後再傳送實際請求資料。
5.斷開連線
伺服器主動關閉tcp,如果瀏覽器在請求頭資訊中加入connection:keep-alive,那麼tcp始終保持開啟,瀏覽器可繼續傳送請求。
6.客戶端瀏覽器解析html內容
客戶端瀏覽器首先解析狀態行,檢視表明請求是否成功的狀態**。然後解析每乙個響應頭,響應頭告知以下為若干位元組的html文件和文件的字符集。客戶端瀏覽器讀取響應資料html,根據html的語法對其進行格式化,並在瀏覽器視窗中顯示。
至此,http工作流程弄清楚了,再回到get和post上就比較容易分析,get/post是http協議同伺服器互動的多種方法之二,最基本的還有兩種put、delete,四種方法對應增、刪、改、查,所以get用於提交資源,post用於更新資源。
感官上來說,get請求引數跟在url位址後,以?-&的形式傳遞,字元轉義引用一下前輩的話「如果資料是英文本母/數字,原樣傳送,如果是空格,轉換為+,如果是中文/其他字元,則直接把字串用base64加密,得出如:%e4%bd%a0%e5%a5%bd,其中%xx中的xx為該符號以16進製表示的ascii」。post則是以資料報的形式。
安全性來說,get請求的資料,即使敏感引數也會明文出現在url中,post則不會。
伺服器端來說,獲取get請求引數用request.querystring,獲取post請求引數用request.form,至於這兩種獲取資料的方式異同和優先順序,我會以本系列另一篇博文在說明。
傳送資料大小來說,get方式提交的資料最多只能是1024位元組,post則沒有限制,這個說法,其實存在質疑,get提交資料大小受限,無非是url長度受限,而http並沒有對url長度作出限制,只是不同的瀏覽器會有限制。
說了這麼多,如果以後再被問到這個問題,就用上面黑體字回答他。
有大神針對get、post專門做過實驗,參考asp.net mvc3中關於httppost提交
MVP, MVC, MVVM, 傻傻分不清楚
最近 mvc model view controller 和 mvvm model view viewmodel 在微軟圈成為顯學,asp.net mvc 和 wpf 的 prism mvvm framework 功不可沒,mvc 和 mvvm 在概念上都是基於分層的,將呈現 presentatio...
物件,陣列,傻傻分不清楚
有段時間寫 總將物件和陣列區分不開,當然,可能是我的基礎不太紮實吧,今天將單獨將物件和陣列拿出來溜溜。首先來說一下物件,作為乙個沒有物件的人,這時候就需要用js來自己new乙個物件了 1.物件 object 什麼是物件?物件是一種引用型別,物件的值就是引用型別的例項。建立物件的方法?1 new乙個物...
併發 並行傻傻分不清楚?
今天,我們正在解決乙個問題 同時的,同時的愚蠢的困惑?執行緒在其生命週期中經歷了什麼?知識給你解答生活中所有困難的問題。concurrent和parallel 併發是指在一定時間內,多工交替處理的能力。並行性是指同時處理多個任務的能力。案例 當乙個商場的銷售員需要面對許多顧客時,有些顧客要求 有些顧...