一、安装引用
安装:
npm install vue-resource --save-dev
引用:
/*引入Vue框架*/ import Vue from 'vue' /*引入资源请求插件*/ import VueResource from 'vue-resource' /*使用VueResource插件*/ Vue.use(VueResource)
二、简单语法
引入vue-resource后,可以基于全局的Vue对象使用http,也可以基于某个Vue实例使用http
// 基于全局Vue对象使用http Vue.http.get('/someUrl', [options]).then(successCallback, errorCallback); Vue.http.post('/someUrl', [body], [options]).then(successCallback, errorCallback); // 在一个Vue实例内使用$http this.$http.get('/someUrl', [options]).then(successCallback, errorCallback); this.$http.post('/someUrl', [body], [options]).then(successCallback, errorCallback);
// 传统写法 this.$http.get('/Url', [options]).then(function(response){ // 响应成功回调 }, function(response){ // 响应错误回调 }); // ES6写法 this.$http.get('/Url', [options]).then((response) => { // 响应成功回调 }, (response) => { // 响应错误回调 });
1.有7种符合REST风格的请求API:
get(url, [options]) head(url, [options]) delete(url, [options]) jsonp(url, [options]) post(url, [body], [options]) put(url, [body], [options]) patch(url, [body], [options])
2.options对象:
3.emulateHTTP
如果Web服务器无法处理PUT, PATCH和DELETE这种REST风格的请求,你可以启用enulateHTTP现象。启用该选项后,请求会以普通的POST方法发出,并且HTTP头信息的X-HTTP-Method-Override属性会设置为实际的HTTP方法。
Vue.http.options.emulateHTTP = true;
4.emulateJSON
如果Web服务器无法处理编码为application/json的请求,你可以启用emulateJSON选项。启用该选项后,请求会以application/x-www-form-urlencoded作为MIME type,就像普通的HTML表单一样。
Vue.http.options.emulateJSON = true;
三、实例
var demo = new Vue({ el: '#app', data: { gridColumns: ['customerId', 'companyName', 'contactName', 'phone'], gridData: [], apiUrl: 'http://127.0.0.1:8080/api/customers' }, mounted: function() { this.getCustomers() }, methods: { getCustomers: function() { this.$http.get(this.apiUrl).then((response) => { this.$set('gridData', response.data) },(response) => { console.log("出错了"); }).catch(function(response) { console.log(response) }) } } });
then方法里提供了successCallback
,errorCallback
。catch方法用于捕捉程序的异常,catch方法和errorCallback
是不同的,errorCallback
只在响应失败时调用,而catch则是在整个请求到响应过程中,只要程序出错了就会被调用。
在then方法的回调函数内,你也可以直接使用this,this仍然是指向Vue实例的。为了减少作用域链的搜索,建议使用一个局部变量来接收this。
四、inteceptor拦截器
拦截器可以在请求发送前和发送请求后做一些处理。在response返回给successCallback或errorCallback之前,你可以修改response中的内容,或做一些处理。 例如,响应的状态码如果是404,你可以显示友好的404界面。再比如我们就用拦截器做了登录处理,所以请求发送之前都要通过拦截器验证当前用户是否登陆,否则提示登录页面。
Vue.http.interceptors.push(function(request, next) { // ... // 请求发送前的处理逻辑 // ... next(function(response) { // ... // 请求发送后的处理逻辑 // ... // 根据请求的状态,response参数会返回给successCallback或errorCallback return response }) })
1)为请求添加loading效果
通过inteceptor
,我们可以为所有的请求处理加一个loading
:请求发送前显示loading
,接收响应后隐藏loading。
//1、添加一个loading组件 <template id='loading-template'> <div class='loading-overlay'></div> </template> //2、将loading组件作为另外一个Vue实例的子组件 var help = new Vue({ el: '#help', data: { showLoading: false }, components: { 'loading': { template: '#loading-template', } } }) //3、将该Vue实例挂载到某个HTML元素 <div id='help'> <loading v-show='showLoading'></loading> </div> //4、添加inteceptor Vue.http.interceptors.push((request, next) => { loading.show = true; next((response) => { loading.show = false; return response; }); });
2)为请求添加共同的错误处理方法
//1、继续沿用上面的loading组件,在#help元素下加一个对话框 <div id='help'> <loading v-show='showLoading' ></loading> <modal-dialog :show='showDialog'> <header class='dialog-header' slot='header'> <h3 class='dialog-title'>Server Error</h3> </header> <div class='dialog-body' slot='body'> <p class='error'>Oops,server has got some errors, error code: {{errorCode}}.</p> </div> </modal-dialog> </div> //2、给help实例的data选项添加两个属性 var help = new Vue({ el: '#help', data: { showLoading: false, showDialog: false, errorCode: '' }, components: { 'loading': { template: '#loading-template', } } }) //3、修改inteceptor Vue.http.interceptors.push((request, next) => { help.showLoading = true; next((response) => { if(!response.ok){ help.errorCode = response.status; help.showDialog = true; } help.showLoading = false; return response; }); });