1. 程式人生 > >GET與POST的區別與選取

GET與POST的區別與選取

GET與POST的區別:

GET方式:

用get方式可傳送簡單資料,但大小一般限制在1KB下,資料追加到URL中傳送(http的header傳送),也就是說,瀏覽器將各個欄位元素及其資料依照URL引數的格式附加到請求行中的資源路徑後面。另外重要的一點事,他會被客戶端的瀏覽器快取起來,別人就可以從瀏覽器的歷史記錄中,讀取到此客戶的資料,比如賬號和密碼。因此,在某些情況下,get方法會帶來嚴重的安全問題

POST方式

當使用POST方式時,瀏覽器把各表單欄位元素及其資料作為HTTP訊息的實體內容傳送給web 伺服器,而不是作為URL地址的引數進行傳遞,使用POST方式,傳遞的資料量要比使用GET方式傳送的資料量大的多。

簡要概述:

  • GET在瀏覽器回退時是無害的,而POST會再次提交請求。
  • GET產生的URL地址可以被Bookmark,而POST不可以
  • GET請求會被瀏覽器主動cache,而POST不會,除非手動設定
  • GET請求只能進行URL編碼,而POST支援多種編碼方式
  • GET請求在URL中傳送的引數是有長度限制的,傳送的資料量較小;而POST中的引數不會被保留,post傳送的資料量較大,一般被預設為不受限制。
  • 對引數的資料型別,GET只接受ASCII字元,而POST沒有限制
  • GET比POST更不安全,因為引數直接暴露在URL上,所以不能用來傳遞敏感資訊。表單提交避免使用GET方式。
  • GET引數通過URL傳遞,POST放在Request body中。
  • GET方式,伺服器端用request.QueryString獲取變數的值。POST方式,伺服器端用Request.Form獲取提交的資料

深入剖析:

  • GET和POST是http協議中的兩種傳送請求的方法。
  • GET和POST的底層是TCP/IP,準確的說,GET/POST都是TCP連結。GET和POST還有一個重大區別,簡單的說:GET產生一個TCP資料包;POST產生兩個TCP資料包。兩種方式的目的都是一致的,只是GET把引數包含在URL上,執行時,它首先設定method定為GET,並將要傳送的資料存在URL裡以便記錄,瀏覽器會把http header和data一併傳送出去,伺服器響應200(返回資料)。POST通過request body傳遞引數,執行時,它需要伺服器響應兩次,瀏覽器先發送header,伺服器響應100 continue,瀏覽器再發送data,伺服器響應200(返回資料)。
  • GET和POST都有自己的語義,不能隨便混用。據研究,當網路環境好的情況下,發一次包的時間和發兩次包的時間差別基本可以無視。而在網路環境差的情況下,兩次包的TCP在驗證資料包完整性上,有非常大的優點。
  •  並不是所有瀏覽器都會在POST中傳送兩次包,Firefox就只發送一次。

ajax亂碼問題:

產生亂碼的原因:

1) xmlhttp返回的資料預設的額字元編碼是UTF-8,如果客戶端頁面不是這個編碼格式時,會出現亂碼
2) post方法提交資料預設的字元編碼是utf-8,如果伺服器端不是這個格式的編碼,依舊會出現亂碼

解決辦法有:

1、若客戶端是gb2312編碼,則在伺服器指定輸出流編碼
2、伺服器端和客戶端都使用utf-8編碼
3、如果按照下述程式碼,確定不是1 2的問題,依舊亂碼,那就檢查方式是否是get請求(或凡設計URL傳遞引數的),被傳遞的引數都要先經encodeURLComponent方法處理,如果沒有用encodeURLCompent處理的話,也會產生亂碼。

gb2312: header('Content-Type:text/html; charset=GB2312');
utf8: header('Content-Type: text/html; charset=utf-8');

何時使用GET請求,何時使用POST請求

GET請求的目的是給予伺服器一些引數,以便從伺服器獲取列表。例如:list:sapx?page=1,表示獲取第一頁的資料

POST請求的目的是向伺服器傳送一些引數,例如form中的內容。

與POST相比,GET更簡單也更快,而且在大部分情況下都能用。在以下情況中,請使用POST請求

  • 無法使用快取檔案(更新伺服器上的檔案或資料庫);
  • 向伺服器傳送大量資料(post沒有資料量限制);
  • 傳送包含未知字元的使用者輸入時,post比GET更穩定可靠

程式碼演示

關於post提交方式的程式碼。

1個表單,兩個按鈕,一個用於submit提交表單,一個位button跳轉頁面

<form action="/mySSH/regedit.do" name="user" method= "POST">
    <span>名稱:::</span>
    <input type="text" name="username" id="username" value=""></br>
    <span>password:::</span>
    <input type="password" name="password" value="">
    <input type="submit" name="method" value="新增使用者">
    <input type="button" name="userList" value="使用者一欄" onClick="touserList()" >
</form>
<!--JavaScript-->
<script type="text/javascript">
    function touserList() {
        window.location.href = "userList do";
    }
</script>

關於get提交方式的程式碼

一個表單,兩個submit均用來提交表單,但是進行的處理不同。

<form action="" method="get">
    <input type="submit" name="submit1" value="使用者註冊" onClick="input(this.form)">
    <input type="submit" name="submit2" value="使用者一覽" onClick="list(this.form)">
</form>
<!--JavaScript -->
<script type="text/javascript">
    function input(form){
        form.action="input.do";
        form.submit();
    };

    function list(form){
        alert("使用者一覽");
        form.action = "userList.do";
        form.submit();
    }
</script>