轻松搞定jQuery+JSONP跨域请求的解决方案


Posted in jQuery onMarch 06, 2018

JSONP(JSON with Padding)是JSON的一种“使用模式”,可用于解决主流浏览器的跨域数据访问的问题。由于同源策略,一般来说位于 server1.example.com 的网页无法与不是 server1.example.com的服务器沟通,而 HTML 的<script> 元素是一个例外。利用 <script> 元素的这个开放策略,网页可以得到从其他来源动态产生的 JSON 资料,而这种使用模式就是所谓的 JSONP。用 JSONP 抓到的资料并不是 JSON,而是任意的JavaScript,用 JavaScript 直译器执行而不是用 JSON 解析器解析。

  上面一段话来自百度百科,概念永远是那么抽象难懂,看例子才是最直观的表现。例子看的多了,领悟到那个点了,自然自己也会学着抽象的描述了。这就是为什么常说“学习知识是从薄到厚,又由厚到薄的过程”。好了扯远了。下面直接来看一个例子。

 轻松搞定jQuery+JSONP跨域请求的解决方案

  问题:本地现有一个页面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);
  }
}

至此,便成功解决了问题。

轻松搞定jQuery+JSONP跨域请求的解决方案

 思考:如果服务端已经写死了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>");
    }
  }
});
jQuery 相关文章推荐
jQuery实现鼠标滑过预览图片大图效果的方法
Apr 26 jQuery
jquery中封装函数传递当前元素的方法示例
May 05 jQuery
jQuery实现动态删除LI的方法
May 30 jQuery
jQuery插件DataTables分页开发心得体会
Aug 22 jQuery
jQuery动态添加li标签并添加属性和绑定事件方法
Feb 24 jQuery
jQuery实现表单动态加减、ajax表单提交功能
Jun 08 jQuery
jQuery利用FormData上传文件实现批量上传
Dec 04 jQuery
JQuery特殊效果和链式调用操作示例
May 13 jQuery
jquery 验证用户名是否重复代码实例
May 14 jQuery
jQuery实现的解析本地 XML 文档操作示例
Apr 30 jQuery
jquery实现异步文件上传ajaxfileupload.js
Oct 23 jQuery
jquery实现穿梭框功能
Jan 19 jQuery
jQuery实现左右滑动的toggle方法
Mar 03 #jQuery
jquery radio 动态控制选中失效问题的解决方法
Feb 28 #jQuery
详解jQuery中的isPlainObject()使用方法
Feb 27 #jQuery
jQuery幻灯片插件owlcarousel参数说明中文文档
Feb 27 #jQuery
jQuery实现碰到边缘反弹的动画效果
Feb 24 #jQuery
jQuery 改变P标签文本值方法
Feb 24 #jQuery
jQuery实现标签子元素的添加和赋值方法
Feb 24 #jQuery
You might like
PHP新手上路(七)
2006/10/09 PHP
PHP中static关键字原理的学习研究分析
2011/07/18 PHP
2014过年倒计时示例
2014/01/31 PHP
PHP把小数转成整数3种方法
2014/06/30 PHP
PHP基于yii框架实现生成ICO图标
2015/11/13 PHP
网页图片延时加载的js代码
2010/04/22 Javascript
异步javascript的原理和实现技巧介绍
2012/11/08 Javascript
JS特殊函数(Function()构造函数、函数直接量)区别介绍
2013/05/19 Javascript
JavaScript异步编程:异步数据收集的具体方法
2013/08/19 Javascript
js 时间函数应用加、减、比较、格式转换的示例代码
2013/08/23 Javascript
JavaScript将数组转换成CSV格式的方法
2015/03/19 Javascript
jQuery使用before()和after()在元素前后添加内容的方法
2015/03/26 Javascript
javascript冒泡排序小结
2016/04/10 Javascript
原生JS实现风箱式demo,并封装了一个运动框架(实例代码)
2016/07/22 Javascript
JavaScript 继承详解(五)
2016/10/11 Javascript
Bootstrap源码解读表单(2)
2016/12/22 Javascript
JS+HTML5实现图片在线预览功能
2017/07/22 Javascript
JavaScript代码判断输入的字符串是否含有特殊字符和表情代码实例
2017/08/17 Javascript
node 使用 async 控制并发的方法
2018/05/07 Javascript
vue 循环加载数据并获取第一条记录的方法
2018/09/26 Javascript
微信公众号平台接口开发 获取access_token过程解析
2019/08/14 Javascript
vue.js 输入框输入值自动过滤特殊字符替换中问标点操作
2020/08/31 Javascript
Python 调用DLL操作抄表机
2009/01/12 Python
Python Flask-web表单使用详解
2017/11/18 Python
Python使用Turtle模块绘制五星红旗代码示例
2017/12/11 Python
python opencv实现切变换 不裁减图片
2018/07/26 Python
详解利用python+opencv识别图片中的圆形(霍夫变换)
2019/07/01 Python
Python3中的最大整数和最大浮点数实例
2019/07/09 Python
django fernet fields字段加密实践详解
2019/08/12 Python
大学学年自我鉴定
2013/10/28 职场文书
给海归自荐信的建议
2013/12/13 职场文书
外企财务年会演讲稿
2014/01/03 职场文书
读书月活动方案
2014/05/22 职场文书
2014年小学教师工作自我评价
2014/09/22 职场文书
2016幼儿园新学期寄语
2015/12/03 职场文书
python和C/C++混合编程之使用ctypes调用 C/C++的dll
2022/04/29 Python