我在其它文章中曾說到了處理HTML表單時用到了GET和POST方法,那麼,GET和POST是兩個什麼東西呢?用它們處理表單又有啥區別呢?你不知道,就看這篇文章吧。對你絕對有用,無論你信不信,反正我是信了。html
除了GET和POST這兩種方式之後,還有哪些呢?我接下來就先對HTTP中定義的操做進行總結一下。面試
咱們都知道,使用URL能夠肯定一個資源所在的位置,那麼咱們肯定這個資源之後,是如何對這個資源進行處理的呢?瀏覽器
Http協議定義了客戶端與服務器交互的不一樣方法,最基本的方法有4種,分別是GET,POST,PUT,DELETE。URL定位了這個資源,而HTTP中的GET,POST,PUT,DELETE就是對應着對這個資源的查,改,增,刪4個操做。到這裏,你們應該有個大概的瞭解了,GET通常用於獲取/查詢資源信息,而POST通常用於更新資源信息。那麼,除了上面說的四種方法,HTTP還有其它方法麼?其實HTTP中定義瞭如下幾種請求方法:緩存
如今就對上述的全部方法都介紹一下,增長你們對這些方法的一個整體認識。安全
Get是最經常使用的方法,一般用於請求服務器發送某個資源。服務器
HEAD方法與GET方法的行爲很相似,但服務器在響應中只返回實體的主體部分。這就容許客戶端在未獲取實際資源的狀況下,對資源的首部進行檢查,使用HEAD,咱們能夠更高效的完成如下工做:app
PUT方法是讓服務器用請求的主體部分來建立一個由所請求的URL命名的新文檔;若是那個文檔存在的話,就用這個主體來代替它。測試
POST方法向服務器提交數據,好比完成表單數據的提交,將數據提交給服務器處理。url
TRACE方法會在目的服務器端發起一個「迴環」診斷,咱們都知道,客戶端在發起一個請求時,這個請求可能要穿過防火牆、代理、網關、或者其它的一些應用程序。這中間的每一個節點均可能會修改原始的HTTP請求,TRACE方法容許客戶端在最終將請求發送服務器時,它變成了什麼樣子。因爲有一個「迴環」診斷,在請求最終到達服務器時,服務器會彈回一條TRACE響應,並在響應主體中攜帶它收到的原始請求報文的最終模樣。這樣客戶端就能夠查看HTTP請求報文在發送的途中,是否被修改過了。操作系統
OPTIONS方法用於獲取當前URL所支持的方法。若請求成功,則它會在HTTP頭中包含一個名爲「Allow」的頭,值是所支持的方法,如「GET, POST」。
DELETE方法就是請求服務器刪除指定URL所對應的資源。可是,客戶端沒法保證刪除操做必定會被執行,由於HTTP規範容許服務器在不通知客戶端的狀況下撤銷請求。
上面對HTTP所支持的全部方法大致上進行了介紹,可是在實際開發中,咱們使用的更多的是GET和POST,並且在面試的時候,也常常會問GET和POST的區別,這裏就着重對GET和POST的區別進行總結。
我記得我上大學那會,就問過老師,GET和POST有啥區別,老師就簡單的告訴我,POST比GET安全,後來,我才發現,我被老師騙了。那麼,對於GET和POST咱們究竟還有哪些誤區呢?
誤區一:POST能夠比GET提交更多更長的數據? 因爲使用GET方法提交數據時,數據會以&符號做爲分隔符的形式,在URL後面添加須要提交的參數,有人就會說了,瀏覽器地址欄輸入的參數是有限的,而POST不用再地址欄輸入,因此POST就比GET能夠提交更多的數據。難道真的是這樣的麼?
而實際上,URL不存在參數上限的問題,HTTP協議規範沒有對URL長度進行限制。這個限制是特定的瀏覽器及服務器對它的限制。IE對URL長度的限制是2083字節(2K+35)。對於其餘瀏覽器,如Netscape、FireFox等,理論上沒有長度限制,其限制取決於操做系統的支持。 同時,POST是沒有大小限制的,HTTP協議規範也沒有進行大小限制。POST數據是沒有限制的,起限制做用的是服務器的處理程序的處理能力。 總歸一句話,這個限制是針對全部HTTP請求的,與GET、POST沒有多少關係。
誤區二:POST比GET安全? 首先,咱們要認可安全的概念有不少種,要是從最基本的肉眼看到就不安全,肉眼看不到那就是安全的概念說呢,GET確實沒有POST安全,畢竟小白用戶確實能夠看到在URL中帶有的數據信息,這個你沒法狡辯。那麼要是往嚴謹了說呢,POST是否是要比GET安全呢?其實不是的。
上面也說了,GET將提交到服務器的數據添加到URL中了,可見;雖然POST的數據,你肉眼看不到,你抓個包看看,在HTTP包的包體中,咱們提交的數據時仍然可見的;因此說,從這方面來講,POST也是以五十步笑百步了。
咱們來抓個包看看,作個試驗:
查看抓包信息並分析,如下是我抓到的包的一些信息:
"192.168.199.125","117.121.57.62","HTTP","1304","POST /sso/signup?client_id=9&url=http://cn.cocos2d-x.org/main/sso_return HTTP/1.1 (application/x-www-form-urlencoded)"
192.168.199.125是個人本機地址;117.121.57.62是請求的目的地址。1304是包的長度;接下來的數據纔是咱們須要關注的重點,能夠很明顯的看到,是以POST的方式向服務器發送註冊信息的。咱們再來看看發送了那些信息,因爲使用的POST方法,咱們沒法從URL中獲得任何有用的東西,那咱們就從HTTP包體中看看。內容以下:
username=JellyThink&password=e10adc3949ba59abbe56e057f20f883e&repassword=e10adc3949ba59abbe56e057f20f883e&email=jellythink%40163.com&vcode=5gp8&rgpermit=1
看到了嗎?裏面都是我輸入的信息,具體以下:
如今你還覺POST安全嗎?關於GET方式,我這裏就再也不舉例說明了。你也趕忙動手去抓個包看看吧。
最後呢,不少時候,你們都覺的使用GET很方便,畢竟使用POST要用到Form,可是,你要知道,你使用GET方法時,瀏覽器可能會緩存你的地址等信息,還會留下歷史記錄,而對於POST方法呢,則不會進行緩存。之後在開發中,必定要分清楚GET和POST的使用場合,何時要使用GET,何時要使用POST,本身作到心中有數。
可能,你在Google相似的文章的時候,可能會看到分析POST和PUT區別的文章,這又是一類糾結的東西,更多的時候,咱們分析這種東西都是分實際情景,結合設計者的語義去使用,慢慢體會吧。至少我如今也不知道如何準確的區分POST和PUT。固然了,我仍是要推薦一位大牛的文章,有時間去拜讀一下吧,《REST當中爲何要使用HTTP PUT》。
各位,聖誕快樂。
果凍想,玩代碼,玩技術!
2014年12月25日 於深圳。