轻松搞定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 相关文章推荐
原生Aajax 和jQuery Ajax 写法个人总结
Mar 24 jQuery
jquery中关于bind()方法的使用技巧分享
Mar 30 jQuery
bootstrap+jQuery 实现下拉菜单中复选框全选和全不选效果
Jun 12 jQuery
使用jQuery实现购物车结算功能
Aug 15 jQuery
jQuery简单判断值是否存在于数组中的方法示例
Apr 17 jQuery
通过jquery.cookie.js实现记住用户名、密码登录功能
Jun 20 jQuery
jquery ajax加载数据前台渲染方式 不用for遍历的方法
Aug 09 jQuery
jQuery实现的模仿雨滴下落动画效果
Dec 11 jQuery
jQuery判断自定义属性data-val用法示例
Jan 07 jQuery
jquery实现垂直无限轮播的方法分析
Jul 16 jQuery
jquery使用echarts实现有向图可视化功能示例
Nov 25 jQuery
jQuery 移除事件的方法
Jun 20 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遍历文件夹下的所有文件和子文件夹示例
2014/03/20 PHP
Laravel框架中扩展函数、扩展自定义类的方法
2014/09/04 PHP
php简单实现查询数据库返回json数据
2015/04/16 PHP
微信公众号支付之坑:调用支付jsapi缺少参数 timeStamp等错误解决方法
2016/01/12 PHP
PHP实现验证码校验功能
2017/11/16 PHP
php获取手机端的号码以及ip地址实例代码
2018/09/12 PHP
PHP设计模式(六)桥连模式Bridge实例详解【结构型】
2020/05/02 PHP
jQuery 1.5.1 发布,全面支持IE9 修复大量bug
2011/02/26 Javascript
关于onScroll事件在IE6下每次滚动触发三次bug说明
2011/09/21 Javascript
圣诞节Merry Christmas给博客添加浪漫的下雪效果基于jquery实现
2012/12/27 Javascript
Javascript 命名空间模式
2013/11/01 Javascript
JS两种定义方式的区别、内部原理
2013/11/21 Javascript
Js操作树节点自动折叠展开的几种方法
2014/05/05 Javascript
wap手机图片滑动切换特效无css3元素js脚本编写
2014/07/28 Javascript
如何在node的express中使用socket.io
2014/12/15 Javascript
JavaScript实现身份证验证代码
2016/02/17 Javascript
Bootstrap4一次重大更新 几乎涉及每行代码
2016/05/16 Javascript
关于jQuery库冲突的完美解决办法
2017/05/20 jQuery
详解让sublime text3支持Vue语法高亮显示的示例
2017/09/29 Javascript
vue移动端屏幕适配详解
2019/04/30 Javascript
python利用hook技术破解https的实例代码
2013/03/25 Python
python 文件操作api(文件操作函数)
2016/08/28 Python
python numpy格式化打印的实例
2018/05/14 Python
Ubuntu下Python2与Python3的共存问题
2018/10/31 Python
Python 调用PIL库失败的解决方法
2019/01/08 Python
python实现的多任务版udp聊天器功能案例
2019/11/13 Python
python之列表推导式的用法
2019/11/29 Python
用HTML5实现网站在windows8中贴靠的方法
2013/04/21 HTML / CSS
使用HTML5做个画图板的方法介绍
2013/05/03 HTML / CSS
世界领先的以旅馆为主的在线预订平台:Hostelworld
2016/10/09 全球购物
BONIA官方网站:国际奢侈品牌和皮革专家
2016/11/27 全球购物
C语言50道问题
2014/10/23 面试题
个人四风问题对照检查材料
2014/09/26 职场文书
幼儿园毕业致辞
2015/07/29 职场文书
学雷锋主题班会教案
2015/08/13 职场文书
HR必备:销售经理聘用合同范本
2019/08/21 职场文书