国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

輕松搞定jQuery+JSONP跨域請求的解決方案

2019-11-19 14:13:55
字體:
來源:轉載
供稿:網友

  JSONP(JSON with Padding)是JSON的一種“使用模式”,可用于解決主流瀏覽器的跨域數據訪問的問題。由于同源策略,一般來說位于 server1.example.com 的網頁無法與不是 server1.example.com的服務器溝通,而 HTML 的<script> 元素是一個例外。利用 <script> 元素的這個開放策略,網頁可以得到從其他來源動態產生的 JSON 資料,而這種使用模式就是所謂的 JSONP。用 JSONP 抓到的資料并不是 JSON,而是任意的JavaScript,用 JavaScript 直譯器執行而不是用 JSON 解析器解析。

  上面一段話來自百度百科,概念永遠是那么抽象難懂,看例子才是最直觀的表現。例子看的多了,領悟到那個點了,自然自己也會學著抽象的描述了。這就是為什么常說“學習知識是從薄到厚,又由厚到薄的過程”。好了扯遠了。下面直接來看一個例子。

 

  問題:本地現有一個頁面demo.html需要從http://localhost:3561/User/GetAllNames獲取數據并展示。

  解答:由于問題中的兩方不在同一服務器,故需要使用jsonp來跨域訪問。

  ① 客戶端編寫

  客戶端使用jQuery中提供的$.getJson方法來跨域訪問。getJson有3個參數:

    I.   url:請求地址;

    II.  data:發送到服務端的參數;

    III. callback:成功時的回調函數。

  getJson的使用方法和普通的$.get方法基本一致,不同的地方在于getJson需要在url后面的參數部分加上callback=?這一固定部分,jQuery 將自動替換 ? 為正確的函數名,以執行回調函數。然后在回調函數中操作從異域返回的json對象,回調函數callback的參數即為該json對象。

<!DOCTYPE html><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>  <title></title></head><body>  <ul id="nameList"></ul>  <script src="http://cdn.bootcss.com/jquery/1.12.4/jquery.min.js"></script>  <script type="text/javascript">    $.getJSON("http://localhost:3561/User/GetAllNames?callback=?", function(json) {      for (var i = 0; i < json.length; i++) {        $("#nameList").append("<li>" + json[i] + "</li>");      }    });  </script></body></html>
  ② 服務端編寫

  服務端的邏輯主要是將數據序列化為json字符串,然后封裝成"callback(json)"的形式,callback為jQuery自動生成并傳到服務端的函數名稱。下面使用C#實現:

public class UserController : Controller{    public string GetAllNames(string callback)  {    string[] names = new string[] { "張三豐", "張無忌", "令狐沖", "楊過", "郭靖" };    JavaScriptSerializer jss = new JavaScriptSerializer();    string json = jss.Serialize(names);    return string.Format("{0}({1})", callback, json);  }}
  至此,便成功解決了問題。

 思考:如果服務端已經寫死了callback(如:return string.Format("moty({0})", json);),那么客戶端該怎么寫呢?

 參考:

$.ajax("http://localhost:3561/User/GetAllNames", {  jsonpCallback: "moty",  dataType: "jsonp",  success: function(json) {    for (var i = 0; i < json.length; i++) {      $("#nameList").append("<li>" + json[i] + "</li>");    }  }});
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 磐安县| 丰城市| 中江县| 蒲江县| 荔浦县| 长葛市| 六枝特区| 景东| 邵武市| 松潘县| 沅陵县| 蓬溪县| 蒙山县| 吕梁市| 榆社县| 哈尔滨市| 三门峡市| 九龙城区| 岐山县| 桃江县| 松原市| 高台县| 松滋市| 密山市| 延津县| 宝兴县| 肃北| 富川| 赣州市| 永善县| 米易县| 兰考县| 桦甸市| 漳平市| 探索| 石首市| 钟祥市| 苍梧县| 孙吴县| 花垣县| 嵊泗县|