轻松搞定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编写textarea输入字数限制代码
Mar 23 jQuery
jquery实现tab键进行选择后enter键触发click行为
Mar 29 jQuery
使用jQuery ajaxupload插件实现无刷新上传文件
Apr 23 jQuery
jQuery树插件zTree使用方法详解
May 02 jQuery
jQuery+SpringMVC中的复选框选择与传值实例
Jan 08 jQuery
jQuery插件实现弹性运动完整示例
Jul 07 jQuery
jQuery实现点击图标div循环放大缩小功能
Sep 30 jQuery
jquery拖拽自动排序插件使用方法详解
Jul 20 jQuery
解决jquery validate 验证不通过后验证正确的信息仍残留在label上的方法
Aug 27 jQuery
使用jQuery实现掷骰子游戏
Oct 24 jQuery
jQuery 选择方法及$(this)用法实例分析
May 19 jQuery
jQuery实现简单评论区功能
Oct 26 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简单封装了一些常用JS操作
2007/02/25 PHP
PHPThumb图片处理实例
2014/05/03 PHP
PHP中Fatal error session_start()错误解决步骤
2014/08/05 PHP
8个PHP程序员常用的功能汇总
2014/12/18 PHP
Yii使用DeleteAll连表删除出现报错问题的解决方法
2016/07/14 PHP
PHP更安全的密码加密机制Bcrypt详解
2017/06/18 PHP
PHP hex2bin()函数用法讲解
2019/02/25 PHP
jQuery 隔行换色 支持键盘上下键,按Enter选定值
2009/08/02 Javascript
使用jQuery的将桌面应用程序引入浏览器
2010/11/19 Javascript
nodejs npm install全局安装和本地安装的区别
2014/06/05 NodeJs
60个很实用的jQuery代码开发技巧收集
2014/12/15 Javascript
javascript十六进制及二进制转化的方法
2015/05/06 Javascript
window.onerror()的用法与实例分析
2016/01/27 Javascript
ES6的新特性概览
2016/03/10 Javascript
如何通过js实现图片预览功能【附实例代码】
2016/03/30 Javascript
带有定位当前位置的百度地图前端web api实例代码
2016/06/21 Javascript
jQuery autoComplete插件两种使用方式及动态改变参数值的方法详解
2016/10/24 Javascript
bootstrap滚动监控器使用方法解析
2017/01/13 Javascript
JavaScript中捕获与冒泡详解及实例
2017/02/03 Javascript
Node.js  REPL (交互式解释器)实例详解
2017/08/06 Javascript
JS基于设计模式中的单例模式(Singleton)实现封装对数据增删改查功能
2018/02/06 Javascript
axios使用拦截器统一处理所有的http请求的方法
2018/11/02 Javascript
详解微信小程序框架wepy踩坑记录(与vue对比)
2019/03/12 Javascript
详解Vue 换肤方案验证
2019/08/28 Javascript
[57:22]2018DOTA2亚洲邀请赛 4.7总决赛 LGD vs Mineski 第五场
2018/04/10 DOTA
python分析nignx访问日志脚本分享
2015/02/26 Python
判断python对象是否可调用的三种方式及其区别详解
2019/01/31 Python
MxNet预训练模型到Pytorch模型的转换方式
2020/05/25 Python
pycharm最新激活码有效期至2100年(亲测可用)
2021/02/05 Python
CSS3 网页下拉菜单代码解释 中文翻译
2010/02/27 HTML / CSS
意大利会呼吸的鞋:Geox健乐士
2017/02/12 全球购物
英国领先的葡萄酒专家:Majestic Wine
2017/05/30 全球购物
阿联酋手表和配饰购物网站:Rivolishop
2019/11/25 全球购物
2014年变电站工作总结
2014/12/19 职场文书
2015年后备干部工作总结
2015/05/15 职场文书
JavaScript实现显示和隐藏图片
2021/04/29 Javascript