JSONP是一種基于JSON的跨域數(shù)據(jù)請(qǐng)求方式,常見(jiàn)于跨域數(shù)據(jù)的訪問(wèn),而jsonp.php則是一種JSONP的實(shí)現(xiàn)方式之一。在開(kāi)發(fā)過(guò)程中,我們經(jīng)常會(huì)遇到通過(guò)AJAX請(qǐng)求數(shù)據(jù)時(shí)遇到跨域問(wèn)題的情況。這時(shí)就可以使用JSONP來(lái)解決跨域請(qǐng)求的問(wèn)題。
JSONP是利用script標(biāo)簽可以跨域訪問(wèn)的特性,我們可以通過(guò)在script標(biāo)簽的src屬性中添加指向服務(wù)器端的URL,返回的數(shù)據(jù)為JSON格式,這樣可以繞過(guò)跨域限制而成功獲取到請(qǐng)求的數(shù)據(jù)。
<script> function getData(data){ console.log(data); } </script> <script src="http://www.example.com/jsonp.php?callback=getData"></script>
以上代碼展示了如何使用JSONP實(shí)現(xiàn)跨域請(qǐng)求數(shù)據(jù),其中的jsonp.php文件就是我們需要配置的文件。這個(gè)文件需要接受callback參數(shù),并將請(qǐng)求的數(shù)據(jù)以callback的形式返回。
$data = array('name'=>'Tom', 'age'=>'22'); $callback = $_GET['callback']; echo $callback.'('.json_encode($data).')';
看到以上代碼,應(yīng)該能夠理解JSONP的基本原理了。首先,根據(jù)前端url中callback參數(shù)的名稱(chēng),可以獲取到回調(diào)函數(shù)的名稱(chēng);然后,根據(jù)獲取到的回調(diào)函數(shù)名稱(chēng),將需要被返回的數(shù)據(jù)拼裝成一個(gè)回調(diào)函數(shù)的參數(shù)值,最后返回一個(gè)被回調(diào)函數(shù)所包含的JSON數(shù)據(jù)。
對(duì)于jsonp.php文件的編寫(xiě),我們需要注意一些細(xì)節(jié)問(wèn)題。例如,在處理callback參數(shù)時(shí),需要對(duì)它進(jìn)行過(guò)濾以防止XSS攻擊,不當(dāng)?shù)倪^(guò)濾會(huì)帶來(lái)安全隱患。
$callback = preg_replace('/[^a-zA-Z0-9_]/s','', $_GET['callback']);
此外,在實(shí)際應(yīng)用中,也可以通過(guò)將callback請(qǐng)求參數(shù)與一個(gè)隨機(jī)生成的字符串拼接起來(lái),作為回調(diào)函數(shù)的名稱(chēng),這樣能夠避免因?yàn)閏allback名稱(chēng)固定帶來(lái)的緩存問(wèn)題。
$callback = $_GET['callback'].'_'.uniqid();
當(dāng)然,jsonp.php的應(yīng)用也還有很多其他方面的把控,例如對(duì)于返回的數(shù)據(jù)格式、http狀態(tài)碼、錯(cuò)誤處理等等都需要我們?cè)趹?yīng)用中做好相應(yīng)的控制和處理。
綜上所述,jsonp.php是一種非常值得探討和應(yīng)用的一種數(shù)據(jù)請(qǐng)求方式。在開(kāi)發(fā)中,如果遇到跨域請(qǐng)求數(shù)據(jù)的問(wèn)題,不妨嘗試使用jsonp.php實(shí)現(xiàn),相信它會(huì)是一個(gè)很好的解決方案。