JSONP(JSON with Padding 填充式 JSON 或參數式 JSON)
在 js 中,我們雖然不能直接用 XMLHttpRequest 請求不同域上的數據時,但是在頁面上引入不同域上的 js 腳 本文件卻是可以的,jsonp 正是利用這個特性來實現(xiàn)的。
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 返回的必須是一個能執(zhí)行的js文件。
- 最后js文件載入成功之后,會執(zhí)行我們在url參數中指定的函數,并且把我們需要json數據作為參數傳入,所以php文件如下:
<?php
$callback = $_GET('callback'); //得到回調函數名
$data = array('a', 'b', 'c'); //要返回的數據
echo $callback.'('.json_encode($data).')'; //輸出
?>
JSONP的優(yōu)缺點:
優(yōu)點:
1.它的兼容性更好,在更加古老的瀏覽器中都可以運行,不需要 XMLHttpRequest 或 ActiveX 的支持;
2.能夠直接訪問響應文本,支持在瀏覽器與服務器之間雙向通信
缺點:
1.JSONP 是從其他域中加載代碼執(zhí)行。如果其他域不安全,很可能會在響應中夾帶一些惡意代碼,而此時除了 完全放棄 JSONP 調用之外,沒有辦法追究。因此在使用不是你自己運維的 Web 服務時,一定得保證它安全可靠。
2.它只支持 GET 請求而不支持 POST 等其它類型的 HTTP 請求;它只支持跨域 HTTP 請求這種情況,不能解決 不同域的兩個頁面之間如何進行 JavaScript 調用的問題