Http協議中Get和Post的淺談


起名困難戶,每次寫文章最愁的就是不知道該如何起個稍具內涵的名字,如果這篇文章我只是寫寫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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM