一、原理區別
Http定義了與服務器交互的方法,其中最基本的四種是:GET,POST,PUT,DELETE,正對應着對資源的查,改,增,刪。URL的全稱是資源描述符,我們可以這樣認為,一個URL地址,用於描述一個網絡資源。而GET一般是對這個資源的獲取/查詢,而POST一般用於更新資源信息。一般我們在瀏覽器輸入一個網址都是GET請求。GET用於信息獲取,而且應該是安全的和冪等的。所謂安全的意味着該操作用於獲取信息而非修改信息。冪等的意味着對同一URL的多個請求應該返回同樣的結果。POST表示可能修改變服務器上的資源的請求。
二、表現形式區別
首先,我們先看一下HTTP請求的格式:
<method> <request-URL> <version> <headers> <entity-body>
在HTTP請求中,第一行必須是一個請求行,包括請求方法,請求URL,報文所用HTTP版本。緊接着是一個headers小節,可以有0個或一個部首,用來說明服務的附加信息。在部首之后就是一個空行,最后就是報文實體的主體部分,包含一個由任意數據塊組成的數據塊。但是並不是所有的報文都包含實體的主題部分。
GET請求實例:
GET http://weibo.com/signup/signup.php?inviteCode=2388493434 Host: weibo.com Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
POST請求實例:
POST /inventory-check.cgi HTTP/1.1 Host: www.joes-hardware.com Content-Type: text/plain Content-length: 18 item=bandsaw 2647
接下來看兩種請求的區別:
1、GET請求,請求的數據會附加在URL之后,以?分割URL和傳輸數據,多個參數用&連接。URL的編碼格式采用的是ASCII編碼,而不是Unicode,即是說所有的非ASCII字符都要編碼之后再傳輸。
POST請求:POST請求會把請求的數據放置在HTTP請求包的包體中。上面的item=bandsaw就是實際傳輸數據。
因此,GET請求會暴露在URL中,而POST請求不會。
2.傳輸數據的大小
在HTTP規范中,沒有對URL的長度和傳輸的數據大小進行限制。但是在實際開發過程中,對GET,特定的瀏覽器和服務器對URL的長度限制。因此,在使用GET請求時,傳輸數據會受到URL長度的限制。
對於POST,由於不是URL傳值,理論上是不會受限制的,但實際上各個服務器會規定對POST提交數據大小進行限制,Apache,IIS都有各自的配置。
3、安全性
POST安全性比GET的高。這里的安全是指真正的安全,而不同於上面GET提到的安全方法中的安全,上面提到的安全僅僅是不修改服務器數據。比如,在進行登錄操作,通過GET請求,用戶名和密碼都會暴露在URL上,因為登錄頁面有可能被瀏覽器緩存以及其他人查看瀏覽器的歷史記錄的原因,此時的用戶名和密碼就很容易被他人拿到。除此之外,GET請求提交的數據還可能會造成XSS(cross-site request forgery)攻擊。
4、HTTP中的GET,POST,SOAP協議都是在HTTP上運行的
總結一下,Get是向服務器發索取數據的一種請求,而Post是向服務器提交數據的一種請求,在FORM(表單)中,Method默認為"GET",實質上,GET和POST只是發送機制不同,並不是一個取一個發!
三、HTTP相應
HTTP相應報文的格式
<version> <status> <reason-phrase> <headers> <entity-body>
status狀態碼描述了請求過程中發生的情況
reason-phrase是數字狀態碼的可讀版本
常見的狀態碼以及含義如下:
200 OK 服務器成功處理請求
301/302 Moved Permanently(重定向)請求的URL已移走。響應報文中應該包含一個Location URL,說明資源現在所處的位置
304 Not Modified(未修改) 客戶的緩存資源是最新的,要客戶端使用緩存內容
404 Not Found 未找到資源
501 Internal Server Error 服務器遇到錯誤,使其無法對請求提供服務
HTTP響應示例
HTTP/1.1 200 OK
Content-type: text/plain Content-length: 12 Hello World!
<pre code_snippet_id="300067" snippet_file_name="blog_20140418_2_9713022" name="code" class="plain"><pre code_snippet_id="300067" snippet_file_name="blog_20140418_2_9713022"></pre> <pre></pre> <pre></pre> <pre></pre> <pre></pre> <pre></pre> <pre></pre> <pre></pre> </pre>