轻松搞定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轻松实现无缝轮播效果
Mar 22 jQuery
vue中如何引入jQuery和Bootstrap
Apr 10 jQuery
解决jQuery ajax动态新增节点无法触发点击事件的问题
May 24 jQuery
jQuery导航条固定定位效果实例代码
May 26 jQuery
jquery.pagination.js分页使用教程
Oct 23 jQuery
jQuery实现根据身份证号获取生日、年龄、性别等信息的方法
Jan 09 jQuery
解决JQuery的ajax函数执行失败alert函数弹框一闪而过问题
Apr 10 jQuery
基于jquery ajax的多文件上传进度条过程解析
Sep 11 jQuery
jQuery操作事件完整实例分析
Jan 10 jQuery
jQuery实现高度灵活的表单验证功能示例【无UI】
Apr 30 jQuery
jQuery实现简单评论功能
Aug 19 jQuery
详解jQuery的核心函数和事件处理
Feb 18 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使之能同时支持GIF和JPEG
2006/10/09 PHP
php中获取主机名、协议及IP地址的方法
2014/11/18 PHP
JavaScript插入动态样式实现代码
2012/02/22 Javascript
javascript设计模式 封装和信息隐藏(上)
2012/07/24 Javascript
jQuery插件开发详细教程
2014/06/06 Javascript
jQuery.each使用详解
2015/07/07 Javascript
基于javascript实现右下角浮动广告效果
2016/01/08 Javascript
分享一个精简的vue.js 图片lazyload插件实例
2017/03/13 Javascript
使用vue框架 Ajax获取数据列表并用BootStrap显示出来
2017/04/24 Javascript
vue 实现通过手机发送短信验证码注册功能
2018/04/19 Javascript
详解angular部署到iis出现404解决方案
2018/08/14 Javascript
JS使用cookie保存用户登录信息操作示例
2019/05/30 Javascript
使用 JavaScript 创建并下载文件(模拟点击)
2019/10/25 Javascript
jQuery实现动态操作table行
2020/11/23 jQuery
VUE中鼠标滚轮使div左右滚动的方法详解
2020/12/14 Vue.js
[59:42]Secret vs Alliacne 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/17 DOTA
python实现数通设备tftp备份配置文件示例
2014/04/02 Python
python获取从命令行输入数字的方法
2015/04/29 Python
Python从MP3文件获取id3的方法
2015/06/15 Python
python 爬虫一键爬取 淘宝天猫宝贝页面主图颜色图和详情图的教程
2018/05/22 Python
python实现Excel文件转换为TXT文件
2019/04/28 Python
Python学习笔记之迭代器和生成器用法实例详解
2019/08/08 Python
在python中实现求输出1-3+5-7+9-......101的和
2020/04/02 Python
python实现音乐播放和下载小程序功能
2020/04/26 Python
PyQt5实现仿QQ贴边隐藏功能的实例代码
2020/05/24 Python
Python中操作各种多媒体,视频、音频到图片的代码详解
2020/06/04 Python
Python中的全局变量如何理解
2020/06/04 Python
基于python实现ROC曲线绘制广场解析
2020/06/28 Python
深入理解css中vertical-align属性
2017/04/18 HTML / CSS
Nike荷兰官方网站:Nike.com (NL)
2018/04/19 全球购物
四种会话跟踪技术
2015/05/20 面试题
我的求职择业计划书
2014/04/04 职场文书
出差报告范文
2014/11/06 职场文书
趣味运动会通讯稿
2015/07/18 职场文书
五星级酒店宣传口号
2015/12/25 职场文书
MySQL 不等于的三种使用及区别
2021/06/03 MySQL