最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

AJAX跨域請求之JSONP獲取JSON數(shù)據(jù)

 更新時(shí)間:2015年09月24日 16:06:19   投稿:mrr  
JSONP(JSON with Padding)是一個(gè)非官方的協(xié)議,它允許在服務(wù)器端集成Script tags返回至客戶端,通過javascript callback的形式實(shí)現(xiàn)跨域訪問(這僅僅是JSONP簡單的實(shí)現(xiàn)形式)。

Asynchronous JavaScript and XML (Ajax ) 是驅(qū)動新一代 Web 站點(diǎn)(流行術(shù)語為 Web 2.0 站點(diǎn))的關(guān)鍵技術(shù)。Ajax 允許在不干擾 Web 應(yīng)用程序的顯示和行為的情況下在后臺進(jìn)行數(shù)據(jù)檢索。使用 XMLHttpRequest 函數(shù)獲取數(shù)據(jù),它是一種 API,允許客戶端 JavaScript 通過 HTTP 連接到遠(yuǎn)程服務(wù)器。Ajax 也是許多 mashup 的驅(qū)動力,它可將來自多個(gè)地方的內(nèi)容集成為單一 Web 應(yīng)用程序。

不過,由于受到瀏覽器的限制,該方法不允許跨域通信。如果嘗試從不同的域請求數(shù)據(jù),會出現(xiàn)安全錯(cuò)誤。如果能控制數(shù) 據(jù)駐留的遠(yuǎn)程服務(wù)器并且每個(gè)請求都前往同一域,就可以避免這些安全錯(cuò)誤。但是,如果僅停留在自己的服務(wù)器上,Web 應(yīng)用程序還有什么用處呢?如果需要從多個(gè)第三方服務(wù)器收集數(shù)據(jù)時(shí),又該怎么辦?

理解同源策略限制

同源策略阻止從一個(gè)域上加載的腳本獲取或操作另一個(gè)域上的文檔屬性。也就是說,受到請求的 URL 的域必須與當(dāng)前 Web 頁面的域相同。這意味著瀏覽器隔離來自不同源的內(nèi)容,以防止它們之間的操作。這個(gè)瀏覽器策略很舊,從 Netscape Navigator 2.0 版本開始就存在。

克服該限制的一個(gè)相對簡單的方法是讓 Web 頁面向它源自的 Web 服務(wù)器請求數(shù)據(jù),并且讓 Web 服務(wù)器像代理一樣將請求轉(zhuǎn)發(fā)給真正的第三方服務(wù)器。盡管該技術(shù)獲得了普遍使用,但它是不可伸縮的。另一種方式是使用框架要素在當(dāng)前 Web 頁面中創(chuàng)建新區(qū)域,并且使用 GET 請求獲取任何第三方資源。不過,獲取資源后,框架中的內(nèi)容會受到同源策略的限制。

克服該限制更理想方法是在 Web 頁面中插入動態(tài)腳本元素,該頁面源指向其他域中的服務(wù) URL 并且在自身腳本中獲取數(shù)據(jù)。腳本加載時(shí)它開始執(zhí)行。該方法是可行的,因?yàn)橥床呗圆蛔柚箘討B(tài)腳本插入,并且將腳本看作是從提供 Web 頁面的域上加載的。但如果該腳本嘗試從另一個(gè)域上加載文檔,就不會成功。幸運(yùn)的是,通過添加 JavaScript Object Notation (JSON) 可以改進(jìn)該技術(shù)。

1、什么是JSONP?

要了解JSONP,不得不提一下JSON,那么什么是JSON ?

JSON is a subset of the object literal notation of JavaScript. Since JSON is a subset of JavaScript, it can be used in the language with no muss or fuss.

JSONP(JSON with Padding)是一個(gè)非官方的協(xié)議,它允許在服務(wù)器端集成Script tags返回至客戶端,通過javascript callback的形式實(shí)現(xiàn)跨域訪問(這僅僅是JSONP簡單的實(shí)現(xiàn)形式)。

2、JSONP有什么用?

由于同源策略的限制,XmlHttpRequest只允許請求當(dāng)前源(域名、協(xié)議、端口)的資源,為了實(shí)現(xiàn)跨域請求,可以通過script標(biāo)簽實(shí)現(xiàn)跨域請求,然后在服務(wù)端輸出JSON數(shù)據(jù)并執(zhí)行回調(diào)函數(shù),從而解決了跨域的數(shù)據(jù)請求。

3、如何使用JSONP?

下邊這一DEMO實(shí)際上是JSONP的簡單表現(xiàn)形式,在客戶端聲明回調(diào)函數(shù)之后,客戶端通過script標(biāo)簽向服務(wù)器跨域請求數(shù)據(jù),然后服務(wù)端返回相應(yīng)的數(shù)據(jù)并動態(tài)執(zhí)行回調(diào)函數(shù)。

HTML代碼 (任一 ):

<meta content="text/html; charset=utf-8" http-equiv="Content-Type" /> 
<script type="text/javascript"> 
  function jsonpCallback(result) { 
    //alert(result); 
    for(var i in result) { 
      alert(i+":"+result[i]);//循環(huán)輸出a:1,b:2,etc. 
    } 
  } 
  var JSONP=document.createElement("script"); 
  JSONP.type="text/javascript"; 
  JSONP.src="http://crossdomain.com/services.php?callback=jsonpCallback"; 
  document.getElementsByTagName("head")[0].appendChild(JSONP); 
</script> 


或者

Html代碼

<meta content="text/html; charset=utf-8" http-equiv="Content-Type" /> 
<script type="text/javascript"> 
  function jsonpCallback(result) { 
    alert(result.a); 
    alert(result.b); 
    alert(result.c); 
    for(var i in result) { 
      alert(i+":"+result[i]);//循環(huán)輸出a:1,b:2,etc. 
    } 
  } 
</script> 

<script type="text/javascript" src="http://crossdomain.com/services.php?callback=jsonpCallback"></script>

JavaScript的鏈接,必須在function的下面。

服務(wù)端PHP代碼 (services.php):

<?php 
//服務(wù)端返回JSON數(shù)據(jù) 
$arr=array('a'=>1,'b'=>2,'c'=>3,'d'=>4,'e'=>5); 
$result=json_encode($arr); 
//echo $_GET['callback'].'("Hello,World!")'; 
//echo $_GET['callback']."($result)"; 
//動態(tài)執(zhí)行回調(diào)函數(shù) 
$callback=$_GET['callback']; 
echo $callback."($result)"; 

如果將上述JS客戶端代碼用jQuery的方法來實(shí)現(xiàn),也非常簡單。

$.getJSON
$.ajax
$.get

客戶端JS代碼在jQuery中的實(shí)現(xiàn)方式1:

Js代碼

<script type="text/javascript" src="jquery.js"></script> 
<script type="text/javascript"> 
  $.getJSON("http://crossdomain.com/services.php?callback=?", 
  function(result) { 
    for(var i in result) { 
      alert(i+":"+result[i]);//循環(huán)輸出a:1,b:2,etc. 
    } 
  }); 
</script> 

客戶端JS代碼在jQuery中的實(shí)現(xiàn)方式2:

Js代碼

<script type="text/javascript" src="jquery.js"></script> 
<script type="text/javascript"> 
  $.ajax({ 
    url:"http://crossdomain.com/services.php", 
    dataType:'jsonp', 
    data:'', 
    jsonp:'callback', 
    success:function(result) { 
      for(var i in result) { 
        alert(i+":"+result[i]);//循環(huán)輸出a:1,b:2,etc. 
      } 
    }, 
    timeout:3000 
  }); 
</script> 

客戶端JS代碼在jQuery中的實(shí)現(xiàn)方式3:

Js代碼 

<script type="text/javascript" src="jquery.js"></script> 
<script type="text/javascript"> 
  $.get('http://crossdomain.com/services.php?callback=?', {name: encodeURIComponent('tester')}, function (json) { for(var i in json) alert(i+":"+json[i]); }, 'jsonp'); 
</script> 

其中 jsonCallback 是客戶端注冊的,獲取 跨域服務(wù)器 上的json數(shù)據(jù) 后,回調(diào)的函數(shù)。
http://crossdomain.com/services.php?callback=jsonpCallback
這個(gè) url 是跨域服務(wù) 器取 json 數(shù)據(jù)的接口,參數(shù)為回調(diào)函數(shù)的名字,返回的格式為

Js代碼 

jsonpCallback({msg:'this is json data'}) 

Jsonp原理:

首先在客戶端注冊一個(gè)callback, 然后把callback的名字傳給服務(wù)器。

此時(shí),服務(wù)器先生成 json 數(shù)據(jù)。

然后以 javascript 語法的方式,生成一個(gè)function , function 名字就是傳遞上來的參數(shù) jsonp.

最后將 json 數(shù)據(jù)直接以入?yún)⒌姆绞剑胖玫?function 中,這樣就生成了一段 js 語法的文檔,返回給客戶端。

客戶端瀏覽器,解析script標(biāo)簽,并執(zhí)行返回的 javascript 文檔,此時(shí)數(shù)據(jù)作為參數(shù),傳入到了客戶端預(yù)先定義好的 callback 函數(shù)里.(動態(tài)執(zhí)行回調(diào)函數(shù))

使用JSON的優(yōu)點(diǎn)在于:

比XML輕了很多,沒有那么多冗余的東西。

JSON也是具有很好的可讀性的,但是通常返回的都是壓縮過后的。不像XML這樣的瀏覽器可以直接顯示,瀏覽器對于JSON的格式化的顯示就需要借助一些插件了。

在JavaScript中處理JSON很簡單。

其他語言例如PHP對于JSON的支持也不錯(cuò)。

JSON也有一些劣勢:

JSON在服務(wù)端語言的支持不像XML那么廣泛,不過JSON.org上提供很多語言的庫。

如果你使用eval()來解析的話,會容易出現(xiàn)安全問題。

盡管如此,JSON的優(yōu)點(diǎn)還是很明顯的。他是Ajax數(shù)據(jù)交互的很理想的數(shù)據(jù)格式。 

主要提示:

JSONP 是構(gòu)建 mashup 的強(qiáng)大技術(shù),但不幸的是,它并不是所有跨域通信需求的萬靈藥。它有一些缺陷,在提交開發(fā)資源之前必須認(rèn)真考慮它們。

第一,也是最重要的一點(diǎn),沒有關(guān)于 JSONP 調(diào)用的錯(cuò)誤處理。如果動態(tài)腳本插入有效,就執(zhí)行調(diào)用;如果無效,就靜默失敗。失敗是沒有任何提示的。例如,不能從服務(wù)器捕捉到 404 錯(cuò)誤,也不能取消或重新開始請求。不過,等待一段時(shí)間還沒有響應(yīng)的話,就不用理它了。(未來的 jQuery 版本可能有終止 JSONP 請求的特性)。

JSONP 的另一個(gè)主要缺陷是被不信任的服務(wù)使用時(shí)會很危險(xiǎn)。因?yàn)?JSONP 服務(wù)返回打包在函數(shù)調(diào)用中的 JSON 響應(yīng),而函數(shù)調(diào)用是由瀏覽器執(zhí)行的,這使宿主 Web 應(yīng)用程序更容易受到各類攻擊。如果打算使用 JSONP 服務(wù),了解它能造成的威脅非常重要。

相關(guān)文章

  • 使用AjaxFileUpload.js實(shí)現(xiàn)異步文件上傳示例

    使用AjaxFileUpload.js實(shí)現(xiàn)異步文件上傳示例

    AjaxFilleUpload.js可以使得我們不用去管理Iframe的一系列操作,也不用影響我們的頁面結(jié)構(gòu),實(shí)現(xiàn)異步的文件提交
    2014-05-05
  • 利用ajax提交form表單到數(shù)據(jù)庫詳解(無刷新)

    利用ajax提交form表單到數(shù)據(jù)庫詳解(無刷新)

    這篇文章主要給大家介紹了關(guān)于利用ajax提交form表單到數(shù)據(jù)庫(無刷新)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-02-02
  • Ajax返回值類型與用法實(shí)例分析

    Ajax返回值類型與用法實(shí)例分析

    這篇文章主要介紹了Ajax返回值類型與用法,結(jié)合實(shí)例形式分析了ajax返回值的xml類型與文本類型詳細(xì)分類、用法與相關(guān)操作注意事項(xiàng),需要的朋友可以參考下
    2019-07-07
  • 使用AJAX異步通信技術(shù)實(shí)現(xiàn)搜索聯(lián)想和自動補(bǔ)全示例

    使用AJAX異步通信技術(shù)實(shí)現(xiàn)搜索聯(lián)想和自動補(bǔ)全示例

    這篇文章主要介紹了使用AJAX異步通信技術(shù)實(shí)現(xiàn)搜索聯(lián)想和自動補(bǔ)全示例,AJAX是前后臺交互的能? 也就是我們客戶端給服務(wù)端發(fā)送消息的?具,以及接受響應(yīng)的?具,需要的朋友可以參考下
    2023-05-05
  • 淺談ajax請求技術(shù)

    淺談ajax請求技術(shù)

    下面小編就為大家?guī)硪黄獪\談ajax請求技術(shù)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-07-07
  • JQuery中$.ajax()方法參數(shù)詳解

    JQuery中$.ajax()方法參數(shù)詳解

    AJAX即“Asynchronous Javascript And XML”(異步JavaScript和XML),是指一種創(chuàng)建交互式網(wǎng)頁應(yīng)用的網(wǎng)頁開發(fā)技術(shù)。本文跟大家介紹JQuery中$.ajax()方法參數(shù)詳解,小伙伴們一起學(xué)習(xí)吧
    2015-10-10
  • Ajax+js實(shí)現(xiàn)異步交互

    Ajax+js實(shí)現(xiàn)異步交互

    本文給大家分享的是原生javascript結(jié)合ajax實(shí)現(xiàn)的異步交互的方法和代碼,非常的簡單實(shí)用,有需要的小伙伴可以參考下。
    2016-01-01
  • Ajax發(fā)送和接收二進(jìn)制字節(jié)流數(shù)據(jù)的方法

    Ajax發(fā)送和接收二進(jìn)制字節(jié)流數(shù)據(jù)的方法

    這篇文章主要介紹了Ajax發(fā)送和接收二進(jìn)制字節(jié)流數(shù)據(jù)的方法,非常不錯(cuò),具有參考借鑒價(jià)值,感興趣的朋友一起看看吧
    2016-05-05
  • 一個(gè)Ajax類

    一個(gè)Ajax類

    一個(gè)Ajax類...
    2006-12-12
  • Ajax加載菊花loding效果

    Ajax加載菊花loding效果

    這篇文章主要介紹了Ajax加載菊花loding效果的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-07-07

最新評論

紫阳县| 周至县| 额敏县| 祁连县| 富平县| 沁阳市| 门头沟区| 沧源| 兴安县| 香格里拉县| 鹤壁市| 壤塘县| 麻栗坡县| 南京市| 黄山市| 清流县| 临桂县| 德兴市| 土默特左旗| 咸宁市| 佛坪县| 大新县| 黄冈市| 兴城市| 河津市| 香河县| 商洛市| 周宁县| 顺义区| 筠连县| 海伦市| 清水县| 莒南县| 庄浪县| 阳曲县| 墨脱县| 崇仁县| 彭阳县| 祁门县| 潜江市| 武冈市|