rest接口如何適應jsonp的方案

rest接口如何適應jsonp的方案

我的要做的事很簡單,在html中,跨域調用一個rest接口,
後端接口實現使用Node(語言無關),rest接口都是返回json數據的,如果不在頁面上進行任何處理,是不可以在頁面是使用的。
直接給出方案,前端使用jquery,只需要將dataType改成jsonp,
其他的就和普通的axaj無差別了。前端代碼如下:

let url = "http://localhost:8888/dish/jsonp";

    $.ajax({
        type: "get",
        async: false,
        url: url,
        dataType: "jsonp",
        jsonp: "callback",//傳遞給請求處理程序或頁面的,用以獲得jsonp回調函數名的參數名(一般默認爲:callback)
        success: function (json) {
            console.log(json);
        },
        error: function () {
            console.log('fail');
        }
    });

如果這時候後端不做改變,直接返回JSON數據,控制檯要報錯的,因爲那樣的話後端並沒有返回調用函數。

// dish RESTful CURD操作
//普通rest
router.get('/dish', function (req, res) {
    log.d('controller', '/dish', '');
    dishDAO.list(function (result) {
        res.send(result);
    });
});
//適應jsonp的接口
router.get('/dish/jsonp', function (req, res) {
    //獲取函數名
    let callback = req.query.callback;
    dishDAO.list(function (result) {
        let json = JSON.stringify(result);
        //模擬函數調用
        let fn = callback+"("+json+")";
        res.send(fn);
    });
});

調用成功:
在這裏插入圖片描述

做任何項目,從維護的角度,都是代碼越少越好,能把代碼寫出來的從來不是高手,這是作爲一個coder的基礎,把代碼寫少的能力,需要大量的時間來積累經驗。
合二爲一

// dish RESTful CURD操作
router.get('/dish', function (req, res) {
    log.d('controller', '/dish', '');
    let callback = req.query.callback;
    //有回調錶示jsonp
    if(callback){
        dishDAO.list(function (result) {
            let json = JSON.stringify(result);
            //模擬函數調用
            let fn = callback+"("+json+")";
            res.send(fn);
        });
    }else{
        dishDAO.list(function (result) {
            res.send(result);
        });
    }
});

到這裏,一個jsonp的rest接口改造就完成了,主要是對jsonp 原理的理解,本來實現跨域請求的方式就是通過script 的src屬性來完成的,白話講就是兩個js腳本文件,一個裏面寫了接口調用返回值處理函數fn,另一個直接使用從服務器發一個函數調用過來,fn(data),data就是調用接口的返回值。然後jQuery的 作用就是添加第二個調用script標籤,並在success中執行後續邏輯處理。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章