vue-resource全攻略

Vue.js——vue-resource全攻略

概述

上一篇我們介紹了如何將$.ajax和Vue.js結合在一起使用,并實現了一個簡單的跨域CURD示例。Vue.js是數據驅動的,這使得我們并不需要直接操作DOM,如果我們不需要使用jQuery的DOM選擇器,就沒有必要引入jquery。vue-resource是Vue.js的一款插件,它可以通過XMLHttpRequest或JSONP發起請求并處理響應。也就是說,$.ajax能做的事情,vue-resource插件一樣也能做到,而且vue-resource的API更為簡潔。另外,vue-resource還提供了非常有用的inteceptor功能,使用inteceptor可以在請求前和請求后附加一些行為,比如使用inteceptor在ajax請求時顯示loading界面。

本文的主要內容如下:

  • 介紹vue-resource的特點
  • 介紹vue-resource的基本使用方法
  • 基于this.$http的增刪查改示例
  • 基于this.$resource的增刪查改示例
  • 基于inteceptor實現請求等待時的loading畫面
  • 基于inteceptor實現請求錯誤時的提示畫面

本文11個示例的源碼已放到GitHub,如果您覺得本篇內容不錯,請點個贊,或在GitHub上加個星星!

GitHub Source

本文的所有示例如下:

  • http get示例
  • http jsonp示例
  • http post示例
  • http put示例
  • http delete示例
  • resource get示例
  • resource save示例(HTTP POST)
  • resource update示例(HTTP PUT)
  • resource remove示例(HTTP DELETE)
  • inteceptor示例1——ajax請求的loading界面
  • inteceptor實例2——請求失敗時的提示對話框

各位在閱讀這篇文章的內容時,可以先嘗試該列表的最后兩個示例,這兩個示例綜合使用了this.$http和inteceptor。

vue-resource特點

vue-resource插件具有以下特點:

1. 體積小

vue-resource非常小巧,在壓縮以后只有大約12KB,服務端啟用gzip壓縮后只有4.5KB大小,這遠比jQuery的體積要小得多。

2. 支持主流的瀏覽器

和Vue.js一樣,vue-resource除了不支持IE 9以下的瀏覽器,其他主流的瀏覽器都支持。

3. 支持Promise?API和URI Templates

Promise是ES6的特性,Promise的中文含義為“先知”,Promise對象用于異步計算。
URI Templates表示URI模板,有些類似于ASP.NET?MVC的路由模板。

4. 支持攔截器

攔截器是全局的,攔截器可以在請求發送前和發送請求后做一些處理。
攔截器在一些場景下會非常有用,比如請求發送前在headers中設置access_token,或者在請求失敗時,提供共通的處理方式。

vue-resource使用

引入vue-resource

<script src="js/vue.js"></script>
<script src="js/vue-resource.js"></script>

基本語法

引入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);

在發送請求后,使用then方法來處理響應結果,then方法有兩個參數,第一個參數是響應成功時的回調函數,第二個參數是響應失敗時的回調函數。

then方法的回調函數也有兩種寫法,第一種是傳統的函數寫法,第二種是更為簡潔的ES 6的Lambda寫法:

// 傳統寫法
this.$http.get('/someUrl', [options]).then(function(response){// 響應成功回調
}, function(response){// 響應錯誤回調
});// Lambda寫法
this.$http.get('/someUrl', [options]).then((response) => {// 響應成功回調
}, (response) => {// 響應錯誤回調
});

PS:做過.NET開發的人想必對Lambda寫法有一種熟悉的感覺。

支持的HTTP方法

vue-resource的請求API是按照REST風格設計的,它提供了7種請求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])

除了jsonp以外,另外6種的API名稱是標準的HTTP方法。當服務端使用REST API時,客戶端的編碼風格和服務端的編碼風格近乎一致,這可以減少前端和后端開發人員的溝通成本。

客戶端請求方法 服務端處理方法
this.$http.get(...) Getxxx
this.$http.post(...) Postxxx
this.$http.put(...) Putxxx
this.$http.delete(...) Deletexxx

options對象

發送請求時的options選項對象包含以下屬性:

參數 類型 描述
url string 請求的URL
method string 請求的HTTP方法,例如:'GET', 'POST'或其他HTTP方法
body Object,?FormDatastring request body
params Object 請求的URL參數對象
headers Object request header
timeout number 單位為毫秒的請求超時時間 (0?表示無超時時間)
before function(request) 請求發送前的處理函數,類似于jQuery的beforeSend函數
progress function(event) ProgressEvent回調處理函數
credientials boolean 表示跨域請求時是否需要使用憑證
emulateHTTP boolean 發送PUT, PATCH, DELETE請求時以HTTP POST的方式發送,并設置請求頭的X-HTTP-Method-Override
emulateJSON boolean 將request body以application/x-www-form-urlencoded?content type發送

emulateHTTP的作用

如果Web服務器無法處理PUT, PATCH和DELETE這種REST風格的請求,你可以啟用enulateHTTP現象。啟用該選項后,請求會以普通的POST方法發出,并且HTTP頭信息的X-HTTP-Method-Override屬性會設置為實際的HTTP方法。

Vue.http.options.emulateHTTP = true;

emulateJSON的作用

如果Web服務器無法處理編碼為application/json的請求,你可以啟用emulateJSON選項。啟用該選項后,請求會以application/x-www-form-urlencoded作為MIME type,就像普通的HTML表單一樣。

Vue.http.options.emulateJSON = true;

response對象

response對象包含以下屬性:

方法 類型 描述
text() string 以string形式返回response body
json() Object 以JSON對象形式返回response body
blob() Blob 以二進制形式返回response body
屬性 類型 描述
ok boolean 響應的HTTP狀態碼在200~299之間時,該屬性為true
status number 響應的HTTP狀態碼
statusText string 響應的狀態文本
headers Object 響應頭

注意:本文的vue-resource版本為v0.9.3,如果你使用的是v0.9.0以前的版本,response對象是沒有json(), blob(), text()這些方法的。

CURD示例

提示:以下示例仍然沿用上一篇的組件和WebAPI,組件的代碼和頁面HTML代碼我就不再貼出來了。

GET請求

var demo = new Vue({el: '#app',data: {gridColumns: ['customerId', 'companyName', 'contactName', 'phone'],gridData: [],apiUrl: 'http://211.149.193.19:8080/api/customers'},ready: function() {this.getCustomers()},methods: {getCustomers: function() {this.$http.get(this.apiUrl).then((response) => {this.$set('gridData', response.data)}).catch(function(response) {console.log(response)})}}
})

這段程序的then方法只提供了successCallback,而省略了errorCallback。
catch方法用于捕捉程序的異常,catch方法和errorCallback是不同的,errorCallback只在響應失敗時調用,而catch則是在整個請求到響應過程中,只要程序出錯了就會被調用。

在then方法的回調函數內,你也可以直接使用this,this仍然是指向Vue實例的:

getCustomers: function() {this.$http.get(this.apiUrl).then((response) => {this.$set('gridData', response.data)}).catch(function(response) {console.log(response)})
}

為了減少作用域鏈的搜索,建議使用一個局部變量來接收this。

image

View Demo

JSONP請求

getCustomers: function() {this.$http.jsonp(this.apiUrl).then(function(response){this.$set('gridData', response.data)})
}

View Demo

POST請求

var demo = new Vue({el: '#app',data: {show: false,gridColumns: [{name: 'customerId',isKey: true}, {name: 'companyName'}, {name: 'contactName'}, {name: 'phone'}],gridData: [],apiUrl: 'http://211.149.193.19:8080/api/customers',item: {}},ready: function() {this.getCustomers()},methods: {closeDialog: function() {this.show = false},getCustomers: function() {var vm = thisvm.$http.get(vm.apiUrl).then((response) => {vm.$set('gridData', response.data)})},createCustomer: function() {var vm = thisvm.$http.post(vm.apiUrl, vm.item).then((response) => {vm.$set('item', {})vm.getCustomers()})this.show = false}}
})

29

View Demo

PUT請求

updateCustomer: function() {var vm = thisvm.$http.put(this.apiUrl + '/' + vm.item.customerId, vm.item).then((response) => {vm.getCustomers()})
}

30

?

View Demo

Delete請求

deleteCustomer: function(customer){var vm = thisvm.$http.delete(this.apiUrl + '/' + customer.customerId).then((response) => {vm.getCustomers()})
}

31

View Demo

使用resource服務

vue-resource提供了另外一種方式訪問HTTP——resource服務,resource服務包含以下幾種默認的action:

get: {method: 'GET'},
save: {method: 'POST'},
query: {method: 'GET'},
update: {method: 'PUT'},
remove: {method: 'DELETE'},
delete: {method: 'DELETE'}

resource對象也有兩種訪問方式:

  • 全局訪問:Vue.resource
  • 實例訪問:this.$resource

resource可以結合URI Template一起使用,以下示例的apiUrl都設置為{/id}了:

apiUrl: 'http://211.149.193.19:8080/api/customers{/id}'

GET請求

使用get方法發送GET請求,下面這個請求沒有指定{/id}

getCustomers: function() {var resource = this.$resource(this.apiUrl)vm = thisresource.get().then((response) => {vm.$set('gridData', response.data)}).catch(function(response) {console.log(response)})
}

View Demo

POST請求

使用save方法發送POST請求,下面這個請求沒有指定{/id}

createCustomer: function() {var resource = this.$resource(this.apiUrl)vm = thisresource.save(vm.apiUrl, vm.item).then((response) => {vm.$set('item', {})vm.getCustomers()})this.show = false
}

View Demo

PUT請求

使用update方法發送PUT請求,下面這個請求指定了{/id}

updateCustomer: function() {var resource = this.$resource(this.apiUrl)vm = thisresource.update({ id: vm.item.customerId}, vm.item).then((response) => {vm.getCustomers()})
}

{/id}相當于一個占位符,當傳入實際的參數時該占位符會被替換。
例如,{ id: vm.item.customerId}中的vm.item.customerId為12,那么發送的請求URL為:

http://211.149.193.19:8080/api/customers/12

View Demo

DELETE請求

使用remove或delete方法發送DELETE請求,下面這個請求指定了{/id}

deleteCustomer: function(customer){var resource = this.$resource(this.apiUrl)vm = thisresource.remove({ id: customer.customerId}).then((response) => {vm.getCustomers()})
}

View Demo

使用inteceptor

攔截器可以在請求發送前和發送請求后做一些處理。

image

基本用法

Vue.http.interceptors.push((request, next) => {// ...// 請求發送前的處理邏輯// ...next((response) => {// ...// 請求發送后的處理邏輯// ...// 根據請求的狀態,response參數會返回給successCallback或errorCallbackreturn response})
})

在response返回給successCallback或errorCallback之前,你可以修改response中的內容,或做一些處理。
例如,響應的狀態碼如果是404,你可以顯示友好的404界面。

如果不想使用Lambda函數寫法,可以用平民寫法:

Vue.http.interceptors.push(function(request, next) {// ...// 請求發送前的處理邏輯// ...next(function(response) {// ...// 請求發送后的處理邏輯// ...// 根據請求的狀態,response參數會返回給successCallback或errorCallbackreturn response})
})

示例1

之前的CURD示例有一處用戶體驗不太好,用戶在使用一些功能的時候如果網絡較慢,畫面又沒有給出反饋,用戶是不知道他的操作是成功還是失敗的,他也不知道是否該繼續等待。

通過inteceptor,我們可以為所有的請求處理加一個loading:請求發送前顯示loading,接收響應后隱藏loading。

具體步驟如下:

1.添加一個loading組件

<template id="loading-template"><div class="loading-overlay"><div class="sk-three-bounce"><div class="sk-child sk-bounce1"></div><div class="sk-child sk-bounce2"></div><div class="sk-child sk-bounce3"></div></div></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 = truenext((response) => {loading.show = falsereturn response});
});

27

View Demo

示例2

當用戶在畫面上停留時間太久時,畫面數據可能已經不是最新的了,這時如果用戶刪除或修改某一條數據,如果這條數據已經被其他用戶刪除了,服務器會反饋一個404的錯誤,但由于我們的put和delete請求沒有處理errorCallback,所以用戶是不知道他的操作是成功還是失敗了。

你問我為什么不在每個請求里面處理errorCallback,這是因為我比較懶。這個問題,同樣也可以通過inteceptor解決。

1. 繼續沿用上面的loading組件,在#help元素下加一個對話框

<div id="help"><loading v-show="showLoading" ></loading><modal-dialog :show="showDialog"><header class="dialog-header" slot="header"><h1 class="dialog-title">Server Error</h1></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 = truenext((response) => {if(!response.ok){help.errorCode = response.statushelp.showDialog = true}help.showLoading = falsereturn response});
});

28

View Demo

總結

vue-resource是一個非常輕量的用于處理HTTP請求的插件,它提供了兩種方式來處理HTTP請求:

  • 使用Vue.http或this.$http
  • 使用Vue.resource或this.$resource

這兩種方式本質上沒有什么區別,閱讀vue-resource的源碼,你可以發現第2種方式是基于第1種方式實現的。

inteceptor可以在請求前和請求后附加一些行為,這意味著除了請求處理的過程,請求的其他環節都可以由我們來控制。

參考鏈接:https://github.com/vuejs/vue-resource/tree/master/docs

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/247706.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/247706.shtml
英文地址,請注明出處:http://en.pswp.cn/news/247706.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

java面向對象:關鍵字 —(16)

static:靜態的 1.可以用來修飾的結構&#xff1a;主要用來修飾類的內部結構 屬性、方法、代碼塊、內部類 2.static修飾屬性&#xff1a;靜態變量&#xff08;或類變量&#xff09; 2.1 屬性&#xff0c;是否使用static修飾&#xff0c;又分為&#xff1a;靜態屬性 vs 非靜態…

《少年先瘋隊》第九次團隊作業:Beta沖刺與團隊項目驗收

博文簡要信息表&#xff1a; 項目內容軟件工程https://www.cnblogs.com/nwnu-daizh/本次實驗鏈接地址https://www.cnblogs.com/nwnu-daizh/p/11056511.html團隊名稱少年先瘋隊作業學習目標&#xff08;1&#xff09;掌握軟件黑盒測試技術&#xff1b;&#xff08;2&#xff09;…

vue-resource jsonp跨域問題解決方法

最近在學習vue.js 碰到個ajax跨域請求的問題&#xff0c;之前知道可以用jsonp解決&#xff0c;但是一直沒實踐過&#xff0c;這次用發現里面好多問題&#xff0c;所以現在記錄下來&#xff0c;希望可以給剛接觸使用jsonp的同學一點幫助&#xff01; 關于什么是jsonp&#xff0c…

虛擬機無法連接至網絡

問題&#xff1a; 虛擬機中的win XP系統無法連接至外部win10系統網絡 嘗試解決方法&#xff1a; 1&#xff09;換用橋接模式和NAT模式&#xff0c;無效 2&#xff09;恢復虛擬機網絡屬性至默認狀態&#xff0c;無效 最終解決方法&#xff1a; 換用外部無線網絡&#xff0c;即能…

java面向對象:關鍵字 —(17)

interface:接口 1.使用說明&#xff1a; 1.接口使用interface來定義 2.Java中&#xff0c;接口和類是并列的兩個結構3.如何定義接口&#xff1a;定義接口中的成員 3.1 JDK7及以前&#xff1a;只能定義全局常量和抽象方法>全局常量&#xff1a;public static final的.但是…

原生js來實現對dom元素class的操作方法

jQuery操作class的方式非常強大 寫了一個利用原生js來實現對dom元素class的操作方法 1.addClass:為指定的dom元素添加樣式 2.removeClass:刪除指定dom元素的樣式 3.toggleClass:如果存在(不存在)&#xff0c;就刪除(添加)一個樣式 4.hasClass:判斷樣式是否存在 下面為一toggleC…

python+selenium配置Edge瀏覽器

Chrome, Firefox只需要修改conftest.py文件中的 pytest.fixture(scopesession)def browser(): return BzwUtil.read_yml(config.yml,WEB_INFO,BROWSER) add option in pytest command line def pytest_addoption(parser): parser.addoption("--browser", actio…

JSON.parse和JSON.stringify方法

JSON.parse() JSON.parse()方法將json字符串轉化為Javascript值或對象。 語法 JSON.parse(text[,reviver]) 參數 text:要被解析成Javascript值的字符串 reviver:若是一個函數則規定了原始值(text)如何被解析改造&#xff0c;在被返回前。 示例 JSON.parse({}); //…

java面向對象:異常處理 —(18)

1. 異常的體系結構 java.lang.Throwable |-----java.lang.Error:一般不編寫針對性的代碼進行處理。|-----java.lang.Exception:可以進行異常的處理|------編譯時異常(checked)|-----IOException|-----FileNotFoundException|-----ClassNotFoundException|------運行時異常(un…

vue請求簡單配置

簡單記錄一下vue的http請求配置相關 測試環境請求接口設置:   1. config/dev.env.js添加&#xff1a;     module.exports merge(prodEnv, {       NODE_ENV: "development",       API_ROOT: "http://", //配置http請求頭     })…

【vue報錯】——listen EADDRINUSE :::8080 解決方案

問題原因&#xff1a; 此項錯誤表示 8080 端口被占用 解決方案一&#xff1a; 打開cmd 輸入&#xff1a;netstat -ano 查看所有端口信息&#xff0c;如圖&#xff0c;找到端口 8081&#xff0c;以及對應的 PID 輸入&#xff1a;tskill PID 即可殺死進程 解決方案二&#xff1a…

記錄_20190626

java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result異常的解決方法 原來JAVA中如果用BigDecimal做除法的時候一定要在divide方法中傳遞第二個參數&#xff0c;定義精確到小數點后幾位&#xff0c;否則在不整除的情況下…

String與Array

public class Api {Testpublic void StringApi(){// equals() 判斷內容是否相同區分大小寫// equalsIgnoreCase() 判斷內容是否相同不區分大小寫// length() 獲取長度// charAt(int index) 獲取某個索引位置的字…

HTML與CSS布局技巧總結

很多人對CSS的布局有困惑&#xff0c;實際的應用場景中由于布局種類多難以選擇。今天我花些時間總結下自己對CSS布局的理解&#xff0c;分析下了解各種布局的優劣&#xff0c;同時希望能分享給初入前端的朋友們一些在布局上的經驗&#xff0c;如果有那些地方總結的不好&#xf…

當談論迭代器時,我談些什么?

花下貓語&#xff1a;之前說過&#xff0c;我對于編程語言跟其它學科的融合非常感興趣&#xff0c;但我還說漏了一點&#xff0c;就是我對于 Python 跟其它編程語言的對比學習&#xff0c;也很感興趣。所以&#xff0c;我一直希望能聚集一些有其它語言基礎的同學&#xff0c;一…

在Vue-cli項目中使用echarts

該示例使用 vue-cli 腳手架搭建 安裝echarts依賴 npm install echarts -S11 或者使用國內的淘寶鏡像&#xff1a; 安裝 npm install -g cnpm --registryhttps://registry.npm.taobao.org11 使用 cnpm install echarts -S11 創建圖表 全局引入 main.js // 引入echarts im…

Java的模板文件配置

Java的Mappers文件配置 <?xml version"1.0" encoding"UTF-8" ?><!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace"com.qfedu.…

Python爬蟲學習二

1、selenium自動測試工具 2、主要使用selenium的目的是跳過登錄驗證3、下載驅動器下載請求庫from selenium import webdriver import time#1、 直接在script文件夾中找驅動 driverwebdriver.Chrome() time.sleep(5) driver.close()#2、找到驅動路徑 #webdriver.Chrome(rD:\Pyth…

通過GitHub Pages創建個人主頁

登陸github,創建新倉庫&#xff0c;寫入名字, 這里要以github.io做后綴, 不然創建出來的不是GitHub Pages 打開終端, cd到自己想要的文件夾后clone到本地 git clone https://github.com/username/username.github.io 進入這個項目文件夾 cd username.github.io 把寫好HTML項目拷…

Spring IOC 配置文件模板

基于XML的普通設置 <?xml version1.0 encodingUTF-8 ?> <beans xmlns"http://www.springframework.org/schema/beans"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xmlns:context"http://www.springframework.org/schema/contex…