轻松搞定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接受后台传递的List的实例详解
Aug 02 jQuery
jQuery zTree 异步加载添加子节点重复问题
Nov 29 jQuery
jQuery实现新闻播报滚动及淡入淡出效果示例
Mar 23 jQuery
jQuery中可见性过滤器简单用法示例
Mar 31 jQuery
JS文件中加载jquery.js的实例代码
May 05 jQuery
jQuery实现模糊搜索功能的方法分析
Jun 29 jQuery
jQuery实现的五星点评功能【案例】
Feb 18 jQuery
jQuery操作attr、prop、val()/text()/html()、class属性
May 23 jQuery
JQuery实现简单的复选框树形结构图示例【附源码下载】
Jul 16 jQuery
jQuery实现图片随机切换、抽奖功能(实例代码)
Oct 23 jQuery
jQuery实现的解析本地 XML 文档操作示例
Apr 30 jQuery
jQuery实现可以扩展的日历
Dec 01 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在项目中寻找代码的坏味道(综艺命名)
2012/07/19 PHP
php将session放入memcached的设置方法
2014/02/14 PHP
Thinkphp5.0 框架实现控制器向视图view赋值及视图view取值操作示例
2019/10/12 PHP
JS学习之一个简易的日历控件
2010/03/24 Javascript
jQuery效果 slideToggle() 方法(在隐藏和显示之间切换)
2011/06/28 Javascript
日期处理的js库(迷你版)--自建js库总结
2011/11/21 Javascript
jquery图片轮播插件仿支付宝2013版全屏图片幻灯片
2014/04/03 Javascript
JQuery鼠标移到小图显示大图效果的方法
2015/06/10 Javascript
javascript中类的定义方式详解(四种方式)
2015/12/22 Javascript
Ionic + Angular.js实现图片轮播的方法示例
2017/05/21 Javascript
angular4 如何在全局设置路由跳转动画的方法
2017/08/30 Javascript
Node.js实现连接mysql数据库功能示例
2017/09/15 Javascript
[02:47]3.19DOTA2发布会 国服成长历程回顾
2014/03/25 DOTA
[01:00:26]Ti4主赛事胜者组第一天 EG vs NEWBEE 1
2014/07/19 DOTA
[53:03]Optic vs TNC 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
Python写的一个定时重跑获取数据库数据
2016/12/28 Python
Python内置函数 next的具体使用方法
2017/11/24 Python
解决python ogr shp字段写入中文乱码的问题
2018/12/31 Python
Python基础之循环语句用法示例【for、while循环】
2019/03/23 Python
python爬虫的一个常见简单js反爬详解
2019/07/09 Python
Pytorch 实现自定义参数层的例子
2019/08/17 Python
Pytoch之torchvision.transforms图像变换实例
2019/12/30 Python
解决Pytorch 加载训练好的模型 遇到的error问题
2020/01/10 Python
Pytorch转keras的有效方法,以FlowNet为例讲解
2020/05/26 Python
sklearn的predict_proba使用说明
2020/06/28 Python
使用Python+Appuim 清理微信的方法
2021/01/26 Python
文秘专业自荐信
2013/10/14 职场文书
精彩的广告词
2014/03/19 职场文书
美容院经理岗位职责
2014/04/03 职场文书
《二泉映月》教学反思
2014/04/15 职场文书
经贸日语专业个人求职信范文
2014/04/29 职场文书
会计专业自荐信
2014/06/03 职场文书
小学感恩节活动总结
2015/03/24 职场文书
毕业论文致谢范文
2015/05/14 职场文书
不同意离婚代理词
2015/05/23 职场文书
CSS实现多个元素在盒子内两端对齐效果
2021/03/30 HTML / CSS