轻松搞定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实现百度登录框的动态切换效果
Apr 21 jQuery
jquery dataTable 后台加载数据并分页实例代码
Jun 07 jQuery
基于jQuery实现手风琴菜单、层级菜单、置顶菜单、无缝滚动效果
Jul 20 jQuery
基于jQuery对象和DOM对象和字符串之间的转化实例
Aug 08 jQuery
jQuery取得元素标签名称小结(附代码)
Aug 16 jQuery
jQuery实现的简单前端搜索功能示例
Oct 28 jQuery
jquery获取transform里的值实现方法
Dec 12 jQuery
浅析vue-router jquery和params传参(接收参数)$router $route的区别
Aug 03 jQuery
jquery 遍历hash操作示例【基于ajax交互】
Oct 12 jQuery
jQuery实现王者荣耀手风琴效果
Jan 17 jQuery
JQuery复选框全选效果如何实现
May 08 jQuery
jQuery实现视频展示效果
May 30 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压缩html网页代码(清除空格,换行符,制表符,注释标记)
2012/04/02 PHP
PHP学习笔记(一) 简单了解PHP
2014/08/04 PHP
PHP正则验证Email的方法
2015/06/15 PHP
php 如何设置一个严格控制过期时间的session
2017/05/05 PHP
PHP封装XML和JSON格式数据接口操作示例
2019/03/06 PHP
查看源码的工具 学习jQuery源码不错的工具
2011/12/26 Javascript
返回页面顶部top按钮通过锚点实现(自写)
2013/08/30 Javascript
微信分享调用jssdk实例
2017/06/08 Javascript
关于vue-resource报错450的解决方案
2017/07/24 Javascript
使用jQuery实现两个div中按钮互换位置的实例代码
2017/09/21 jQuery
canvas+gif.js打造自己的数字雨头像的示例代码
2017/10/26 Javascript
微信小程序button组件使用详解
2018/01/31 Javascript
微信小程序自定义多选事件的实现代码
2018/05/17 Javascript
jQuery实现常见的隐藏与展示列表效果示例
2018/06/04 jQuery
JS实现将对象转化为数组的方法分析
2019/01/21 Javascript
使用JavaScript保存文本文件到本地的两种方法
2019/01/22 Javascript
详解写好JS条件语句的5条守则
2019/02/28 Javascript
使用React手写一个对话框或模态框的方法示例
2019/04/25 Javascript
JavaScript JSON使用原理及注意事项
2020/07/30 Javascript
python抓取京东价格分析京东商品价格走势
2014/01/09 Python
跟老齐学Python之一个免费的实验室
2014/09/14 Python
Python django实现简单的邮件系统发送邮件功能
2017/07/14 Python
微信跳一跳python辅助软件思路及图像识别源码解析
2018/01/04 Python
教你使用python画一朵花送女朋友
2018/03/29 Python
对Python中gensim库word2vec的使用详解
2018/05/08 Python
Python + selenium + requests实现12306全自动抢票及验证码破解加自动点击功能
2018/11/23 Python
Python中最大递归深度值的探讨
2019/03/05 Python
Python使用configparser库读取配置文件
2020/02/22 Python
解决jupyter notebook打不开无反应 浏览器未启动的问题
2020/04/10 Python
Python SMTP配置参数并发送邮件
2020/06/16 Python
Topman美国官网:英国著名的国际平价时尚男装品牌
2017/12/22 全球购物
Lime Crime官网:美国一家主打梦幻精灵系的彩妆品牌
2019/03/22 全球购物
世界上最大的铁人三项商店:Tri UK
2020/11/04 全球购物
师范生的个人求职信范文
2014/01/04 职场文书
企业车辆管理制度
2014/01/24 职场文书
党员争先创优承诺书
2015/01/20 职场文书