一、PHP寫jsonp
如果你的網(wǎng)站或者應(yīng)用需要調(diào)用第三方接口并且獲取返回的數(shù)據(jù),可能會遇到瀏覽器同源策略的限制。這時候jsonp(JSON with Padding)就派上用場了,它通過在URL末尾傳遞一個callback函數(shù)名,讓服務(wù)端返回JavaScript代碼,從而讓瀏覽器可以讀取到數(shù)據(jù)。PHP作為一種流行的Server Side Scripting語言,可以通過簡單的代碼實(shí)現(xiàn)jsonp。
例如,我們要請求新浪微博API中的熱門微博數(shù)據(jù),由于新浪微博API不允許直接跨域訪問,我們可以這樣進(jìn)行處理:
$callback = isset($_GET['callback']) ? $_GET['callback'] : 'callback';
$api_url = 'https://api.weibo.com/2/statuses/hot.json?count=5&source=140226478';
$content = file_get_contents($api_url);
echo $callback.'('. $content .')';
這里我們首先判斷參數(shù)中是否含有callback函數(shù)名,如果有則使用該函數(shù)名,否則默認(rèn)使用callback作為函數(shù)名。然后使用file_get_contents()函數(shù)獲取新浪微博API返回的數(shù)據(jù),最后通過echo返回jsonp格式的內(nèi)容。
二、實(shí)現(xiàn)jsonp回調(diào)函數(shù)
在上述例子中,我們可以看到使用了callback函數(shù)名作為參數(shù)傳遞。當(dāng)瀏覽器接收到服務(wù)器端返回的數(shù)據(jù)時,會去尋找名為callback的函數(shù)并執(zhí)行,從而實(shí)現(xiàn)回調(diào)的目的。
例如:
function jsonp_cb(data) {
console.log(data);
}
<script src="jsonp.php?callback=jsonp_cb"></script>
我們定義了一個名為jsonp_cb的JavaScript函數(shù),并將其作為callback參數(shù)傳遞給服務(wù)端的jsonp.php文件。服務(wù)端返回了JSON格式的數(shù)據(jù),并調(diào)用了jsonp_cb函數(shù),從而在瀏覽器控制臺輸出了獲取到的數(shù)據(jù)。這種方式在前端開發(fā)中非常常見。
三、PHP避免XSS攻擊
jsonp格式是一種前后端分離的技術(shù),服務(wù)端只負(fù)責(zé)返回數(shù)據(jù),而不負(fù)責(zé)渲染HTML。因此,我們需要注意防范XSS攻擊。在進(jìn)行數(shù)據(jù)處理時,我們可以使用htmlentities()或htmlspecialchars()等函數(shù)對數(shù)據(jù)進(jìn)行轉(zhuǎn)義處理,從而避免惡意用戶插入攻擊代碼破壞頁面。
$callback = isset($_GET['callback']) ? $_GET['callback'] : 'callback';
$api_url = 'https://api.weibo.com/2/statuses/hot.json?count=5&source=140226478';
$content = file_get_contents($api_url);
$content = htmlentities($content, ENT_QUOTES, 'UTF-8');
echo $callback.'('. $content .')';
使用htmlentities()函數(shù)對$content中的數(shù)據(jù)進(jìn)行了HTML實(shí)體化轉(zhuǎn)換,防止了特殊字符被解釋成HTML代碼。
四、小結(jié)
PHP作為一種流行的Server Side Scripting語言,可以用來編寫jsonp接口。在實(shí)現(xiàn)jsonp接口時,我們需要注意避免XSS攻擊,將特殊字符進(jìn)行轉(zhuǎn)義處理。同時,在使用jsonp技術(shù)時,要注意跨站腳本攻擊的風(fēng)險,防止惡意代碼的插入。通過本文的介紹,相信大家對PHP寫jsonp有了更深入的了解。