Get 和 Post 的區別

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): 在指定的位置不存在所申請的資源。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章