五分鐘學(xué)會(huì)Jsonp,太簡(jiǎn)單了

1 什么是Jsonp?

JSONP(JSON with Padding)是數(shù)據(jù)格式JSON的一種“使用模式”鸯旁,可以讓網(wǎng)頁從別的網(wǎng)域要數(shù)據(jù)铺罢。另一個(gè)解決這個(gè)問題的新方法是跨來源資源共享。

由于同源策略缩滨,一般來說位于server1.example.com的網(wǎng)頁無法與不是 server1.example.com的服務(wù)器溝通辞居,而HTML的 < script >元素是一個(gè)例外瓦灶。利用 < script >元素的這個(gè)開放策略,網(wǎng)頁可以得到從其他來源動(dòng)態(tài)產(chǎn)生的JSON數(shù)據(jù)刃泡,而這種使用模式就是所謂的 JSONP烘贴。用JSONP抓到的數(shù)據(jù)并不是JSON撮胧,而是任意的JavaScript,用 JavaScript解釋器運(yùn)行而不是用JSON解析器解析芹啥。

2 Jsonp基本原理

為了理解這種模式的原理墓怀,先想像有一個(gè)回傳JSON文件的URL,而JavaScript 程序可以用XMLHttpRequest跟這個(gè)URL要數(shù)據(jù)虱朵。假設(shè)我們的URL是 http://tools.42du.cn/jsonp/student/3 碴犬。假設(shè)iFat3的st_no是3,當(dāng)瀏覽器通過URL傳遞iFat3的st_id羞福,也就是抓取http://tools.42du.cn/jsonp/student/3蚯涮,得到:

{"st_no":3,"st_name":"iFat3","st_desc":"iFat3是學(xué)校的超級(jí)學(xué)渣"}

這個(gè)JSON數(shù)據(jù)可能是依據(jù)傳過去URL的查詢參數(shù)動(dòng)態(tài)產(chǎn)生的遭顶。

這個(gè)時(shí)候棒旗,把 < script >元素的src屬性設(shè)成一個(gè)回傳JSON的URL是可以想像的,這也代表從HTML頁面通過script元素抓取 JSON是可能的饶深。

然而敌厘,一份JSON文件并不是一個(gè)JavaScript程序朽合。為了讓瀏覽器可以在 < script >元素運(yùn)行曹步,從src里URL 回傳的必須是可運(yùn)行的JavaScript。在JSONP的使用模式里尿孔,該URL回傳的是由函數(shù)調(diào)用包起來的動(dòng)態(tài)生成JSON纳猫,這就是JSONP的“填充(padding)”或是“前輟(prefix)”的由來。

慣例上瀏覽器提供回調(diào)函數(shù)的名稱當(dāng)作送至服務(wù)器的請(qǐng)求中命名查詢參數(shù)的一部分尚骄,例如:

 <script type="text/javascript"
    src="http://tools.42du.cn/jsonp/student/3?callback=callback>
 </script>

服務(wù)器會(huì)在傳給瀏覽器前將JSON數(shù)據(jù)填充到回調(diào)函數(shù)(callback)中绳匀。瀏覽器得到的回應(yīng)已不是單純的數(shù)據(jù)敘述而是一個(gè)腳本棋傍。在本例中耐朴,瀏覽器得到的是:

/**/callback({"st_no":3,"st_name":"iFat3","st_desc":"iFat3是學(xué)校的超級(jí)學(xué)渣"});

3 服務(wù)端生成Jsonp

本例中的Jsonp利用的是Spring Framework的JSonp處理部分生成颜曾,詳細(xì)內(nèi)容請(qǐng)閱讀官方文檔泽示。鏈接見相關(guān)資料中的spring部分械筛,本人強(qiáng)烈建意您在實(shí)際開發(fā)過程中埋哟,先閱讀官方文檔,再進(jìn)行代碼編寫赤赊。

3.1 模型(model)對(duì)象

Student模型對(duì)象的get和set方法未列出抛计。

public class Student extends BaseBean implements Serializable {
    private Integer st_no;
    private String st_name;
    private String st_desc;
}

3.2 spring的Jsonp處理

@ControllerAdvice
@RequestMapping("/jsonp")
public class StudentJsonpAdvice extends AbstractJsonpResponseBodyAdvice {
    private List<Student> students = new ArrayList<Student>();
    public StudentJsonpAdvice() {
        super("callback");
        initData();
    }
    @RequestMapping(value="/student/all",method= RequestMethod.GET)
    @ResponseBody
    public List<Student> list(){
        return students;
    }
    @RequestMapping(value="/student/{st_no}",method= RequestMethod.GET)
    @ResponseBody
    public Student info(@PathVariable Integer st_no){
        if(st_no != null) {
            if(st_no > 0 && st_no <4) {
                return students.get(st_no -1);
            }
            return students.get(0);
        }
        return null;
    }
    private void initData() {
        Student st1 = new Student(1,"王美麗","王美麗是學(xué)校的幸瑁花");
        Student st2 = new Student(2,"毛三胖","毛三胖是學(xué)校的學(xué)霸");
        Student st3= new Student(3,"iFat3","iFat3是學(xué)校的超級(jí)學(xué)渣");
        students.add(st1);
        students.add(st2);
        students.add(st3);
    }
}

4 客戶端取得Jsonp數(shù)據(jù)

利用JQuery的ajax方法取得所有學(xué)生的數(shù)據(jù)录豺,并利用回調(diào)函數(shù)(callback)將數(shù)據(jù)插入到頁面中。更多JQuery的ajax方法參見相關(guān)資料中的JQuery部分饭弓。

function callback(data) {
        $(data).each(function(i,item){
            $("#stu_ul").append("<li>"+item.st_name+"</li>");
        });
    }
    $(document).ready(function () {
        $.ajax({
            type:"get",
            dataType:"jsonp",
            url:"http://tools.42du.cn/jsonp/student/all",
            jsonpCallback:"callback"
        });
    })

5 相關(guān)資料

Spring處理Jsonp文檔

JQuery Ajax官方文檔

維基Jsonp條目

菜鳥Jsonp教程

JSON中文介紹

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末双饥,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子弟断,更是在濱河造成了極大的恐慌咏花,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,997評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件阀趴,死亡現(xiàn)場(chǎng)離奇詭異昏翰,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)刘急,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,603評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門棚菊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人折剃,你說我怎么就攤上這事∽喔Γ” “怎么了?”我有些...
    開封第一講書人閱讀 163,359評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵腾么,是天一觀的道長攘须。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么谱俭? 我笑而不...
    開封第一講書人閱讀 58,309評(píng)論 1 292
  • 正文 為了忘掉前任凑懂,我火速辦了婚禮杭攻,結(jié)果婚禮上跑揉,老公的妹妹穿的比我還像新娘。我一直安慰自己望侈,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,346評(píng)論 6 390
  • 文/花漫 我一把揭開白布鹃锈。 她就那樣靜靜地躺著仅政,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上秸讹,一...
    開封第一講書人閱讀 51,258評(píng)論 1 300
  • 那天劣欢,我揣著相機(jī)與錄音,去河邊找鬼笛匙。 笑死蠢正,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的有鹿。 我是一名探鬼主播源梭,決...
    沈念sama閱讀 40,122評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了慎冤?” 一聲冷哼從身側(cè)響起蚁堤,我...
    開封第一講書人閱讀 38,970評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后挨摸,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,403評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡推沸,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,596評(píng)論 3 334
  • 正文 我和宋清朗相戀三年猴伶,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片崔挖。...
    茶點(diǎn)故事閱讀 39,769評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡古沥,死狀恐怖盹沈,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情岗憋,我是刑警寧澤悍缠,帶...
    沈念sama閱讀 35,464評(píng)論 5 344
  • 正文 年R本政府宣布廊蜒,位于F島的核電站山叮,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜席舍,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,075評(píng)論 3 327
  • 文/蒙蒙 一鲁冯、第九天 我趴在偏房一處隱蔽的房頂上張望衡创。 院中可真熱鬧,春花似錦晶通、人聲如沸璃氢。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,705評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽一也。三九已至,卻和暖如春喉脖,著一層夾襖步出監(jiān)牢的瞬間椰苟,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,848評(píng)論 1 269
  • 我被黑心中介騙來泰國打工树叽, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留舆蝴,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,831評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像洁仗,于是被迫代替她去往敵國和親层皱。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,678評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理京痢,服務(wù)發(fā)現(xiàn)奶甘,斷路器,智...
    卡卡羅2017閱讀 134,654評(píng)論 18 139
  • JavaScript是一種在Web開發(fā)中經(jīng)常使用的前端動(dòng)態(tài)腳本技術(shù)祭椰。在JavaScript中臭家,有一個(gè)很重要的...
    西瓜w閱讀 1,763評(píng)論 0 1
  • 在線閱讀 http://interview.poetries.top[http://interview.poetr...
    程序員poetry閱讀 114,363評(píng)論 24 450
  • AJAX 原生js操作ajax 1.創(chuàng)建XMLHttpRequest對(duì)象 var xhr = new XMLHtt...
    碧玉含香閱讀 3,196評(píng)論 0 7
  • 以客戶為中心 還是 以員工為中心? 客戶需求非常緊迫和復(fù)雜方淤,我們的員工能力無法滿足钉赁,這種情況怎么辦?這個(gè)矛盾怎么解...
    金石為開之閱讀 2,820評(píng)論 0 0