日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

跨域 文本

發布時間:2025/4/16 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 跨域 文本 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

AJAX 跨域請求 - JSONP獲取JSON數據

博客分類:
  • ?
  • Javascript /Jquery / Bootstrap / Web

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

?

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

?

理解同源策略限制

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

?

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

?

克服該限制更理想方法是在 Web 頁面中插入動態腳本元素,該頁面源指向其他域中的服務 URL 并且在自身腳本中獲取數據。腳本加載時它開始執行。該方法是可行的,因為同源策略不阻止動態腳本插入,并且將腳本看作是從提供 Web 頁面的域上加載的。但如果該腳本嘗試從另一個域上加載文檔,就不會成功。幸運的是,通過添加 JavaScript Object Notation (JSON) 可以改進該技術。

?

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)是一個非官方的協議,它允許在服務器端集成Script tags返回至客戶端,通過javascript callback的形式實現跨域訪問(這僅僅是JSONP簡單的實現形式)。

?

2、JSONP有什么用?

由于同源策略的限制,XmlHttpRequest只允許請求當前源(域名、協議、端口)的資源,為了實現跨域請求,可以通過script標簽實現跨域請求,然后在服務端輸出JSON數據并執行回調函數,從而解決了跨域的數據請求。

?

3、如何使用JSONP?

下邊這一DEMO實際上是JSONP的簡單表現形式,在客戶端聲明回調函數之后,客戶端通過script標簽向服務器跨域請求數據,然后服務端返回相應的數據并動態執行回調函數。

?

HTML代碼 (任一?):

?

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]);//循環輸出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]);//循環輸出a:1,b:2,etc.??
  • ????????}??
  • ????}??
  • </script>??
  • <script?type="text/javascript"?src="http://crossdomain.com/services.php?callback=jsonpCallback"></script>??
  • ?

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

    ?

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

    ?

    Php代碼??
  • <?php??
  • ??
  • //服務端返回JSON數據??
  • $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)";??
  • //動態執行回調函數??
  • $callback=$_GET['callback'];??
  • echo?$callback."($result)";??
  • ?

    如果將上述JS客戶端代碼用jQuery的方法來實現,也非常簡單。

    ?

    $.getJSON
    $.ajax
    $.get

    ?

    客戶端JS代碼在jQuery中的實現方式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]);//循環輸出a:1,b:2,etc.??
  • ????????}??
  • ????});??
  • </script>??
  • ?

    客戶端JS代碼在jQuery中的實現方式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]);//循環輸出a:1,b:2,etc.??
  • ????????????}??
  • ????????},??
  • ????????timeout:3000??
  • ????});??
  • </script>??
  • ?

    客戶端JS代碼在jQuery中的實現方式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 是客戶端注冊的,獲取?跨域服務器?上的json數據?后,回調的函數。
    http://crossdomain.com/services.php?callback=jsonpCallback
    這個 url 是跨域服務?器取 json 數據的接口,參數為回調函數的名字,返回的格式為

    ?

    Js代碼??
  • jsonpCallback({msg:'this?is?json?data'})??
  • ?

    Jsonp原理:?
    首先在客戶端注冊一個callback, 然后把callback的名字傳給服務器。

    此時,服務器先生成 json 數據。
    然后以 javascript 語法的方式,生成一個function , function 名字就是傳遞上來的參數 jsonp.

    最后將 json 數據直接以入參的方式,放置到 function 中,這樣就生成了一段 js 語法的文檔,返回給客戶端。

    客戶端瀏覽器,解析script標簽,并執行返回的 javascript 文檔,此時數據作為參數,傳入到了客戶端預先定義好的 callback 函數里.(動態執行回調函數)

    ?

    使用JSON的優點在于:

    • 比XML輕了很多,沒有那么多冗余的東西。
    • JSON也是具有很好的可讀性的,但是通常返回的都是壓縮過后的。不像XML這樣的瀏覽器可以直接顯示,瀏覽器對于JSON的格式化的顯示就需要借助一些插件了。
    • 在JavaScript中處理JSON很簡單。
    • 其他語言例如PHP對于JSON的支持也不錯。

    JSON也有一些劣勢:

    • JSON在服務端語言的支持不像XML那么廣泛,不過JSON.org上提供很多語言的庫。
    • 如果你使用eval()來解析的話,會容易出現安全問題。

    盡管如此,JSON的優點還是很明顯的。他是Ajax數據交互的很理想的數據格式。

    ?

    主要提示:

    JSONP 是構建 mashup 的強大技術,但不幸的是,它并不是所有跨域通信需求的萬靈藥。它有一些缺陷,在提交開發資源之前必須認真考慮它們。

    ?

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

    ?

    JSONP 的另一個主要缺陷是被不信任的服務使用時會很危險。因為 JSONP 服務返回打包在函數調用中的 JSON 響應,而函數調用是由瀏覽器執行的,這使宿主 Web 應用程序更容易受到各類攻擊。如果打算使用 JSONP 服務,了解它能造成的威脅非常重要。

    ?

    轉載于:https://www.cnblogs.com/dianzan/p/7366764.html

    總結

    以上是生活随笔為你收集整理的跨域 文本的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。