說到AJAX就會不可避免的面臨兩個問題,第一個是AJAX以何種格式來交換數據?第二個是跨域的需求如何解決魁亦?這兩個問題目前都有不同的解決方案牛郑,比如數據可以用自定義字符串或者用XML來描述,跨域可以通過服務器端代理來解決签财。
但到目前為止最被推崇或者說首選的方案還是用JSON來傳數據串慰,靠JSONP來跨域。而這就是本文將要講述的內容唱蒸。
什么是JSON邦鲫?
前面簡單說了一下,JSON是一種基于文本的數據交換方式神汹,或者叫做數據描述格式掂碱,你是否該選用他首先肯定要關注它所擁有的優(yōu)點怜姿。
**JSON的優(yōu)點:**
1、基于純文本疼燥,跨平臺傳遞極其簡單沧卢;
2、Javascript原生支持醉者,后臺語言幾乎全部支持但狭;
3、輕量級數據格式撬即,占用字符數量極少立磁,特別適合互聯網傳遞;
4剥槐、可讀性較強唱歧,雖然比不上XML那么一目了然,但在合理的依次縮進之后還是很容易識別的粒竖;
5颅崩、容易編寫和解析,當然前提是你要知道數據結構蕊苗;
JSON的缺點當然也有沿后,但在作者看來實在是無關緊要的東西,所以不再單獨說明朽砰。
**JSON的格式或者叫規(guī)則:**
JSON能夠以非常簡單的方式來描述數據結構尖滚,XML能做的它都能做,因此在跨平臺方面兩者完全不分伯仲瞧柔。
1漆弄、JSON只有兩種數據類型描述符,大括號{}和方括號[]造锅,其余英文冒號:是映射符置逻,英文逗號,是分隔符,英文雙引號""是定義符备绽。
2券坞、大括號{}用來描述一組“不同類型的無序鍵值對集合”(每個鍵值對可以理解為OOP的屬性描述),方括號[]用來描述一組“相同類型的有序數據集合”(可對應OOP的數組)肺素。
3恨锚、上述兩種集合中若有多個子項,則通過英文逗號,進行分隔倍靡。
4猴伶、鍵值對以英文冒號:進行分隔,并且建議鍵名都加上英文雙引號"",以便于不同語言的解析他挎。
5筝尾、JSON內部常用數據類型無非就是字符串、數字办桨、布爾筹淫、日期、null 這么幾個呢撞,字符串必須用雙引號引起來损姜,其余的都不用,日期類型比較特殊殊霞,這里就不展開講述了摧阅,只是建議如果客戶端沒有按日期排序功能需求的話,那么把日期時間直接作為字符串傳遞就好绷蹲,可以省去很多麻煩棒卷。
什么是JSONP?
? ? ? ? JSONP(JSON with Padding)是JSON的一種“使用模式”祝钢,可用于解決主流瀏覽器的跨域數據訪問的問題比规。由于同源策略,一般來說位于 server1.example.com 的網頁無法與不是 server1 .example .com的服務器溝通太颤,而 HTML 的script元素是一個例外苞俘。利用scrip元素的這個開放策略盹沈,網頁可以得到從其他來源動態(tài)產生的 JSON 資料龄章,而這種使用模式就是所謂的 JSONP。用 JSONP 抓到的資料并不是 JSON乞封,而是任意的JavaScript做裙,用 JavaScript 直譯器執(zhí)行而不是用 JSON 解析器解析。
其實我對于JSONP的理解還很膚淺肃晚,大概知道這是一個什么概念而已锚贱。別人怎么說都聽不懂,我的理解关串,JSONP就是用< scrip 去引入一個遠端的PHP文件拧廊,然后PHP返回的值封裝成< scrip來應付瀏覽器,成功繞過瀏覽器禁止跨域的數據訪問的條文晋修。雖然路已經通常了吧碾,但是本端和遠端文件還存在相互不認識的問題,所以最簡單的方式是在本端引入PHP文件之前定義一些函數墓卦,這些函數就是專門給遠端PHP用的倦春,敲門磚而已。例如:alert('我是本地函數,可以被跨域的remote.js文件調用睁本,遠程js帶來的數據是:'+data.result);調用者可以傳一個參數過去告訴服務端“我想要一段調用XXX函數的js代碼尿庐,請你返回給我”,于是服務器就可以按照客戶端的需求來生成js腳本并響應了呢堰。
Ajax和JSONP對比:
1抄瑟、ajax和jsonp這兩種技術在調用方式上“看起來”很像,目的也一樣暮胧,都是請求一個url锐借,然后把服務器返回的數據進行處理,因此jquery和ext等框架都把jsonp作為ajax的一種形式進行了封裝往衷;
2钞翔、但ajax和jsonp其實本質上是不同的東西。ajax的核心是通過XmlHttpRequest獲取非本頁內容席舍,而jsonp的核心則是動態(tài)添加標簽來調用服務器提供的js腳本布轿。
3、所以說来颤,其實ajax與jsonp的區(qū)別不在于是否跨域汰扭,ajax通過服務端代理一樣可以實現跨域,jsonp本身也不排斥同域的數據的獲取福铅。
4萝毛、還有就是,jsonp是一種方式或者說非強制性協議滑黔,如同ajax一樣笆包,它也不一定非要用json格式來傳遞數據,如果你愿意略荡,字符串都行庵佣,只不過這樣不利于用jsonp提供公開服務。