【W(wǎng)eb開發(fā)】JSONP通信原理淺析
當(dāng)前位置:點(diǎn)晴教程→知識(shí)管理交流
→『 技術(shù)文檔交流 』
簡單說就是,將某JS方法的聲明和調(diào)用分別交給前端和后端,通過實(shí)參與形參間的傳值實(shí)現(xiàn)前后端通信。 這個(gè)方案乍看之下似乎有兩個(gè)問題,一個(gè)是這個(gè)“JS方法”是如何實(shí)現(xiàn)前后端同步的? 再就是后端服務(wù)器上的動(dòng)態(tài)腳本執(zhí)行環(huán)境怎么能調(diào)用前端瀏覽器上聲明的JS方法呢? 這里先回答第二個(gè)問題。那就是在這個(gè)情景下,說JS方法由后端調(diào)用,并不等于說執(zhí)行也是后端在做。 事實(shí)是,雖然調(diào)用是后端,但執(zhí)行其實(shí)還是在前端瀏覽器中。 而實(shí)現(xiàn)這種調(diào)用與執(zhí)行的分離,以及實(shí)現(xiàn)“JS方法”的同步,都是靠的一個(gè)相同的手段,那就是HTML的 script 標(biāo)簽。 這個(gè)script標(biāo)簽原本是用來通過http請求加載靜態(tài)的JavaScript腳本資源的。可是某個(gè)老六突發(fā)奇想,用script加載起動(dòng)態(tài)的JavaScript腳本,然后就誕生了JSONP的通信方式。 這里說的所謂“靜態(tài)的JavaScript腳本資源”,說的是放在服務(wù)器磁盤上一成不變的JavaScript文本資源,誰請求都是得到一個(gè)相同的副本,就像提前做好的預(yù)制菜一樣。 而所謂“動(dòng)態(tài)的JavaScript腳本資源”,就是說JavaScript文本資源并不是現(xiàn)成的,請求實(shí)際是發(fā)向一個(gè)后端運(yùn)行的“動(dòng)態(tài)腳本”,比如PHP、JSP之類的。然后JavaScript腳本則是由這些后端腳本再根據(jù)具體情況按需生成,整體而言就像“點(diǎn)菜現(xiàn)炒”。 具體說就是,這個(gè)“后端腳本”會(huì)根據(jù)http請求的具體參數(shù)的不同響應(yīng)返回不同的JavaScript腳本文本給瀏覽器端來執(zhí)行。 于是,那個(gè)計(jì)劃由“前端聲明后端調(diào)用”的JS方法的方法名便由前端創(chuàng)建,并由script標(biāo)簽發(fā)起的http請求的get參數(shù)同步給了后端。 接著,后端腳本則根據(jù)得到的JS方法名拼接一個(gè)對該方法進(jìn)行調(diào)用的JavaScript腳本片段,并將要傳輸給前端的數(shù)據(jù)作為此次調(diào)用的實(shí)參。 最后,這個(gè)由后端拼接的、帶著實(shí)參的“JS方法調(diào)用片段”便通過前端script標(biāo)簽發(fā)起的http請求的響應(yīng)報(bào)文從服務(wù)器返回給瀏覽器,并在瀏覽器端自動(dòng)執(zhí)行。 最終,在執(zhí)行的過程中,后端的數(shù)據(jù)便通過JS方法調(diào)用時(shí)的實(shí)參傳遞給了JS方法聲明時(shí)的形參,進(jìn)而進(jìn)入回調(diào)函數(shù),然后執(zhí)行具體的前端渲染邏輯。 JSONP的流行主要是為了繞過瀏覽器的“同源策略”,實(shí)現(xiàn)跨域請求。相比于CORS這種更標(biāo)準(zhǔn)和簡潔的方案,它的優(yōu)點(diǎn)就是兼容性好,不管多老的版本,只要支持JS的瀏覽器都支持JSONP。 -END-閱讀原文:原文鏈接 該文章在 2025/8/19 9:01:32 編輯過 |
關(guān)鍵字查詢
相關(guān)文章
正在查詢... |