jQuery get/post區別及contentType取值

1、GET訪問 瀏覽器 認爲 是等冪的

就是 一個相同的URL 只有一個結果[相同是指 整個URL字符串完全匹配]
所以 第二次訪問的時候 如果 URL字符串沒變化瀏覽器是直接拿出了第一次訪問的結果,表現爲請求結果沒變化;

POST則 認爲是一個 變動性 訪問 (瀏覽器 認爲 POST的提交 必定是 有改變的)

防止 GET 的 等冪 訪問 就在URL後面加上時間戳如: ?+new Date();,[總之就是使每次訪問的URL字符串不一樣的]

設計WEB頁面的時候 也應該遵守這個原則

2、Ajax的Get和Post的區別

Get方式:
用get方式可傳送簡單數據,但大小一般限制在1KB下,數據追加到url中發送(http的header傳送),也就是說,瀏覽器將各個表單字段元素及其數據按照URL參數的格式附加在請求行中的資源路徑後面。另外最重要的一點是,它會被客戶端的瀏覽器緩存起來,那麼,別人就可以從瀏覽器的歷史記錄中,讀取到此客戶的數據,比如帳號和密碼等。因此,在某些情況下,get方法會帶來嚴重的安全性問題。

Post方式:
當使用POST方式時,瀏覽器把各表單字段元素及其數據作爲HTTP消息的實體內容發送給Web服務器,而不是作爲URL地址的參數進行傳遞,使用POST方式傳遞的數據量要比使用GET方式傳送的數據量大的多。

總之,GET方式傳送數據量小,處理效率高,安全性低,會被緩存,而POST反之。

使用get方式需要注意:
1 對於get請求(或凡涉及到url傳遞參數的),被傳遞的參數都要先經encodeURIComponent方法處理.例:var url = "update.php?username=" +encodeURIComponent(username) + "&content=" +encodeURIComponent

(content)+"&id=1" ;


使用Post方式需注意:
a.設置header的Context-Type爲application/x-www-form-urlencode確保服務器知道實體中有參數變量. 通常使用XmlHttpRequest對象的SetRequestHeader("Context-Type","application/x-www- form-urlencoded;")。例:

xmlHttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
b.參數是名/值一一對應的鍵值對,每對值用&號隔開.如 var name=abc&sex=man&age=18,注意var name=update.php?

abc&sex=man&age=18以及var name=?abc&sex=man&age=18的寫法都是錯誤的;
c.參數在Send(參數)方法中發送,例: xmlHttp.send(name); 如果是get方式,直接 xmlHttp.send(null);

d.服務器端請求參數區分Get與Post。如果是get方式則$username = $_GET["username"]; 如果是post方式,則$username = $_POST["username"];

3、四種常見的 POST 提交數據方式 

HTTP 協議是以 ASCII 碼傳輸,建立在 TCP/IP 協議之上的應用層規範。規範把 HTTP 請求分爲三個部分:狀態行、請求頭、消息主體。類似於下面這樣: 
<method> <request-url> <version> 
<headers> 

<entity-body></entity-body></headers></version></request-url></method> 
協議規定 POST 提交的數據必須放在消息主體(entity-body)中,但協議並沒有規定數據必須使用什麼編碼方式。實際上,開發者完全可以自己決定消息主體的格式,只要最後發送的 HTTP 請求滿足上面的格式就可以。 

但是,數據發送出去,還要服務端解析成功纔有意義。一般服務端語言如 php、python 等,以及它們的 framework,都內置了自動解析常見數據格式的功能。服務端通常是根據請求頭(headers)中的 Content-Type 字段來獲知請求中的消息主體是用何種方式編碼,再對主體進行解析。所以說到 POST 提交數據方案,包含了 Content-Type 和消息主體編碼方式兩部分。

 


application/x-www-form-urlencoded 

這應該是最常見的 POST 提交數據的方式了。瀏覽器的原生 form 表單,如果不設置 enctype 屬性,那麼最終就會以 application/x-www-form-urlencoded 方式提交數據。請求類似於下面這樣(無關的請求頭在本文中都省略掉了): 

POST http://www.example.com HTTP/1.1 
Content-Type: application/x-www-form-urlencoded;charset=utf-8 

title=test&sub%5B%5D=1&sub%5B%5D=2&sub%5B%5D=3 
首先,Content-Type 被指定爲 application/x-www-form-urlencoded;其次,提交的數據按照 key1=val1&key2=val2 的方式進行編碼,key 和 val 都進行了 URL 轉碼。大部分服務端語言都對這種方式有很好的支持。例如 PHP 中,$_POST['title'] 可以獲取到 title 的值,$_POST['sub'] 可以得到 sub 數組。 

很多時候,我們用 Ajax 提交數據時,也是使用這種方式。例如 JQuery 和 QWrap 的 Ajax,Content-Type 默認值都是「application/x-www-form-urlencoded;charset=utf-8」。 

multipart/form-data 

這又是一個常見的 POST 數據提交的方式。我們使用表單上傳文件時,必須讓 form 的 enctyped 等於這個值。直接來看一個請求示例: 

POST http://www.example.com HTTP/1.1 
Content-Type:multipart/form-data; boundary=----WebKitFormBoundaryrGKCBY7qhFd3TrwA 

------WebKitFormBoundaryrGKCBY7qhFd3TrwA 
Content-Disposition: form-data; name="text" 

title 
------WebKitFormBoundaryrGKCBY7qhFd3TrwA 
Content-Disposition: form-data; name="file"; filename="chrome.png" 
Content-Type: image/png 

PNG ... content of chrome.png ... 
------WebKitFormBoundaryrGKCBY7qhFd3TrwA-- 
這個例子稍微複雜點。首先生成了一個 boundary 用於分割不同的字段,爲了避免與正文內容重複,boundary 很長很複雜。然後 Content-Type 裏指明瞭數據是以 mutipart/form-data 來編碼,本次請求的 boundary 是什麼內容。消息主體裏按照字段個數又分爲多個結構類似的部分,每部分都是以 --boundary 開始,緊接着內容描述信息,然後是回車,最後是字段具體內容(文本或二進制)。如果傳輸的是文件,還要包含文件名和文件類型信息。消息主體最後以 --boundary-- 標示結束。關於 mutipart/form-data 的詳細定義,請前往 rfc1867 查看。 

這種方式一般用來上傳文件,各大服務端語言對它也有着良好的支持。 

上面提到的這兩種 POST 數據的方式,都是瀏覽器原生支持的,而且現階段原生 form 表單也只支持這兩種方式。但是隨着越來越多的 Web 站點,尤其是 WebApp,全部使用 Ajax 進行數據交互之後,我們完全可以定義新的數據提交方式,給開發帶來更多便利。 

application/json 

application/json 這個 Content-Type 作爲響應頭大家肯定不陌生。實際上,現在越來越多的人把它作爲請求頭,用來告訴服務端消息主體是序列化後的 JSON 字符串。由於 JSON 規範的流行,除了低版本 IE 之外的各大瀏覽器都原生支持 JSON.stringify,服務端語言也都有處理 JSON 的函數,使用 JSON 不會遇上什麼麻煩。 

JSON 格式支持比鍵值對複雜得多的結構化數據,這一點也很有用。記得我幾年前做一個項目時,需要提交的數據層次非常深,我就是把數據 JSON 序列化之後來提交的。不過當時我是把 JSON 字符串作爲 val,仍然放在鍵值對裏,以 x-www-form-urlencoded 方式提交。 

Google 的 AngularJS 中的 Ajax 功能,默認就是提交 JSON 字符串。例如下面這段代碼: 

var data = {'title':'test', 'sub' : [1,2,3]}; 
$http.post(url, data).success(function(result) { 
    ... 
}); 
最終發送的請求是: 

POST http://www.example.com HTTP/1.1 
Content-Type: application/json;charset=utf-8 

{"title":"test","sub":[1,2,3]} 
這種方案,可以方便的提交複雜的結構化數據,特別適合 RESTful 的接口。各大抓包工具如 Chrome 自帶的開發者工具、Firebug、Fiddler,都會以樹形結構展示 JSON 數據,非常友好。但也有些服務端語言還沒有支持這種方式,例如 php 就無法通過 $_POST 對象從上面的請求中獲得內容。這時候,需要自己動手處理下:在請求頭中 Content-Type 爲 application/json 時,從 php://input 裏獲得原始輸入流,再 json_decode 成對象。一些 php 框架已經開始這麼做了。 

當然 AngularJS 也可以配置爲使用 x-www-form-urlencoded 方式提交數據。如有需要,可以參考這篇文章。 

text/xml 

我的博客之前提到過 XML-RPC(XML Remote Procedure Call)。它是一種使用 HTTP 作爲傳輸協議,XML 作爲編碼方式的遠程調用規範。典型的 XML-RPC 請求是這樣的: 

POST http://www.example.com HTTP/1.1 
Content-Type: text/xml 

<!--?xml version="1.0"?--> 
<methodcall> 
    <methodname>examples.getStateName</methodname> 
    <params> 
        <param> 
            <value><i4>41</i4></value> 
         
    </params> 
</methodcall> 
XML-RPC 協議簡單、功能夠用,各種語言的實現都有。它的使用也很廣泛,如 WordPress 的 XML-RPC Api,搜索引擎的 ping 服務等等。JavaScript 中,也有現成的庫支持以這種方式進行數據交互,能很好的支持已有的 XML-RPC 服務。

 

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