国产探花免费观看_亚洲丰满少妇自慰呻吟_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>");    }  }});
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 石城县| 昌都县| 泸溪县| 南丹县| 四会市| 汝南县| 焦作市| 盐城市| 五峰| 鸡东县| 香港| 衡水市| 漳平市| 新龙县| 宁强县| 西充县| 丹江口市| 三亚市| 朝阳区| 庄浪县| 广昌县| 平顺县| 临汾市| 双峰县| 宜丰县| 汉阴县| 永仁县| 东台市| 灌云县| 日照市| 开封县| 怀远县| 文水县| 汉源县| 兴国县| 宜城市| 南雄市| 屯门区| 济南市| 徐汇区| 确山县|