轻松搞定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滑动到底部加载下一页数据的实例代码
May 22 jQuery
jQuery 表单序列化实例代码
Jun 11 jQuery
简单实现jQuery上传图片显示预览功能
Jun 29 jQuery
jQuery EasyUI 折叠面板accordion的使用实例(分享)
Dec 25 jQuery
bootstrap+jquery项目引入文件报错的解决方法
Jan 22 jQuery
jQuery 改变P标签文本值方法
Feb 24 jQuery
vue+jquery+lodash实现滑动时顶部悬浮固定效果
Apr 28 jQuery
jQuery获取随机颜色的实例代码
May 21 jQuery
jQuery动态操作表单示例【基于table表格】
Dec 06 jQuery
jquery ajax 请求小技巧实例分析
Nov 11 jQuery
jQuery实现弹幕特效
Nov 29 jQuery
jQuery中event.target和this的区别详解
Aug 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
如何限制访问者的ip(PHPBB的代码)
2006/10/09 PHP
PHP实现断点续传乱序合并文件的方法
2018/09/06 PHP
修改发贴的编辑功能
2007/03/07 Javascript
javascript 保存文件到本地实现方法
2012/11/29 Javascript
JS获得QQ号码的昵称,头像,生日的简单实例
2013/12/04 Javascript
jQuery常用数据处理方法小结
2015/02/20 Javascript
jQuery根据元素值删除数组元素的方法
2015/06/24 Javascript
jquery UI Datepicker时间控件的使用方法(基础版)
2015/11/07 Javascript
javascript跑马灯抽奖实例讲解
2020/04/17 Javascript
ng2学习笔记之bootstrap中的component使用教程
2017/03/09 Javascript
JS实现禁止用户使用Ctrl+鼠标滚轮缩放网页的方法
2017/04/28 Javascript
Angular.js ng-file-upload结合springMVC的使用教程
2017/07/10 Javascript
使用travis-ci如何持续部署node.js应用详解
2017/07/30 Javascript
vue element upload实现图片本地预览
2019/08/20 Javascript
深入浅析golang zap 日志库使用(含文件切割、分级别存储和全局使用等)
2020/02/19 Javascript
vue 防止页面加载时看到花括号的解决操作
2020/11/09 Javascript
JavaScript代码实现简单计算器
2020/12/27 Javascript
python使用matplotlib绘制柱状图教程
2017/02/08 Python
python模拟事件触发机制详解
2018/01/19 Python
python与caffe改变通道顺序的方法
2018/08/04 Python
对python中大文件的导入与导出方法详解
2018/12/28 Python
python使用wxpy实现微信消息防撤回脚本
2019/04/29 Python
Django模板标签中url使用详解(url跳转到指定页面)
2020/03/19 Python
Pycharm 使用 Pipenv 新建的虚拟环境(图文详解)
2020/04/16 Python
Python字符串格式化f-string多种功能实现
2020/05/07 Python
Python如何向SQLServer存储二进制图片
2020/06/08 Python
CSS3 3D制作实战案例分析
2016/09/18 HTML / CSS
香蕉共和国Banana Republic官网:美国GAP旗下偏贵族风格服饰品牌
2016/11/21 全球购物
澳洲最大的时尚奢侈品电商平台:Cettire
2020/06/15 全球购物
自我鉴定范文300字
2013/10/01 职场文书
2014年商场超市庆元旦活动方案
2014/02/14 职场文书
计算机大学生职业生涯规划书范文
2014/02/19 职场文书
茶楼服务员岗位职责
2015/02/09 职场文书
2015年基建工作总结范文
2015/05/23 职场文书
新闻稿件写作技巧
2015/07/18 职场文书
JavaScript的Set数据结构详解
2022/02/18 Javascript