起名困難戶,每次寫文章最愁的就是不知道該如何起個稍具內涵的名字,如果這篇文章我只是寫寫Get和Post的區別,我可以起個名字“Get和Post的那點事”,如果打算闡述一下Http協議原理性內容,那該叫“Http中你不知道的那些事”,兩者都不是我想要的,前者太過淺薄,後者太過深奧,已超出本人的能力範圍,於是我只能寫點Http,Get,Post和個稀泥大家就將就著看一下,開頭很多廢話的毛病我發現我是越來越難改了,進入正題吧~
Http
HTTP(Hypertext transfer protocol),先說下著幾個單詞,Hypertext是超文字(除了HTML外,也可以是帶有超連結的XML或JSON),protocol是協議,transfer翻譯應該是移交(也可以翻譯成傳輸,運輸,還有一個更具體的詞是transport),最開始學校學習Http的所有市面能見到的書籍都翻譯成超文字傳輸協議,Http設計的本身是為了移交和操作資源,並不是為了傳輸資源.最開始的的網站都是靜態內容類似今天雲盤,實現了資源共享,URL(Uniform Resoure Locator:統一資源定位符)用來對映網上的資源,為了大家能統一的訪問web資源,Http提供了幾種方法訪問資源.
Http協議中定義了與伺服器之間互動的八個方法:get(獲取資源),post(向指定資源提交資料進行處理請求,增加或者更新資源),put(向指定資源位置上傳其最新內容 ),delete(請求伺服器刪除Request-URI所標識的資源);
head(主機端響應Client端的一些資料檔案頭),options(主機端響應Client端的一些允許的功能與方法。返回伺服器針對特定資源所支援的HTTP請求方法。也可以利用向Web伺服器傳送'*'的請求來測試伺服器的功能性),trace(回顯伺服器收到的請求,主要用於測試或診斷),connect(HTTP/1.1協議中預留給能夠將連線改為管道方式的代理伺服器)。以前出去面試的時候只知道有get和post請求,對於其他一概不知,現在想來有點慚愧。
Get和Post的基礎概念
HTTP協議本身是一種面向資源的應用層協議,但對HTTP協議的使用實際上存在著兩種不同的方式:一種是RESTful的,它把HTTP當成應用層協議,比較忠實地遵守了HTTP協議的各種規定;另一種是SOA的,它並沒有完全把HTTP當成應用層協議,而是把HTTP協議作為了傳輸層協議,然後在HTTP之上建立了自己的應用層協議。
說到這裡不得不說到一個大神級的人Roy Thomas Fielding,維基上有詳細英文介紹,我說下中文介紹,他是HTTP協議(1.0版和1.1版)的主要設計者、Apache伺服器軟體的作者之一、Apache基金會的第一任主席。基於以上的工作經歷他寫了一個篇讓人驚歎的博士論文Architectural Styles and the Design of Network-based Software Architectures,中文名叫架構風格與基於網路應用軟體的架構設計(下載連結:http://pan.baidu.com/s/1bnGQUsv).
論文中提出了一個REST(REpresentational State Transfer即表現層狀態轉移)架構。對應的就是上面的RESTFUL的使用方式,專案中沒有用到過,看過一點一點皮毛,園友有興趣的可以自己研究一下~Get和Post這兩哥們用的太廣泛了,而且面試的時候基本上跟遞迴一樣是開啟共同話題的談資,還是看概念吧~
1.按照最開始Http協議的設計,,GET用於獲取資源,而且應該是安全的和冪等的。
安全和冪等屬於語義範疇,正如編譯器只能幫助檢查語法錯誤一樣,HTTP規範也沒有辦法通過訊息格式等語法手段來定義它。按照規範講get只用於獲取伺服器資源,但是你用get執行了其他操作,雖然違反了規範,也不會有影響。冪等屬於數學中的概念,簡單說下吧:
一元運算時,其作用在任一元素兩次後會和其作用一次的結果相同。例如,a的絕對值的絕對值等於a,abs(a)=abs(abs(a))。
二元運算時,冪等元素是指被自己重複運算(或對於函式是為複合)的結果等於它自己的元素。例如,乘法下唯一兩個冪等實數為0和1,0*0=0。
2.按照最開始Http協議的設計,post用於增加資源或者更新資源。
Get和Post異同點
異同點網上隨便找找,滿大街都是,既然要寫了,我還是免不了俗,儘量按照自己理解的方式去比較:
1.可見性,get訪問時URL是所有人都可見的,post則是不可見的.
2.長度限制,get和post傳遞長度都是是沒有限制的(不知道是自己當時沒學好還是老師誤人子弟說get是有長度限制的,很長一段時間以為get請求長度為1kb),get是放在URL一起去請求的,瀏覽器限制了URL的長度,導致get傳遞的引數不能太長.URL不存在引數上限的問題,HTTP協議規範沒有對URL長度進行限制。只是瀏覽器上有限制,不同瀏覽器限制不一樣,IE瀏覽器對URL的最大限制為2083個字元,如果超過這個數字,提交按鈕沒有任何反應。對於Firefox瀏覽器URL的長度限制為65,536個字元,但當我測試時,最大隻能處理8182個字元,這是因為url的長度除了瀏覽器限制外,還會受Web伺服器的限制。Safari中url最大長度限制為 80,000個字元。OperaURL最大長度限制為190,000個字元。Chrome對url長度限制為8182個字元。
POST是請求大小是沒有限制的,Web伺服器會對post請求進行控制,以IIS7為例
在如下路徑C:\Windows\System32\inetsrv\config\schema找到IIS_schema.xml,在其中搜尋一下 name="requestLimits",就會看到三個配置。
<attribute name="maxAllowedContentLength" type="uint" defaultValue="30000000" />
<attribute name="maxUrl" type="uint" defaultValue="4096" />
<attribute name="maxQueryString" type="uint" defaultValue="2048" />
postIIS請求限制為最多為28.6M,get請求IIS限制為2KB,如有需要可根據需求修改長度大小.
3.安全性,與 post相比,get的安全性較差,因為所傳送的資料是 URL 的一部分(登入的時候提交資料應該沒人會用get),post比get更安全,因為引數不會被儲存在瀏覽器歷史或 web 伺服器日誌中。
4.資料型別,get只允許 ASCII 字元,post傳遞沒有限制,也允許二進位制資料。
5.編碼型別,form的enctype屬性為表單控制元件的內容編碼方式,常用有兩種:application/x-www-form-urlencoded(預設)和multipart/form-data,不管get還是post都可以使用這兩種編碼方式, 當表單中含有type=file檔案控制元件的時候傳送方式只能使用post,內容編碼方式只能使用multipart/form-data.
6.書籤,快取,get請求可以收藏為書籤,能被快取,post不可以被收藏為書籤,不可以被快取.
7.取值方式,ASP.NET中對get請求使用Request.QueryString取值,對Post請求使用Request.Form取值,如果偷懶的話直接用Request兩者通用,JSP對get請求使用request.QueryString("");取值,對Post請求使用request.getParameter("");取值,你也可以直接用request.getParameter("")獲取get請求中的資料.在PHP中,可以用$_GET和$_POST分別獲取GET和POST中的資料,而$_REQUEST則可以獲取GET和POST兩種請求中的資料。
[參考資料]
http://www.infoq.com/cn/minibooks/dissertation-rest-cn
http://www.infoq.com/cn/minibooks/web-based-apps-archit-design
http://www.infoq.com/cn/articles/understanding-restful-style#anch100832
http://www.infoq.com/cn/minibooks/web-based-apps-archit-design