受限于浏览器的同源安全策略, js 无法发起跨域的请求. 但是 HTML 中的 <script> 标签却可以引入跨域的文件使用. 而 JSONP 就是利用 <script> 的开源策略解决跨域问题的一种 JSON 的使用模式.

JSONP 抓取到的数据并不是 JSON, 而是任意可执行的 JS 代码.

JSONP 应用

服务器端代码

<?php
$info = ['type' => 'jsonp', 'msg' => '服务器端数据'];
$info = json_encode($info, JSON_UNESCAPED_UNICODE);
$callback = $_GET['jsonpCallback'];
// 此处相当于直接返回一句js代码: showData({type: "jsonp", msg: "服务器端数据"})
echo "{$callback}({$info})";

客户端代码

<script type="text/javascript">
function showData(data)
{
console.log(data);
}
</script>
// 获取到返回的js后开始执行
<script type="text/javascript" src="http://127.0.0.1:88/JSONP/getData?jsonpCallback=showData"></script>

上面的客户端代码在执行时等于:

<script type="text/javascript">
function showData(data)
{
console.log(data);
}
</script>
<script type="text/javascript">
showData({type: "jsonp", msg: "服务器端数据"})
</script>

JQuery 下的 JSONP 实现

客户端代码

服务器端代码不变, 客户端代码替换为:

<script type="text/javascript">
$.ajax({
url: 'http://127.0.0.1:88/JSONP/getData?jsonpCallback=showData',
type: 'get',
data: null,
dataType: 'jsonp',
async: false,
success: function(data)
{
console.log(data);
},
error: function(){}
}); function showData(data)
{
console.log(data);
}
</script>

或是

<script type="text/javascript">
$.ajax({
url: 'http://127.0.0.1:88/JSONP/getData',
type: 'get',
data: null,
dataType: 'jsonp',
jsonpCallback: 'showData', // 定义回调函数名, 没有此项, jQuery将提供一个随机函数名, 后端通过$_GET['callback']获取回调函数名
async: false,
success: function(data)
{
console.log(data);
},
error: function(){}
}); function showData(data)
{
console.log(data);
}
</script>

  

JSONP 应用的更多相关文章

  1. 实例操作JSONP原理

    絮语:按这个步骤走,你就会明白JSONP是什么鬼. 1.工程目录: ng-mywork demo.html test.js 2.nginx的server配置 server { listen ; ser ...

  2. angular2系列教程(九)Jsonp、URLSearchParams、中断选择数据流

    大家好,今天我们要讲的是http模块的第二部分,主要学习ng2中Jsonp.URLSearchParams.observable中断选择数据流的用法. 例子

  3. 疯狂的JSONP

    何为跨域?何为JSONP?JSONP技术能实现什么?是否有必要使用JSONP技术? 跨域 就是由于JavaScript同源策略的限制,使得a.com域名下的js无法操作b.com或c.a.com域名下 ...

  4. 通过扩展让ASP.NET Web API支持JSONP

    同源策略(Same Origin Policy)的存在导致了"源"自A的脚本只能操作"同源"页面的DOM,"跨源"操作来源于B的页面将会被拒 ...

  5. 跨域的jsonP

    1.出现原因:因为web中的同源策略(域名,协议,端口号)限制了跨域访问.   2.区别于json (个人理解)json是数据交换格式,jsonp是数据通信中的交互方式   3.jsonp的get与p ...

  6. ASP.NET Web API 配置 JSONP

    之前的一篇博文:jsonp跨域+ashx(示例) 1. 安装 Jsonp 程序集: PM> Install-Package WebApiContrib.Formatting.Jsonp PM&g ...

  7. 原生JS封装Ajax插件(同域&&jsonp跨域)

    抛出一个问题,其实所谓的熟悉原生JS,怎样的程度才是熟悉呢? 最近都在做原生JS熟悉的练习... 用原生Js封装了一个Ajax插件,引入一般的项目,传传数据,感觉还是可行的...简单说说思路,如有不正 ...

  8. 跨域之jsonp

    我们都知道使用<script>标签可以引入外部的JS文件,即使这个JS文件来自于其他的网站,比如我们引用存放在网络服务器上的jQuery框架.在这个过程中,我们已经实现跨域访问.像< ...

  9. 由浅入深学习ajax跨域(JSONP)问题

    什么是跨域?说直白点就是获取别人网站上的内容.但这么说貌似又有点混淆,因为通常我们用ajax+php就可以获取别人网站的内容,来看下面这个例子. 来看看跨域的例子,jquery+ajax是不能跨域请求 ...

  10. JSONP的诞生、原理及应用实例

    问题: 页面中有一个按钮,点击之后会更新网页中的一个盒子的内容. Ajax可以很容易的满足这种无须刷新整个页面就可以实现数据变换的需求. 但是,Ajax有一个缺点,就是他不允许跨域请求资源. 如果我的 ...

随机推荐

  1. MySQL-删除数据(DELECT)

    数据库备份介绍: 数据库一旦删除数据,它就会永远消失. 因此,在执行DELETE语句之前,应该先备份数据库,以防万一要找回删除过的数据. MySQL提供了非常有用的工具,用于在服务器上本地备份或转储M ...

  2. Android学习笔记-保存数据的实现方法2-SharedPreferences

    Android下,数据的保存,前面介绍过了,把数据保存到内存以及SD卡上,这次我们就介绍一下,更为常用的采用SharedPreferences的方式来保存数据, 1,得到SharedPreferenc ...

  3. Java后端发出post请求带参数并接收返回的json

    核心代码: 参数格式: “key1=value1&key2=value2” /*** sendUrl    (远程请求的URL)* param    (远程请求参数)* JSONObject  ...

  4. 谈谈C++私有继承

    很多C++程序猿从来没用过私有继承来设计他的类.的确,假设是本该用私有继承的地方却用了公有继承.对程序的功能的实现并无影响. 但这样的误用是一种错位的描写叙述.会引起阅读者的误解,甚至会引起类的使用者 ...

  5. Linux ALSA声卡驱动之一:ALSA架构简介【转】

    本文转载自:http://blog.csdn.net/droidphone/article/details/6271122 声明:本博内容均由http://blog.csdn.net/droidpho ...

  6. luogu P4719 【模板】动态dp

    noip怎么考这种东西啊...看错题场上爆零凉了 首先我们先进行树链剖分,那么问题可以转换成重链的答案+其他子节点的答案 而每次修改相当于改一段重链的答案,改一次其他子节点的答案交替进行 这样只有一个 ...

  7. iOS 开发 公司开发者账号,在多台Mac上合作开发,共用一个账号和证书--图文详解

    参考 导出证书申请的MAC里的Xcode的开发者账号 .developerprofile 导出的开发者账号文件.developerprofile 导出PKCS12既是.p12文件 所拷贝的资料, .d ...

  8. SPOOL 命令使用实例【oracle导出纯文本格式文件】

    SPOOL 命令使用实例[oracle导出纯文本格式文件] SET echo off              --在用start命令执行一个sql脚本时,是否显示脚本中正在执行的SQL语句: SET ...

  9. ZOJ 3964 Yet Another Game of Stones Nim游戏变种

    ZOJ3964 解题思路 此题的题意比较容易理解,可以简单的看着 Nim 博弈的变种.但问题在于 Alice 对第 i 堆石子的取法必须根据 bi 确定.所以如果这个问题能够归结到正常的 Nim 博弈 ...

  10. oracle从子表取出前几行数据:

    取排序后的前几行,应该用: select * from(select * from test order by stamp desc) where rownum<= 6  (表示排序后取前几行) ...