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中執行後續邏輯處理。