轻松搞定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插件FusionWidgets实现的AngularGauge图效果示例【附demo源码】
Mar 23 jQuery
jQuery动画_动力节点节点Java学院整理
Jul 04 jQuery
jQuery选择器_动力节点Java学院整理
Jul 05 jQuery
运用jQuery写的验证表单(实例讲解)
Jul 06 jQuery
jQuery实现可兼容IE6的滚动监听功能
Sep 20 jQuery
使用jquery Ajax实现上传附件功能
Oct 23 jQuery
jQuery移动端跑马灯抽奖特效升级版(抽奖概率固定)实现方法
Jan 18 jQuery
jquery.pager.js分页实现详解
Jul 29 jQuery
jQuery中DOM操作原则实例分析
Aug 01 jQuery
jQuery擦除插件eraser使用方法详解
Jan 11 jQuery
jquery实现聊天机器人
Feb 08 jQuery
Jquery 获取相同NAME 或者id删除行操作
Aug 24 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 字符串函数收集
2010/03/29 PHP
解析php根据ip查询所在地区(非常有用,赶集网就用到)
2013/07/01 PHP
从JavaScript的函数重名看其初始化方式
2007/03/08 Javascript
jQuery技巧大放送 学习jquery的朋友可以看下
2009/10/14 Javascript
JavaScript中的类继承
2010/11/25 Javascript
php实例分享之实现显示网站运行时间
2014/05/20 Javascript
JavaScript中Math.SQRT2属性的使用详解
2015/06/14 Javascript
JQuery插件Marquee.js实现无缝滚动效果
2016/04/26 Javascript
javascript作用域、作用域链(菜鸟必看)
2016/06/16 Javascript
深入理解AngularJS中的ng-bind-html指令和$sce服务
2016/09/08 Javascript
vue.js指令v-model使用方法
2017/03/20 Javascript
ES6教程之for循环和Map,Set用法分析
2017/04/10 Javascript
浅谈如何使用 webpack 优化资源
2017/10/20 Javascript
vue实现点击选中,其他的不选中方法
2018/09/05 Javascript
详解angular2.x创建项目入门指令
2018/10/11 Javascript
[48:48]2014 DOTA2国际邀请赛中国区预选赛 SPD-GAMING VS Dream TIME
2014/05/21 DOTA
[02:47]2018年度DOTA2最佳辅助位选手4号位-完美盛典
2018/12/17 DOTA
利用soaplib搭建webservice详细步骤和实例代码
2013/11/20 Python
Python中正则表达式的用法实例汇总
2014/08/18 Python
python实现获取客户机上指定文件并传输到服务器的方法
2015/03/16 Python
基于Python实现文件大小输出
2016/01/11 Python
python定向爬取淘宝商品价格
2018/02/27 Python
python使用Pycharm创建一个Django项目
2018/03/05 Python
Python实现的knn算法示例
2018/06/14 Python
Python实现监控键盘鼠标操作示例【基于pyHook与pythoncom模块】
2018/09/04 Python
Linux下Pycharm、Anaconda环境配置及使用踩坑
2018/12/19 Python
对python调用RPC接口的实例详解
2019/01/03 Python
python 通过麦克风录音 生成wav文件的方法
2019/01/09 Python
Python3.5内置模块之os模块、sys模块、shutil模块用法实例分析
2019/04/27 Python
pytorch AvgPool2d函数使用详解
2020/01/03 Python
在tensorflow中设置保存checkpoint的最大数量实例
2020/01/21 Python
Python如何读写二进制数组数据
2020/08/01 Python
什么叫做SQL注入,如何防止
2016/10/04 面试题
医学专业个人求职自荐信格式
2013/09/23 职场文书
学校查摆问题整改措施
2014/09/28 职场文书
店铺转让协议书
2014/12/02 职场文书