AJAX之JSON与JSONP

本文详细介绍了JSON和JSONP的区别,以及JSONP在解决AJAX跨域问题中的作用。JSON是一种数据交换格式,而JSONP是一种非官方的跨域数据交互协议。JSONP通过动态添加script标签实现跨域,与传统的AJAX基于XmlHttpRequest不同。文中还澄清了JSONP并非AJAX的特例,即使在jQuery中被封装,它们依然是两种独立的技术。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

  • AJAX目前常问的两个面试题
    1、AJAX以何种格式来交换数据?
    2、跨域的需求如何解决?
    这两个问题目前都有不同的解决方案,比如数据可以用自定义字符串来描述,跨域可以通过服务器端代理来解决。
    到目前为止最被推崇的方案还是用JSON来传数据,靠JSONP来跨域。而这就是本节将要讲述的内容。

JSON&&JSONP

  • JSON和JSONP虽然只有一个字母的差别,但本质差距较大:
  • 1、JSON是一种数据交换格式
  • 2、而JSONP是开发人员创造出的一种非官方跨域数据交互协议
    通俗理解:
    拿谍战片来打个比方,JSON是地下党们用来书写和交换情报的“暗号”,而JSONP则是接头方式。通俗理解,一个是传递信息格式,一个是信息给对方的传递交互协议
  • 接下来依次介绍下… …

JSON

  • ** (1)什么是JSON?**
    JSON是一种基于文本的数据交换方式,或者叫做数据描述格式
  • (2)优势?
    ①基于纯文本,跨平台传递极其简单
    ②Javascript原生支持,后台语言几乎全部支持;
    ③轻量级数据格式,占用字符数量极少,特别适合互联网传递;
    ④可读性较强,虽然比不上XML那么一目了然,但在合理的依次缩进之后还是很容易识别的;
    ⑤容易编写和解析

JSONP

  • 【发展】正式介绍前,先来介绍下,JSONP来源/出现缘由,以便更好地理解… …
  • 1、一个众所周知的问题,Ajax直接请求普通文件存在跨域无权限访问的问题,不管是静态/动态网页、web服务,只要是跨域请求,一律不准;
  • 2、后来发现,Web页面上调用js文件时,不受跨域的影响(不仅如此,还发现凡是拥有"src"这个属性的标签都拥有跨域的能力,比如<script>、<img>、<iframe>等等);
  • 3、于是可以分析出,当前阶段如果想通过纯web端跨域访问数据就只有一种可能,那就是在远程服务器上设法把数据装进js格式的文件里,供客户端调用和进一步处理;
  • 4、恰巧有一种叫做JSON的纯字符数据格式可以简洁的描述复杂数据,而且支持被原生js支持,所以在客户端可以随意处理该格式的数据;
  • 5、此时,解决方案就呼之欲出了,web客户端通过类似于调用脚本的方式,来调用跨域服务器上动态生成的js格式文件(一般以JSON为后缀)。
  • 6、客户端在对JSON文件调用成功之后,也就获得了自己所需的数据,剩下的就是按照需求进行处理展现即可,这种获取远程数据的方式看起来非常像AJAX,但其实并不一样。
  • 7、为了便于客户端使用数据,逐渐形成了一种非正式传输协议,人们把它称作JSONP,该协议的一个要点就是允许用户传递一个callback参数给服务端,然后服务端返回数据时会将这个callback参数作为函数名来包裹JSON数据,这样客户端就可以随意定制函数来自动处理返回数据了。

伪命题

  • 【误区】:
  • 对于经常用jQuery的开发者来说,知道jQuery封装的.ajax中有dataType属性,如果将该属性设置成dataType:"jsonp",就能实现==JSONP跨域==了。需要了解的一点是,虽然jQuery将JSONP封装在.ajax中有dataType属性,如果将该属性设置成dataType:"jsonp",就能实现==JSONP跨域==了。 需要了解的一点是,虽然jQuery将JSONP封装在.ajaxdataTypedataType:"jsonp"==JSONP==jQueryJSONP.ajax中,但是其本质与$.ajax不一样。JSONP的最基本的原理是:动态添加一个<script>标签,而script标签的src属性是没有跨域的限制的。这样说来,这种跨域方式其实与ajax
    XmlHttpRequest协议无关了。
  • 这样其实"jQuery AJAX跨域问题"就成了个伪命题,jquery $.ajax方法名有误导人之嫌。
  • 伪命题(false proposition)是指不真实的命题。
    两种情况:其一是不符合客观事实;
    其二是不符合一般事理和科学道理。
    另一种解释是指没有意义的命题,无法断定其真假,既不是先天的分析命题,也不是可以通过经验判断的综合命题。比如,“团结比原子弹还厉害”,”凡事都有例外”这类命题就属于伪命题。
    事实来讲,例如“人终有一死”这事没有例外… …
  • 伪命题
  • 1、ajax和jsonp这两种技术在调用方式上“看起来”很像,目的也一样,都是请求一个url,然后把服务器返回的数据进行处理,因此jquery和ext等框架都把jsonp作为ajax的一种形式进行了封装;
  • 2、ajax和jsonp本质上是不同的东西。ajax的核心是通过XmlHttpRequest获取非本页内容,而jsonp的核心则是动态添加<script>标签来调用服务器提供的js脚本;
  • 3、其实ajax与jsonp的区别不在于是否跨域,ajax通过服务端代理一样可以实现跨域,jsonp本身也不排斥同域的数据的获取。
  • 伪命题解析:
  • 如果设为dataType: ‘jsonp’,这个$.ajax方法就和ajax XmlHttpRequest没什么关系了,取而代之的则是JSONP协议。
  • 而JSONP是一个非官方的协议,它允许在服务器端集成Script tags返回至客户端,通过javascript callback的形式实现跨域访问。
  • 总而言之,jsonp不是ajax的一个特例,哪怕jquery等巨头把jsonp封装进了ajax,也不能改变着一点!
  • 完毕
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值