轻松搞定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 ajax动态新增节点无法触发点击事件的问题
May 24 jQuery
基于jQuery Easyui实现登陆框界面
Jul 10 jQuery
详解jQuery中关于Ajax的几个常用的函数
Jul 17 jQuery
vue.js2.0点击获取自己的属性和jquery方法
Feb 23 jQuery
jQuery基于闭包实现的显示与隐藏div功能示例
Jun 09 jQuery
jQuery.extend 与 jQuery.fn.extend的用法及区别实例分析
Jul 25 jQuery
用jQuery将JavaScript对象转换为querystring查询字符串的方法
Nov 12 jQuery
jquery.tagsinput.js实现记录checkbox勾选的顺序
Sep 21 jQuery
Jquery 动态添加元素并添加点击事件实现过程解析
Oct 12 jQuery
jquery使用echarts实现有向图可视化功能示例
Nov 25 jQuery
js与jquery获取input输入框中的值实例讲解
Feb 27 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实现文件下载断点续传详解
2014/10/15 PHP
PHPExcel内存泄漏问题解决方法
2015/01/23 PHP
PHP+jQuery翻板抽奖功能实现
2015/10/19 PHP
PHP中spl_autoload_register()函数用法实例详解
2016/07/18 PHP
PHP递归删除多维数组中的某个值
2017/04/17 PHP
PHP中使用CURL发送get/post请求上传图片批处理功能
2018/10/15 PHP
Div自动滚动到末尾的代码
2008/10/26 Javascript
javascript获取url上某个参数的方法
2013/11/08 Javascript
jQuery中parent()方法用法实例
2015/01/07 Javascript
简介JavaScript中的sub()方法的使用
2015/06/08 Javascript
详解升级react-router 4 踩坑指南
2017/08/14 Javascript
vue登录注册实例详解
2019/09/14 Javascript
VUE中使用HTTP库Axios方法详解
2020/02/05 Javascript
[01:08:48]LGD vs OG 2018国际邀请赛淘汰赛BO3 第三场 8.25
2018/08/29 DOTA
[01:18:31]DOTA2-DPC中国联赛定级赛 LBZS vs Magma BO3第一场 1月10日
2021/03/11 DOTA
Python中对列表排序实例
2015/01/04 Python
python编写爬虫小程序
2015/05/14 Python
python sys.argv[]用法实例详解
2018/05/25 Python
基于Python3.6+splinter实现自动抢火车票
2018/09/25 Python
scikit-learn线性回归,多元回归,多项式回归的实现
2019/08/29 Python
浅谈Django QuerySet对象(模型.objects)的常用方法
2020/03/28 Python
html5构建触屏网站之touch事件介绍
2013/01/07 HTML / CSS
div或img图片高度随宽度自适应的方法
2020/02/06 HTML / CSS
日本食品网上商店:JaponShop.com
2017/11/28 全球购物
KARATOV珠宝在线商店:俄罗斯珠宝品牌
2019/03/13 全球购物
以设计师精品品质提供快速时尚:Mostata
2019/05/10 全球购物
财务方面个人工作的自我评价
2013/12/28 职场文书
机电专业大学生职业规划书范文
2014/02/25 职场文书
旅游管理专业大学生职业规划书
2014/02/27 职场文书
预备党员的自我评价
2014/03/12 职场文书
奉献演讲稿范文
2014/05/21 职场文书
迎新生晚会主持词
2015/06/30 职场文书
2016年社区党支部公开承诺书
2016/03/25 职场文书
导游词之沈阳清昭陵
2019/12/28 职场文书
使用Python脚本对GiteePages进行一键部署的使用说明
2021/05/27 Python
C3 线性化算法与 MRO之Python中的多继承
2021/10/05 Python