JSONP(JSON with Padding 填充式 JSON 或参数式 JSON)
在 js 中,我们虽然不能直接用 XMLHttpRequest 请求不同域上的数据时,但是在页面上引入不同域上的 js 脚 本文件却是可以的,jsonp 正是利用这个特性来实现的。
JSONP 由两部分组成:回调函数和数据。回调函数是当响应到来时应该在页面中调用的函数,而数据就是传 入回调函数中的 JSON 数据。
<script type="text/javascript">
function dosomethins(jsondata) {
// 处理获得的json数据
}
</script>
<script src='http://example.com/data.php?callback=dosomthing'></script>
- 首先第一个script标签定义了一个处理数据的函数;
- 然后第二个script标签载入了一个js文件,http://example.com/data.php 是数据所在地址,但是因为是当做js来引入的,所以http://example.com/data.php 返回的必须是一个能执行的js文件。
- 最后js文件载入成功之后,会执行我们在url参数中指定的函数,并且把我们需要json数据作为参数传入,所以php文件如下:
<?php
$callback = $_GET('callback'); //得到回调函数名
$data = array('a', 'b', 'c'); //要返回的数据
echo $callback.'('.json_encode($data).')'; //输出
?>
JSONP的优缺点:
优点:
1.它的兼容性更好,在更加古老的浏览器中都可以运行,不需要 XMLHttpRequest 或 ActiveX 的支持;
2.能够直接访问响应文本,支持在浏览器与服务器之间双向通信
缺点:
1.JSONP 是从其他域中加载代码执行。如果其他域不安全,很可能会在响应中夹带一些恶意代码,而此时除了 完全放弃 JSONP 调用之外,没有办法追究。因此在使用不是你自己运维的 Web 服务时,一定得保证它安全可靠。
2.它只支持 GET 请求而不支持 POST 等其它类型的 HTTP 请求;它只支持跨域 HTTP 请求这种情况,不能解决 不同域的两个页面之间如何进行 JavaScript 调用的问题