轻松搞定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插件FusionCharts绘制2D柱状图和折线图的组合图效果示例【附demo源码】
Apr 10 jQuery
jQuery选择器_动力节点Java学院整理
Jul 05 jQuery
Jquery中.bind()、.live()、.delegate()和.on()之间的区别详解
Aug 01 jQuery
jquery-file-upload 文件上传带进度条效果
Nov 21 jQuery
jquery animate动画持续运动的实例
Nov 29 jQuery
Vue.js 通过jQuery ajax获取数据实现更新后重新渲染页面的方法
Aug 09 jQuery
jQuery实现的响应鼠标移动方向插件用法示例【附源码下载】
Aug 28 jQuery
为jquery的ajax请求添加超时timeout时间的操作方法
Sep 04 jQuery
使用jquery-easyui的布局layout写后台管理页面的代码详解
Jun 19 jQuery
jQuery 选择方法及$(this)用法实例分析
May 19 jQuery
jQuery+ThinkPHP实现图片上传
Jul 23 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 将json格式数据转换成数组的方法
2018/08/21 PHP
PhpSpreadsheet设置单元格常用操作汇总
2020/11/13 PHP
js+FSO遍历文件夹下文件并显示
2007/03/07 Javascript
jQuery 第二课 操作包装集元素代码
2010/03/14 Javascript
javascript 二进制运算技巧解析
2012/11/27 Javascript
NodeJS学习笔记之Connect中间件应用实例
2015/01/27 NodeJs
iframe里使用JavaScript控制主页转向的方法
2015/04/03 Javascript
javascript白色简洁计算器
2015/05/04 Javascript
详解Webwork中Action 调用的方法
2016/02/02 Javascript
jquery插件之文字间歇自动向上滚动效果代码
2016/02/25 Javascript
js实现的下拉框二级联动效果
2016/04/30 Javascript
使用AJAX实现Web页面进度条的实例分享
2016/05/06 Javascript
require.js 加载 vue组件 r.js 合并压缩的实例
2016/10/14 Javascript
async/await地狱该如何避免详解
2018/05/10 Javascript
JavaScript 正则命名分组【推荐】
2018/06/07 Javascript
Node.js动手撸一个静态资源服务器的方法
2019/03/09 Javascript
通过实例解析JavaScript for in及for of区别
2020/06/15 Javascript
[04:53]DOTA2英雄基础教程 祈求者
2014/01/03 DOTA
[50:58]2018DOTA2亚洲邀请赛 4.1 小组赛 B组 Mineski vs EG
2018/04/03 DOTA
Python回调函数用法实例详解
2015/07/02 Python
Python正则简单实例分析
2017/03/21 Python
Python中logging日志库实例详解
2020/02/19 Python
Python如何避免文件同名产生覆盖
2020/06/09 Python
Python3.7安装pyaudio教程解析
2020/07/24 Python
Manjaro、pip、conda更换国内源的方法
2020/11/17 Python
纯css3实现的竖形无限级导航
2014/12/10 HTML / CSS
HTML5中drawImage用法分析
2014/12/01 HTML / CSS
结构和类有什么异同
2012/07/16 面试题
高二历史教学反思
2014/01/25 职场文书
2014中考励志标语
2014/06/05 职场文书
机电系毕业生求职信
2014/07/11 职场文书
农业局党的群众路线教育实践活动整改方案
2014/09/20 职场文书
机关职员工作检讨书
2014/10/23 职场文书
教师实习自我鉴定总结
2019/08/20 职场文书
详解JAVA中的OPTIONAL
2021/06/14 Java/Android
解析redis hash应用场景和常用命令
2021/08/04 Redis