jsonp格式前端發(fā)送和后臺(tái)接受寫法的代碼詳解
什么是JSONP?
先說(shuō)說(shuō)JSONP是怎么產(chǎn)生的:
其實(shí)網(wǎng)上關(guān)于JSONP的講解有很多,但卻千篇一律,而且云里霧里,對(duì)于很多剛接觸的人來(lái)講理解起來(lái)有些困難,小可不才,試著用自己的方式來(lái)闡釋一下這個(gè)問(wèn)題,看看是否有幫助。
1、一個(gè)眾所周知的問(wèn)題,Ajax直接請(qǐng)求普通文件存在跨域無(wú)權(quán)限訪問(wèn)的問(wèn)題,甭管你是靜態(tài)頁(yè)面、動(dòng)態(tài)網(wǎng)頁(yè)、web服務(wù)、WCF,只要是跨域請(qǐng)求,一律不準(zhǔn);
2、不過(guò)我們又發(fā)現(xiàn),Web頁(yè)面上調(diào)用js文件時(shí)則不受是否跨域的影響(不僅如此,我們還發(fā)現(xiàn)凡是擁有"src"這個(gè)屬性的標(biāo)簽都擁有跨域的能力,比如<script>、<img>、<iframe>);
3、于是可以判斷,當(dāng)前階段如果想通過(guò)純web端(ActiveX控件、服務(wù)端代理、HTML5之Websocket等方式不算)跨域訪問(wèn)數(shù)據(jù)就只有一種可能,那就是在遠(yuǎn)程服務(wù)器上設(shè)法把數(shù)據(jù)裝進(jìn)js格式的文件里,供客戶端調(diào)用和進(jìn)一步處理;
4、恰巧我們已經(jīng)知道有一種叫做JSON的純字符數(shù)據(jù)格式可以簡(jiǎn)潔的描述復(fù)雜數(shù)據(jù),更妙的是JSON還被js原生支持,所以在客戶端幾乎可以隨心所欲的處理這種格式的數(shù)據(jù);
5、這樣子解決方案就呼之欲出了,web客戶端通過(guò)與調(diào)用腳本一模一樣的方式,來(lái)調(diào)用跨域服務(wù)器上動(dòng)態(tài)生成的js格式文件(一般以JSON為后綴),顯而易見(jiàn),服務(wù)器之所以要?jiǎng)討B(tài)生成JSON文件,目的就在于把客戶端需要的數(shù)據(jù)裝入進(jìn)去。
6、客戶端在對(duì)JSON文件調(diào)用成功之后,也就獲得了自己所需的數(shù)據(jù),剩下的就是按照自己需求進(jìn)行處理和展現(xiàn)了,這種獲取遠(yuǎn)程數(shù)據(jù)的方式看起來(lái)非常像AJAX,但其實(shí)并不一樣。
7、為了便于客戶端使用數(shù)據(jù),逐漸形成了一種非正式傳輸協(xié)議,人們把它稱作JSONP,該協(xié)議的一個(gè)要點(diǎn)就是允許用戶傳遞一個(gè)callback參數(shù)給服務(wù)端,然后服務(wù)端返回?cái)?shù)據(jù)時(shí)會(huì)將這個(gè)callback參數(shù)作為函數(shù)名來(lái)包裹住JSON數(shù)據(jù),這樣客戶端就可以隨意定制自己的函數(shù)來(lái)自動(dòng)處理返回?cái)?shù)據(jù)了。
什么是JSON?
前面簡(jiǎn)單說(shuō)了一下,JSON是一種基于文本的數(shù)據(jù)交換方式,或者叫做數(shù)據(jù)描述格式,你是否該選用他首先肯定要關(guān)注它所擁有的優(yōu)點(diǎn)。
JSON的優(yōu)點(diǎn):
1、基于純文本,跨平臺(tái)傳遞極其簡(jiǎn)單;
2、Javascript原生支持,后臺(tái)語(yǔ)言幾乎全部支持;
3、輕量級(jí)數(shù)據(jù)格式,占用字符數(shù)量極少,特別適合互聯(lián)網(wǎng)傳遞;
4、可讀性較強(qiáng),雖然比不上XML那么一目了然,但在合理的依次縮進(jìn)之后還是很容易識(shí)別的;
5、容易編寫和解析,當(dāng)然前提是你要知道數(shù)據(jù)結(jié)構(gòu);
JSON的缺點(diǎn)當(dāng)然也有,但在作者看來(lái)實(shí)在是無(wú)關(guān)緊要的東西,所以不再單獨(dú)說(shuō)明。
好了,回歸正題,
jsonp是ajax提交的一種格式不會(huì)受跨域限制
一.前端發(fā)送
<button>11111</button>
<script src="https://cdn.static.runoob.com/libs/jquery/1.8.3/jquery.js"></script>
<script>
document.querySelector('button').onclick = function () {
$.ajax({
url: 'http://localhost:8000/test',
type: 'get',
dataType: 'jsonp',
data: { //注意內(nèi)容必須為字典
aaa:aaa //字典里內(nèi)容前面key可以不加"",默認(rèn)會(huì)給你加上""變成字符串但是不會(huì)當(dāng)成變量
}, //字典后面value有''為字符串,沒(méi)有為變量
success: function (data) {
console.log(data);
}
});
}
</script>
二.后臺(tái)接受
#我就拿python舉例,其他也大同小異
from django.shortcuts import render,HttpResponse,redirect
def test(request):
callback=request.GET.get('callback')
print(dict(request.GET)) #傳過(guò)來(lái)的內(nèi)容他會(huì)打散,具體的自己看一下就知道
#注意點(diǎn)返回的字符串必須是 'callback+("返回的字符串")' 這樣的一個(gè)字符串,不然前端不會(huì)接收
return HttpResponse(callback+'("ok")')
總結(jié)
以上所述是小編給大家介紹的jsonp格式前端發(fā)送和后臺(tái)接受寫法的代碼詳解,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
如果你覺(jué)得本文對(duì)你有幫助,歡迎轉(zhuǎn)載,煩請(qǐng)注明出處,謝謝!
相關(guān)文章
使用Taro實(shí)現(xiàn)小程序商城的購(gòu)物車功能模塊的實(shí)例代碼
這篇文章主要介紹了使用Taro實(shí)現(xiàn)的小程序商城的購(gòu)物車功能模塊,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-06-06
微信小程序的引導(dǎo)頁(yè)實(shí)現(xiàn)代碼
這篇文章主要介紹了微信小程序的引導(dǎo)頁(yè)實(shí)現(xiàn)代碼,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-06-06
js鼠標(biāo)滑過(guò)彈出層的定位IE6bug解決辦法
大家在寫div+css的時(shí)候經(jīng)常會(huì)用到彈出層,由于IE6的bug,所以當(dāng)使用多個(gè)標(biāo)簽重復(fù)寫彈出層的時(shí)候會(huì)遇到后面的層壓在了彈出層的上面;用Jquery給彈出層的z軸依次增加高度可解決.代碼很簡(jiǎn)單,效果很顯著,需要了解的朋友可以參考下2012-12-12
JS實(shí)現(xiàn)字符串去重及數(shù)組去重的方法示例
這篇文章主要介紹了JS實(shí)現(xiàn)字符串去重及數(shù)組去重的方法,涉及javascript針對(duì)字符串與數(shù)組的遍歷、判斷、刪除、添加等相關(guān)操作技巧,需要的朋友可以參考下2018-04-04
微信小程序獲取用戶手機(jī)號(hào)碼詳細(xì)教程(前端+后端)
在我們開(kāi)發(fā)微信小程序時(shí),獲取用戶手機(jī)號(hào)碼是常見(jiàn)的需求之一,這篇文章主要給大家介紹了關(guān)于微信小程序獲取用戶手機(jī)號(hào)碼的相關(guān)資料,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下2024-02-02
利用Axios實(shí)現(xiàn)無(wú)感知雙Token刷新的詳細(xì)教程
在現(xiàn)代系統(tǒng)中,Token認(rèn)證已成為保障用戶安全的標(biāo)準(zhǔn)做法,然而,盡管許多系統(tǒng)采用了這種認(rèn)證方式,卻在處理Token刷新方面存在不足,導(dǎo)致用戶體驗(yàn)不佳,許多系統(tǒng)未能提供一種無(wú)縫的、用戶無(wú)感知的Token刷新機(jī)制,所以本文介紹了教你用Axios實(shí)現(xiàn)無(wú)感知雙Token刷新2024-08-08
前端異步同步處理應(yīng)用場(chǎng)景及優(yōu)化詳細(xì)講解和舉例
前端開(kāi)發(fā)中異步與同步處理分別適用不同場(chǎng)景,異步操作如網(wǎng)絡(luò)請(qǐng)求、文件讀寫等,而同步處理適用于簡(jiǎn)單、線性任務(wù),異步處理可通過(guò)回調(diào)函數(shù)、Promise、async/await等方式優(yōu)化,提高代碼效率和可維護(hù)性,需要的朋友可以參考下2024-10-10
Openlayers實(shí)現(xiàn)根據(jù)半徑繪制圓形
這篇文章主要介紹了利用Openlayers實(shí)現(xiàn)繪制三個(gè)圓形,繪制完成之后,三個(gè)圓心連接起來(lái),然后標(biāo)記出每?jī)蓚€(gè)圓心之間的距離,感興趣的可以了解一下2022-08-08

