美文网首页
json 与 jsonp

json 与 jsonp

作者: 高静最近在长脑子 | 来源:发表于2017-07-20 15:40 被阅读8次

全称 JSON with Padding,用于解决AJAX跨域问题的一种方案(关于“同源策略”的具体内容这里就不赘述了,度娘足矣)
JSONP 本质并不是 AJAX

纯 JavaScript 实现 JSONP:

<script>

    // 实现回调函数,这里没有了 jQuery 的封装,必须手动指定并实现
    var dosomething = function(data){
        console.log(data);
    };

    // 提供 JSONP 服务的 URL 地址,查询字符串中加入 callback 指定回调函数
    var url = "tonghuashuo.github.io/test/jsonp.txt?callback=docomething";

    // 创建 <script> 标签,设置其 src 属性
    var script = document.createElement('script');
    script.setAttribute('src', url);

    // 把 <script> 标签加入 <body> 尾部,此时调用开始。
    document.getElementsByTagName('body')[0].appendChild(script); 

    // 因为目标 URL 是一个后台脚本,访问后会被执行,返回的 JSON 被包裹在回调函数中以字符串的形式被返回。
    // 返回的字符串放入 <script> 中就成为了一个普通的函数调用,执行回调函数,返回的 JSON 数据作为实参被传给了回调函数。
</script>

AJAX 无法跨域是受到“同源政策”的限制,但是带有src属性的标签(例如<script>、<img>、<iframe>)是不受该政策限制的,因此我们可以通过向页面中动态添加<script>标签来完成对跨域资源的访问,这也是 JSONP 方案最核心的原理。

通常我们使用<script>都是引用的静态资源(主要是 js 文件),其实它也可以用来引用动态资源(php、jsp、aspx等),后台服务被访问后返回一个“JavaScript函数调用”形式的字符串,由于是字符串,因此在后台的时候不会起到任何作用,但到了前台,放入<script>标签之内,就成了一个合法的 JavaScript 函数调用,实参是我们真正需要的数据,被调用的回调函数也已经实现了,因此就会顺利的被调用。

再次强调:JSONP 不是 AJAX,了解了它的原理之后你应该已经明白这是为什么了(事实上 JSONP 的出现让 “AJAX跨域请求”变成了伪命题,跨域的过程根本就没 AJAX 什么事)。要怪就怪 jQuery,给不明真相的吃瓜群众带来了误解。当然 jQuery 这么做也不无道理,毕竟跨域的问题是在 AJAX 中遇到的,受惯性思维影响我们自然首先会从 AJAX 的角度去寻求解决方案,因此 jQuery 才把 JSONP 封装到了$.ajax()的配置项中,至于具体的实现自然还是上面提到的方法。

回过头来我们再看一遍 JSONP 的全称:JSON with Padding,这里的 Padding 指的就是包裹在 JSON 外层的回调函数,这么一来,是不是印象就非常深刻了呢。

JSONP 最大的优点就是兼容性非常好,其原理决定了即便在非常古老的浏览器上也能够很好的被实现。

JSONP 的主要缺点有两个,一是只能 GET 不能 POST,因为是通过<script>引用的资源,参数全都显式的放在URL里,和 AJAX 没有半毛钱关系。二是存在安全隐患,动态插入<script>标签其实就是一种脚本注入,需要多留个心眼。

相关文章

  • 跨域的几种实现方式

    JSONP JSONP 是JSON with padding(填充式JSON 或参数式JSON)的简写;JSONP...

  • Java高级技术day84:JsonP和HttpClient

    一、Jsonp的简介 1.什么是 JsonP? Jsonp(JSON with Padding) 是 json 的...

  • JSONP全面分析

    JSONP JSONP是JSON with padding(填充式JSON或参数式JSON)的简写,是应用JSON...

  • Jsonp学习笔记

    一、Jsonp简介 1.什么是Jsonp Jsonp(JSON with Padding)是json的一种“使用模...

  • 浅谈JSON和JSONP!!!

    JSON JSON返回的是一串数据,是对象,可以无限扩展; JSON优点: JSON缺点: JSONP JSONP...

  • json与jsonp

    一言以蔽之,json返回的是一串数据;而jsonp返回的是脚本代码(包含一个函数调用); JSON其实就是Java...

  • json 与 jsonp

    全称 JSON with Padding,用于解决AJAX跨域问题的一种方案(关于“同源策略”的具体内容这里就不赘...

  • JSON与JSONP

    JSON和JSONP的区别 简要来说JSON是数据交换格式,JSONP是实现跨域的一种方法 什么是JSON JSO...

  • json与jsonp

    什么是JSON JSON的优点: 1、基于纯文本,跨平台传递极其简单; 2、Javascript原生支持,后台语言...

  • JSON与JSONP

    说到AJAX就会不可避免的面临两个问题,第一个是AJAX以何种格式来交换数据?第二个是跨域的需求如何解决?这两个问...

网友评论

      本文标题:json 与 jsonp

      本文链接:https://www.haomeiwen.com/subject/bkxjkxtx.html