post 和 get 都是 HTTP 與服務器交互的方法。
一般在瀏覽器中輸入網址訪問資源都是通過 get 方式;在 form 表單中,可以通過 method 指定提交方式爲 get 或者 post,默認爲get 提交。注:用 post 必須要到 form表單中。
一個 url 地址,它用於描述一個網絡上的資源, HTTP 中有4中與服務器的交互方法:get,post,put,delete 分別對應着對這個資源的查 ,改 ,增 ,刪 4個操作。也就是,get一般用於查詢/獲取資源信息,post 用於更新資源信息,這應是二者最本質的區別。
根據 HTTP 規範,get 應該是安全的和冪等的 。所謂安全的意味着該操作用於獲取信息而非修改信息,不會影響資源的狀態;所謂冪等的意味着對同一URL的多個請求應該返回同樣的結果。
---------------------------------------------------------------------------------------------------------------------------------
HTTP 請求的格式:
<request line>
<headers>
<blank line>
<request-body>
在 HTTP 請求中,第一行必須是一個請求行,用來說明請求類型、要訪問的資源以及使用的 HTTP 版本。緊接着是一個首部小節,用來說明服務器要使用的附加信息。在首部之後是一個空行。再此之後可以添加任意的其他數據,稱之爲主體。
HTTP 請求的 get 方法示例:
GET /books/?sex=man&name=Professional HTTP/1.1
Host: www.wrox.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6)
Gecko/20050225 Firefox/1.0.1
Connection: Keep-Alive
HTTP 請求的 post 方法示例:
POST / HTTP/1.1
Host: www.wrox.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6)
Gecko/20050225 Firefox/1.0.1
Content-Type: application/x-www-form-urlencoded
Content-Length: 40
Connection: Keep-Alive
(----此處空一行----)
name=Professional%20Ajax&publisher=Wiley
---------------------------------------------------------------------------------------------------------------------------------
下面列舉一下 get 和 post 的區別:
(1)url 格式
get 提交:提交的數據會附在 url 之後,就是把數據放置在請求行(request line)中,以?分割 url 和傳輸數據,多個參數用 & 連接,例如:login.action?name=hyddd&password=idontknow&verify=%E4%BD%A0 %E5%A5%BD,url
的編碼格式採用的是ASCII 碼,而不是 Unicode,這也就是說你不能在 url 中包含任何非 ASCII 字符,所有非ASCII字符均需要編碼再傳輸。
post 提交:提交的數據不會顯示在 url 中,而是放置在是 HTTP包 的包體中,上面示例中空行後的就是實際的傳輸數據。
實際上,以上區分並不是 HTTP 的規定,不是說 post 數據就要放在 body 中,get 數據就一定要放在 url 中。此等說法只是 HTML標準對 HTTP 協議的用法的約定。
(2)傳輸數據大小
首先聲明:HTTP 協議沒有對傳輸的數據大小進行限制,HTTP協議規範也沒有對 url長度進行限制。但在實際開發中:
get:特定瀏覽器和服務器對 url 長度有限制,例如 IE 對URL長度的限制是2083字節(2K+35),對於其他瀏覽器,理論上沒有長度限制,其限制取決於操作系統的支持。
post:由於不是通過 url 傳值,理論上數據不受限,但實際各個 web 服務器會規定對 post 提交數據大小進行限制。
(3)安全性
post 的安全性要比 get 的高。比如:通過 get 提交數據,用戶名和密碼將明文出現在 url 上,因爲登錄頁面有可能被瀏覽器緩存, 其他人查看瀏覽器的歷史紀錄,就可以拿到你的賬號和密碼了。除此之外,使用 get 提交數據還可能會造成 Cross-site request forgery 攻擊。
---------------------------------------------------------------------------------------------------------------------------------
HTTP 響應格式:
<status line>
<headers>
<blank line>
<response-body>
與請求格式的區別在於第一行中用狀態信息代替了請求信息,狀態行(status line)通過提供一個狀態碼來說明所請求的資源情況。
HTTP 響應示例:
HTTP/1.1 200 OK
Date: Sat, 31 Dec 2005 23:59:59 GMT
Content-Type: text/html;charset=ISO-8859-1
Content-Length: 122
<html>
<head>
<title>Wrox Homepage</title>
</head>
<body>
<!-- body goes here -->
</body>
</html>
常用的狀態碼:
◆200 (OK): 找到了該資源,並且一切正常。
◆304 (NOT MODIFIED): 該資源在上次請求之後沒有任何修改。這通常用於瀏覽器的緩存機制。
◆401 (UNAUTHORIZED): 客戶端無權訪問該資源。這通常會使得瀏覽器要求用戶輸入用戶名和密碼,以登錄到服務器。
◆403 (FORBIDDEN): 客戶端未能獲得授權。這通常是在401之後輸入了不正確的用戶名或密碼。
◆404 (NOT FOUND): 在指定的位置不存在所申請的資源。