JSONP的原理与实现(基于jQuery)

  

  为什么会有JSONP?因为我们使用AJAX,使用AJAX可能就会遇到跨域的需求,如何解决呢,对,就是JSONP。

  这里注意下JSON和JSONP不是一类,虽然他们只是一个字母只差,但是实际差别很大。这里简单介绍下:

  •   JSON:JSON(JavaScript Object Notation)是一种基于文本的数据交换方式,或者叫做数据描述格式。

    • JSON的优点:

        1、基于纯文本,跨平台传递极其简单;

        2、Javascript原生支持,后台语言几乎全部支持;

        3、轻量级数据格式,占用字符数量极少,特别适合互联网传递;

        4、可读性较强,虽然比不上XML那么一目了然,但在合理的依次缩进之后还是很容易识别的;

        5、容易编写和解析,当然前提是你要知道数据结构;

        JSON的缺点当然也有,但在作者看来实在是无关紧要的东西,所以不再单独说明。

    • JSON的格式或者叫规则:

        JSON能够以非常简单的方式来描述数据结构,XML能做的它都能做,因此在跨平台方面两者完全不分伯仲。

        1、JSON只有两种数据类型描述符,大括号{}和方括号[],其余英文冒号:是映射符,英文逗号,是分隔符,英文双引号""是定义符。

        2、大括号{}用来描述一组“不同类型的无序键值对集合”(每个键值对可以理解为OOP的属性描述),方括号[]用来描述一组“相同类型的有序数据集合”(可对应OOP的数组)。

        3、上述两种集合中若有多个子项,则通过英文逗号,进行分隔。

        4、键值对以英文冒号:进行分隔,并且建议键名都加上英文双引号”",以便于不同语言的解析。

        5、JSON内部常用数据类型无非就是字符串、数字、布尔、日期、null 这么几个,字符串必须用双引号引起来,其余的都不用,日期类型比较特殊,这里就不展开讲述了,只是建议如果客户端没有按日期排序功能需求的话,那么把日期时间直接作为字符串传递就好,可以省去很多麻烦。

  • JSONP:JSONP(JSON with Padding)实现跨域交换数据。

  AJAX的核心是通过XmlHttpRequest获取非本页内容,而JSONP的核心则是动态添加<script>标签来调用服务器提供的js脚本,允许用户传递一个callback参数给服务端,然后服务端返回数据时会将这个callback参数作为函数名来包裹住JSON数据,这样客户端就可以随意定制自己的函数来自动处理返回数据了。

  一个众所周知的问题,Ajax直接请求普通文件存在跨域无权限访问的问题,甭管你是静态页面、动态网页、web服务、WCF,只要是跨域请求,一律不准;不过我们又发现,Web页面上调用js文件时则不受是否跨域的影响(不仅如此,我们还发现凡是拥有”src”这个属性的标签都拥有跨域的能力,比如<script>、<img>、<iframe>);于是可以判断,当前阶段如果想通过纯web端(ActiveX控件、服务端代理、属于未来的HTML5之Websocket等方式不算)跨域访问数据就只有一种可能,那就是在远程服务器上设法把数据装进js格式的文件里,供客户端调用和进一步处理;恰巧我们已经知道有一种叫做JSON的纯字符数据格式可以简洁的描述复杂数据,更妙的是JSON还被js原生支持,所以在客户端几乎可以随心所欲的处理这种格式的数据;这样子解决方案就呼之欲出了,web客户端通过与调用脚本一模一样的方式,来调用跨域服务器上动态生成的js格式文件(一般以JSON为后缀),显而易见,服务器之所以要动态生成JSON文件,目的就在于把客户端需要的数据装入进去。客户端在对JSON文件调用成功之后,也就获得了自己所需的数据,剩下的就是按照自己需求进行处理和展现了,这种获取远程数据的方式看起来非常像AJAX,但其实并不一样。为了便于客户端使用数据,逐渐形成了一种非正式传输协议,人们把它称作JSONP,该协议的一个要点就是允许用户传递一个callback参数给服务端,然后服务端返回数据时会将这个callback参数作为函数名来包裹住JSON数据,这样客户端就可以随意定制自己的函数来自动处理返回数据了。

jQuery实现JSONP:

客户端:

$.ajax({
    url: ‘http://192.168.1.114/yii/demos/test.php‘, //不同的域
    type: ‘GET‘, // jsonp模式只有GET是合法的
    data: {
        ‘action‘: ‘aaron‘
    }, // 预传参的数组
    dataType: ‘jsonp‘, // 数据类型
    jsonp: ‘backfunc‘, // 指定回调函数名,与服务器端接收的一致,并回传回来
})

查看代码

服务端:(mvc的,protected,给其他需要返回JSONP的调用,在父类中)

        protected ActionResult Jsonp(object data)
        {
            string jsoncallback = Request.QueryString["jsoncallback"];
            if (string.IsNullOrEmpty(jsoncallback))
            {
                return Json(data, JsonRequestBehavior.AllowGet);
            }

            var jsc = new JavaScriptSerializer();
            return Content(string.Format("{0}({1})", jsoncallback, jsc.Serialize(data)), "text/plain", System.Text.Encoding.Default);
        }

查看代码

  只要你了解其原理,使用原生js实现也是一样了。请注意,JSONP和AJAX不是一回事哦,两者的原理也不一样。
  至此,我们已经了解JSONP的原理以及如何实现了,博客写的不是很好,忘指正。谢谢。

JSONP的原理与实现(基于jQuery),布布扣,bubuko.com

时间: 2024-12-22 05:54:06

JSONP的原理与实现(基于jQuery)的相关文章

js/ajax跨越访问-jsonp的原理和实例(javascript和jquery实现代码)

最近做了一个项目,需要用子域名调用主域名下的一个现有的功能,于是想到了用jsonp来解决,在我们平常的项目中不乏有这种需求的朋友,于是记录下来以便以后查阅同时也希望能帮到大家,需要了解的朋友可以参考下 很庆幸,我又见到了末日后新升的太阳,所以我还能在这里写文章,言归正传哈,最近做了一个项目,需要用子域名调用主域名下的一个现有的功能,于是想到了用jsonp来解决,在我们平常的项目中不乏有这种需求的朋友,于是记录下来以便以后查阅同时也希望能帮到大家. 什么是JSONP协议? JSONP即JSON w

基于jQuery实现左右图片轮播(原理通用)

基于jQuery实现左右图片轮播(原理通用), 本文为大家分享了jQuery实现左右图片轮播代码,供大家参考,具体实现内容如下 运行效果图: 重点!!! 实现原理: 通过判断index值的大小变化来判断图片左移还是右移.通过控制图片的left值,来达到一个轮播的效果. 具体代码: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title></title>

基于jQuery的视频和音频播放器jPlayer

jPlayer见网络上资料很少,官方英文资料太坑爹TAT,于是就写一个手记给大家参考下.据我观察,jPlayer的原理主要是用到HTML5,在不支持HTML5的浏览器上使用SWF.做到全兼容,这一点很不错.官方还说明,服务器对于MP3文件不要做GZIP压缩,只是徒增CPU而已.并且在Flash播放GZIP的MP3时会出错. jPlayer简介: 想在网页上播放背景音乐,不想用html标签的方式,因为那样只有音乐全部下载完以后才能播放,还容易出现跨浏览器兼容性的问题,于是选了一款基于jQuery的

基于jQuery的Validate表单验证

表单验证可以说在前端开发工作中是无处不在的~ 有数据,有登录,有表单, 都需要前端验证~~  而我工作中用到最多的就是基于基于jQuery的Validate表单验证~  就向下面这样~ 因为今天有个朋友问我要一个表单的验证,所以我就稍微整理了一下~  基本上有了这个表单验证插件,基本上一些常用的验证都可以搞定了~ 如果搞不定,没关系,我们还可以基于Validate来写一个自己的验证插件, 我把它取名为message_zh.js,我们可以在里面扩展自己需要的验证~~ 既然Validate是基于jQ

基于jquery的锚点滚动插件(百度百科效果) anchorScroll.js

1.插进使用场景 请打开https://baike.baidu.com/item/%E6%97%A5%E6%9C%AC%E5%8A%A8%E7%94%BB#hotspotmining,查看百度百科页面效果. 2.插件源代码: /* * 作者:孟繁贵 * 2017-08-25 * 版本:1.0 */ jQuery.anchorScroll = function(elem1, elem2) { var currObj, offsetTop = 0, h2List = new Array(), h3L

推荐20款基于 jQuery &amp; CSS 的文本效果插件

jQuery 和 CSS 可以说是设计和开发行业的一次革命.这一切如此简单,快捷的一站式服务.jQuery 允许你在你的网页中添加一些真正令人惊叹的东西而不用付出很大的努力,要感谢那些优秀的 jQuery 插件. 所以今天我们将展示一些很酷的文本效果插件,将帮助你为你的 Web 页面创建一些很酷的和动态的东西.这里是20个基于 jQuery & CSS 的文本效果插件. 您可能感兴趣的相关文章 12款经典的白富美型 jQuery 图片轮播插件 让网站动起来!12款优秀的 jQuery 动画插件

基于jquery的web前端十款不同应用的预览及源码

1.网页变灰(css+js),兼容IE7-10.FF.Chrome.Opera 当天很多媒体已停止一些娱乐活动,部分网站也将主题或logo变成了灰色.那么怎样把网页上的图片或文字都变成灰色呢? 在线演示 源码下载 2.Javascript制作的网页侧边弹出框 今天制作了个网页侧边弹出框,可用于制作分享按钮.在线客服.留言框等,这些效果原理都是一样的,它们可以紧贴浏览器的上.下.左.右四个边栏,以下这个例子就提供了四个样式,展示了紧贴不同的边栏所展示出的效果. 在线演示 源码下载 3.制作的一款登

jsonp协议原理深度解析

前言 今天在开发联调的过程中,需要跨域的获取数据,因为使用的jquery,当然使用dataType:'jsonp'就能够很easy的解决了.但是因为当时后端没有支持jsonp来访问,后来他在实现这个功能的时候问了我一句,jsonp形式返回的格式是怎么样子的?我一直以来只知道怎么使用,迷迷糊糊的却没有答上来... 虽然后来解决了,但是对于喜欢解决问题的我,心里却一直耿耿于怀,必须得把这个研究透彻了,于是我开始翻阅资料,看到后面真有种豁然开朗的感觉,于是打算做个笔记与大家分享. JSON和JSONP

【jquery】基于 jquery 实现 ie 浏览器兼容 placeholder 效果

placeholder 是 html5 新增加的属性,主要提供一种提示(hint),用于描述输入域所期待的值.该提示会在输入字段为空时显示,并会在字段获得焦点时消失.placeholder 属性适用于以下类型的 input 标签:text, search, url, telephone, email 以及 password. 我们先看下在谷歌浏览器中的效果,如图所示: 获得焦点时: 输入字段: 因为是 html5 属性,自然低版本的浏览器比如 ie6-8 不兼容.下面就介绍下如何在低版本浏览器中