其實json和jsonp本質(zhì)上都是字符串,只是jsonp是外層包裹了一層函數(shù)。
json
下面是jquery的ajax請求,數(shù)據(jù)類型為json,它是以json格式在前后臺進(jìn)行數(shù)據(jù)的傳輸,它與局限性就是不能跨域請求,這是為了網(wǎng)絡(luò)數(shù)據(jù)的安全所制定的規(guī)則。
$.ajax({
type: "post", // 數(shù)據(jù)提交類型
url: "danmu.php",// 請求地址 同源服務(wù)器/瀏覽器安全設(shè)置
data: {word:"abc",username:"ltt"}, // 發(fā)送數(shù)據(jù)
dataType: "json", // 返回數(shù)據(jù)的類型
async: true, // 是否異步,true為異步
// success為數(shù)據(jù)加載完成后的回調(diào)函數(shù)
success: function(data){
var show = document.getElementById('show');
for(i in data){
show.innerHTML += data[i]+"<br>";
}
console.log(data);
}
});
這是后臺部分,首先判斷前臺是否請求數(shù)據(jù),如果請求了,就將前臺需要的數(shù)據(jù)返回給前臺。
注意:返回給前臺的數(shù)據(jù)一定要轉(zhuǎn)成json格式的,通過json_encode將數(shù)組轉(zhuǎn)換成json格式
<?php
if(!empty($_POST['word'])){
$arr = [];
$word = htmlspecialchars($_POST['word']);
$username = htmlspecialchars($_POST['username']);
$arr[] = $word;
$arr[] = $username;
$fp = fopen("danmu.txt","a+");
fwrite($fp,$word."\n");
fclose($fp);
echo json_encode(array($word));
}
?>
由于json不能跨域請求,于是就有了jsonp
jsonp
大家都知道script標(biāo)簽是可以跨域請求的,jsonp的原理就是通過script的src,將函數(shù)作為src請求地址的參數(shù)來傳遞數(shù)據(jù),所以jsonp只有g(shù)et一種傳輸方式。
下面是jsonp的數(shù)據(jù)交互,首先定義一個回調(diào)函數(shù),定義dataType類型為jsonp,將函數(shù)作為參數(shù)傳輸給后臺,它與json相比是多了一層函數(shù)。
<script type="text/javascript">
// 自定義的回調(diào)函數(shù)
function show(val){
document.getElementById("show").src=val[0].src;
}
$.ajax({
type:"get",
url:"myphp.php",
dataType:"jsonp", // 現(xiàn)在時jsonp請求,這個時候,jquery使用的是script標(biāo)簽發(fā)送請求
jsonp:"callmyphp", // 后臺用來接受函數(shù)名的變量名
jsonpCallback:"show",// 自定義的回調(diào)函數(shù)名
async:true,
});
至于什么時候用json什么時候用jsonp?我就一個原則,能使用json的時候都是用json,只有必須要跨域請求時才使用jsonp。