轻松搞定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 23 jQuery
如何选择jQuery版本 1.x? 2.x? 3.x?
Apr 01 jQuery
使用jQuery.Pin垂直滚动时固定导航
May 24 jQuery
Jquery+Ajax+xml实现中国地区选择三级联动菜单效果(推荐)
Jun 09 jQuery
jquery加载单文件vue组件的方法
Jun 20 jQuery
jQuery zTree搜索-关键字查询 递归无限层功能实现代码
Jan 25 jQuery
jQuery中复合选择器简单用法示例
Mar 31 jQuery
jQuery插件实现的日历功能示例【附源码下载】
Sep 07 jQuery
jQuery操作attr、prop、val()/text()/html()、class属性
May 23 jQuery
JQuery发送ajax请求时中文乱码问题解决
Nov 14 jQuery
jQuery实现鼠标移入显示蒙版效果
Jan 11 jQuery
jquery插件实现搜索历史
Apr 24 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将向Java靠拢
2006/10/09 PHP
基于curl数据采集之正则处理函数get_matches的使用
2013/04/28 PHP
CI框架中libraries,helpers,hooks文件夹详细说明
2014/06/10 PHP
PHP获取表单所有复选框的值的方法
2014/08/28 PHP
PHP使用imagick扩展实现合并图像的方法
2017/04/25 PHP
PHP数组与字符串互相转换实例
2020/05/05 PHP
Javascript实现的分页函数
2007/02/07 Javascript
Js 中debug方式
2010/02/07 Javascript
浅谈tudou土豆网首页图片延迟加载的效果
2010/06/23 Javascript
Jquery ajax传递复杂参数给WebService的实现代码
2011/08/08 Javascript
node.js中的fs.writeFileSync方法使用说明
2014/12/14 Javascript
JavaScript将DOM事件处理程序封装为event.js 出现的低级错误问题
2016/08/03 Javascript
使用watch监听路由变化和watch监听对象的实例
2018/02/24 Javascript
WebPack配置vue多页面的技巧
2018/05/15 Javascript
jQuery动态生成的元素绑定事件操作实例分析
2019/05/04 jQuery
jstree中的checkbox默认选中和隐藏示例代码
2019/12/29 Javascript
jQuery插件实现图片轮播效果
2020/10/19 jQuery
详解基于element的区间选择组件校验(交易金额)
2021/01/07 Javascript
[04:15]DOTA2-DPC中国联赛1月19日Recap集锦
2021/03/11 DOTA
在Python下利用OpenCV来旋转图像的教程
2015/04/16 Python
Python设计模式编程中Adapter适配器模式的使用实例
2016/03/02 Python
Python的Flask框架应用调用Redis队列数据的方法
2016/06/06 Python
Python新手们容易犯的几个错误总结
2017/04/01 Python
Python实现简单求解给定整数的质因数算法示例
2018/03/25 Python
关于python之字典的嵌套,递归调用方法
2019/01/21 Python
详解Python用户登录接口的方法
2019/04/17 Python
Python 的AES加密与解密实现
2019/07/09 Python
Django 迁移、操作数据库的方法
2019/08/02 Python
python  ceiling divide 除法向上取整(或小数向上取整)的实例
2019/12/27 Python
加拿大时尚床上用品零售商:QE Home | Quilts Etc
2018/01/22 全球购物
意大利消费电子产品购物网站:SLG Store
2019/12/26 全球购物
后进生转化工作制度
2014/01/17 职场文书
销售内勤岗位职责范本
2015/04/13 职场文书
家庭经济困难证明
2015/06/23 职场文书
2016年安全生产先进个人事迹材料
2016/02/29 职场文书
Appium中scroll和drag_and_drop根据元素位置滑动
2022/02/15 Python