Vue2.0筆記——Ajax,JSONP跨域
vue本身不支持發送AJAX請求,需要使用vue-resource、axios等插件實現。
axios是一個基於Promise的HTTP請求客戶端,用來發送請求,也是vue2.0官方推薦的,同時不再對vue-resource進行更新和維護。
參考GitHub上的axios,dist目錄下的文件就是axios.min.js。
語法:
axios([options])
axios.get(url[,options])
傳參方式:
1.通過url傳參
2.通過params選項傳參
案例:axios([options])
data:{ id:1001 }, methods:{ sendAjax(){ axios({ method:‘get‘, url:‘https://api.github.com/users/‘ + vm.id }).then(function(resp){ //表示請求成功,將執行的回調函數 console.log(resp.data); vm.user=resp.data; }).catch(function(){ //請求失敗,將執行的回調函數 console.log(‘請求失敗‘ + resp.status + ‘,‘ + resp.statusText); }); } }
在這個代碼中,github是一個開源網站,所以可以訪問到用戶的信息。
1.vm.id表示vm引用當前Vue實例的屬性,在後面Vue實例中說明。
2.axios表示執行ajax請求,method選項表示請求方式,url表示請求路徑。
3..then回調函數,表示請求成功將被執行,resp為請求成功返回的數據。
4.catch表示請求失敗將被執行的回調函數。。
axiso.get(url[,options])
與其類似,但需要註意,第一個參數為url,後面才是選項。
sendAjaxGet(){ axios.get(‘/user‘,{ params:{ id:1001 } }).then(function(resp){ console.log(resp.data); vm.user=resp.data; }).catch(function(){ console.log(‘請求失敗‘ + resp.status + ‘,‘ + resp.statusText); }); }
axios.post(url,data,[options])
post方式請求,第一個參數為請求路徑,第二個參數直接就是需要傳遞的數據,格式為json格式,後面的為選項。
sendAjaxPost(){ axios.post(‘server.php‘,{ name:‘KaiEr‘, age:19 }).then(function(resp){ console.log(resp.data); }).catch(function(){ console.log(‘請求失敗‘ + resp.status + ‘,‘ + resp.statusText); }); }
還有其他的Request Config請求配置
如:transformRequest
transformRequest: [function (data, headers) {
// Do whatever you want to transform the data
return data;
}],
按照文檔的意思是說,在請求數據發到服務器之前對其進行更改,僅適用於‘PUT‘,‘POST‘和‘PATCH‘。
該值為數組, 數組中最後一個函數應返回一個字符串或Buffer,ArrayBuffer實例。其實返回字符串就可以。
該函數接收的data參數表示傳遞的數據,即post方式請求的第二個參數。
<br/>
還有如
- timeout:表示請求超時的毫秒數
- heads:自定義頭部文件
- responseType:響應類型
- responseEncoding:響應編碼格式
等等,都可以在Github的axios項目的README.md文件中查看文檔。
GitHub的axios開源項目
JSONP跨域請求
axios本身並不支持發送跨域的請求,沒有提供相應的API。
盡管vue-resource不再維護,但是還可以使用它來進行跨域請求。您可以考慮使用Jquery.js來進行跨域請求和Ajax請求。然而還有其他使用ajax跨域的更好方法。我們只是說明Vue也可以支持此功能,但如果需要,你任然可以選擇。
引入vue-resource.js文件,可以訪問Github的vue-resource項目
文檔語法:
this.$http.jsonp(‘/someUrl‘, [config]).then(successCallback, errorCallback);
this.$http.get(‘/someUrl‘, [config]).then(successCallback, errorCallback);
- get(url, [config])
- head(url, [config])
- delete(url, [config])
- jsonp(url, [config])
- post(url, [body], [config])
- put(url, [body], [config])
- patch(url, [body], [config])
Example:
{
// GET /someUrl
this.$http.get(‘/someUrl‘).then(response => {
// get body data
this.someData = response.body;
}, response => {
// error callback
});
}
案例:
通過跨域請求Baidu的搜索,打開百度,F12,輸入a字符,搜索,Ajax請求,network中找到這樣一條請求。
https://sp0.baidu.com/5a1Fazu8AA54nxGko9WTAnF6hhy/su?wd=a&json=1&p=3&sid=1444_12897_21084_26182_22158&req=2&csor=1&cb=jQuery110209410333632536945_1523889174484&_=1523889174489
wd代表搜索的單詞a,我們只需要前邊的。
另外我們可以在heads中看到百度使用的jsonp參數名為cb,所以需要修改。
sendJsonp(){
this.$http.jsonp(‘https://sp0.baidu.com/5a1Fazu8AA54nxGko9WTAnF6hhy/su‘,{
params:{
wd:‘a‘
},
jsonp:‘cb‘ //百度使用的jsonp參數名為cb,所以需要修改
}).then(resp => {
console.log(resp.data.s);
});
}
通過測試,發現可以得到結果
(10)?["愛奇藝", "阿裏雲", "安居客", "阿裏巴巴", "阿裏巴巴批發網", "愛奇藝網", "阿裏雲郵箱", "安卓模擬器", "愛思助手", "acfun"]
文檔訪問Github的vue-resource項目
另外,我也不怎麽建議使用這個跨域,況且也不是經常用到。
可以使用Jquery,document.domain + iframe跨域以及nodejs中間件代理跨域
Vue2.0筆記——Ajax,JSONP跨域