轻松搞定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实现动态添加、删除按钮及input输入框的方法
Apr 27 jQuery
jquery实现一个全局计时器(商城可用)
Jun 30 jQuery
jQuery实现html table行Tr的复制、删除、计算功能
Jul 10 jQuery
jQuery实现的表格前端排序功能示例
Sep 18 jQuery
jquery鼠标悬停导航下划线滑出效果
Sep 29 jQuery
jQuery响应滚动条事件功能示例
Oct 14 jQuery
基于jQuery的$.getScript方法去加载javaScript文档解析
Nov 08 jQuery
jquery在启动页面时,自动加载数据的实例
Jan 22 jQuery
基于jquery实现九宫格拼图小游戏
Nov 30 jQuery
jQuery实现的简单日历组件定义与用法示例
Dec 24 jQuery
layui+jquery支持IE8的表格分页方法
Sep 28 jQuery
jQuery实现鼠标拖拽登录框移动效果
Sep 13 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
深入file_get_contents与curl函数的详解
2013/06/25 PHP
php fread读取文件注意事项
2016/09/24 PHP
php基于数组函数实现关联表的编辑操作示例
2017/07/04 PHP
laravel unique验证、确认密码confirmed验证以及密码修改验证的方法
2019/10/16 PHP
限制文本字节数js代码
2007/03/06 Javascript
js 函数的副作用分析
2011/08/23 Javascript
jquery实现点击TreeView文本父节点展开/折叠子节点
2013/01/10 Javascript
Jquery实现点击切换图片并隐藏显示内容(2种方法实现)
2013/04/11 Javascript
jQuery队列操作方法实例
2014/06/11 Javascript
jquery移动节点实例
2015/01/14 Javascript
jQuery扁平化风格下拉框美化插件FancySelect使用指南
2015/02/10 Javascript
js一维数组、多维数组和对象的混合使用方法
2016/04/03 Javascript
Actionscript与javascript交互实例程序(修改)
2016/09/22 Javascript
javascript中replace使用方法总结
2017/03/01 Javascript
Angularjs中使用指令绑定点击事件的方法
2017/03/30 Javascript
详解React Native 屏幕适配(炒鸡简单的方法)
2018/06/11 Javascript
vue  自定义组件实现通讯录功能
2018/09/30 Javascript
react用Redux中央仓库实现一个todolist
2019/09/29 Javascript
js实现3D照片墙效果
2019/10/28 Javascript
Node Express用法详解【安装、使用、路由、中间件、模板引擎等】
2020/05/13 Javascript
基于vue+element实现全局loading过程详解
2020/07/10 Javascript
Django集成百度富文本编辑器uEditor攻略
2014/07/04 Python
浅谈Python生成器generator之next和send的运行流程(详解)
2017/05/08 Python
Python 实现使用dict 创建二维数据、DataFrame
2018/04/13 Python
python opencv人脸检测提取及保存方法
2018/08/03 Python
python实现爬山算法的思路详解
2019/04/09 Python
基于Python fminunc 的替代方法
2020/02/29 Python
音频处理 windows10下python三方库librosa安装教程
2020/06/20 Python
美国一站式电动和手动工具商店:International Tool
2020/11/26 全球购物
屈臣氏越南官网:Watsons越南
2021/01/14 全球购物
会议主持词开场白
2015/05/28 职场文书
山楂树之恋观后感
2015/06/11 职场文书
学子宴致辞大全
2015/07/27 职场文书
elasticSearch-api的具体操作步骤讲解
2021/06/28 Java/Android
解决ObjectMapper.convertValue() 遇到的一些问题
2021/06/30 Java/Android
MySQL一劳永逸永久支持输入中文的方法实例
2022/08/05 MySQL