再也不繼續維護vue-resource,並推薦你們使用 axios 開始,axios 被愈來愈多的人所瞭解。原本想在網上找找詳細攻略,忽然發現,axios 的官方文檔自己就很是詳細!!有這個還要什麼自行車!!因此推薦你們學習這種庫,最好詳細閱讀其官方文檔。大概翻譯了一下 axios 的官方文檔,相信你們只要吃透本文再加以實踐,axios 就是小意思啦!!vue
若是您以爲本文對您有幫助,不妨點個贊或關注收藏一下,您的鼓勵對我很是重要。node
axios 是一個基於Promise 用於瀏覽器和 nodejs 的 HTTP 客戶端,它自己具備如下特徵:jquery
1
2
3
4
5
|
$ npm install axios
$ cnpm install axios
//taobao源
$ bower install axios
或者使用cdn:
<script src=
"https://unpkg.com/axios/dist/axios.min.js"></script>
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
// 向具備指定ID的用戶發出請求
axios.get(
'/user?ID=12345')
.then(
function (response) {
console.log(response);
})
.catch(
function (error) {
console.log(error);
});
// 也能夠經過 params 對象傳遞參數
axios.get(
'/user', {
params: {
ID: 12345
}
})
.then(
function (response) {
console.log(response);
})
.catch(
function (error) {
console.log(error);
});
|
1
2
3
4
5
6
7
8
9
10
|
axios.post(
'/user', {
firstName: 'Fred',
lastName: 'Flintstone'
})
.then(
function (response) {
console.log(response);
})
.catch(
function (error) {
console.log(error);
});
|
1
2
3
4
5
6
7
8
9
10
11
12
|
function getUserAccount() {
return axios.get('/user/12345');
}
function getUserPermissions() {
return axios.get('/user/12345/permissions');
}
axios.all([getUserAccount(), getUserPermissions()])
.then(axios.spread(
function (acct, perms) {
//兩個請求現已完成
}));
|
能夠經過將相關配置傳遞給 axios 來進行請求。ios
1
2
3
4
5
6
7
8
9
|
// 發送一個 POST 請求
axios({
method: 'post',
url: '/user/12345',
data: {
firstName: 'Fred',
lastName: 'Flintstone'
}
});
|
1
2
|
// 發送一個 GET 請求 (GET請求是默認請求模式)
axios(
'/user/12345');
|
爲了方便起見,已經爲全部支持的請求方法提供了別名。npm
注意
當使用別名方法時,不須要在config中指定url,method和data屬性。json
幫助函數處理併發請求。axios
您可使用自定義配置建立axios的新實例。api
axios.create([config])數組
1
2
3
4
5
|
var instance = axios.create({
baseURL: 'https://some-domain.com/api/',
timeout: 1000,
headers: {'X-Custom-Header': 'foobar'}
});
|
可用的實例方法以下所示。 指定的配置將與實例配置合併。promise
axios#request(config)
axios#get(url [,config])
axios#delete(url [,config])
axios#head(url [,config])
axios#post(url [,data [,config]])
axios#put(url [,data [,config]])
axios#patch(url [,data [,config]])
這些是用於發出請求的可用配置選項。 只有url是必需的。 若是未指定方法,請求將默認爲GET。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
|
{
// `url`是將用於請求的服務器URL
url:
'/user',
// `method`是發出請求時使用的請求方法
method:
'get', // 默認
// `baseURL`將被添加到`url`前面,除非`url`是絕對的。
// 能夠方便地爲 axios 的實例設置`baseURL`,以便將相對 URL 傳遞給該實例的方法。
baseURL:
'https://some-domain.com/api/',
// `transformRequest`容許在請求數據發送到服務器以前對其進行更改
// 這隻適用於請求方法'PUT','POST'和'PATCH'
// 數組中的最後一個函數必須返回一個字符串,一個 ArrayBuffer或一個 Stream
transformRequest: [
function (data) {
// 作任何你想要的數據轉換
return data;
}],
// `transformResponse`容許在 then / catch以前對響應數據進行更改
transformResponse: [
function (data) {
// Do whatever you want to transform the data
return data;
}],
// `headers`是要發送的自定義 headers
headers: {
'X-Requested-With': 'XMLHttpRequest'},
// `params`是要與請求一塊兒發送的URL參數
// 必須是純對象或URLSearchParams對象
params: {
ID: 12345
},
// `paramsSerializer`是一個可選的函數,負責序列化`params`
// (e.g. https://www.npmjs.com/package/qs, http://api.jquery.com/jquery.param/)
paramsSerializer:
function(params) {
return Qs.stringify(params, {arrayFormat: 'brackets'})
},
// `data`是要做爲請求主體發送的數據
// 僅適用於請求方法「PUT」,「POST」和「PATCH」
// 當沒有設置`transformRequest`時,必須是如下類型之一:
// - string, plain object, ArrayBuffer, ArrayBufferView, URLSearchParams
// - Browser only: FormData, File, Blob
// - Node only: Stream
data: {
firstName: 'Fred'
},
// `timeout`指定請求超時以前的毫秒數。
// 若是請求的時間超過'timeout',請求將被停止。
timeout:
1000,
// `withCredentials`指示是否跨站點訪問控制請求
// should be made using credentials
withCredentials:
false, // default
// `adapter'容許自定義處理請求,這使得測試更容易。
// 返回一個promise並提供一個有效的響應(參見[response docs](#response-api))
adapter:
function (config) {
/* ... */
},
// `auth'表示應該使用 HTTP 基本認證,並提供憑據。
// 這將設置一個`Authorization'頭,覆蓋任何現有的`Authorization'自定義頭,使用`headers`設置。
auth: {
username: 'janedoe',
password: 's00pers3cret'
},
// 「responseType」表示服務器將響應的數據類型
// 包括 'arraybuffer', 'blob', 'document', 'json', 'text', 'stream'
responseType:
'json', // default
//`xsrfCookieName`是要用做 xsrf 令牌的值的cookie的名稱
xsrfCookieName:
'XSRF-TOKEN', // default
// `xsrfHeaderName`是攜帶xsrf令牌值的http頭的名稱
xsrfHeaderName:
'X-XSRF-TOKEN', // default
// `onUploadProgress`容許處理上傳的進度事件
onUploadProgress:
function (progressEvent) {
// 使用本地 progress 事件作任何你想要作的
},
// `onDownloadProgress`容許處理下載的進度事件
onDownloadProgress:
function (progressEvent) {
// Do whatever you want with the native progress event
},
// `maxContentLength`定義容許的http響應內容的最大大小
maxContentLength:
2000,
// `validateStatus`定義是否解析或拒絕給定的promise
// HTTP響應狀態碼。若是`validateStatus`返回`true`(或被設置爲`null` promise將被解析;不然,promise將被
// 拒絕。
validateStatus:
function (status) {
return status >= 200 && status < 300; // default
},
// `maxRedirects`定義在node.js中要遵循的重定向的最大數量。
// 若是設置爲0,則不會遵循重定向。
maxRedirects:
5, // 默認
// `httpAgent`和`httpsAgent`用於定義在node.js中分別執行http和https請求時使用的自定義代理。
// 容許配置相似`keepAlive`的選項,
// 默認狀況下不啓用。
httpAgent:
new http.Agent({ keepAlive: true }),
httpsAgent: new https.Agent({ keepAlive: true }),
// 'proxy'定義代理服務器的主機名和端口
// `auth`表示HTTP Basic auth應該用於鏈接到代理,並提供credentials。
// 這將設置一個`Proxy-Authorization` header,覆蓋任何使用`headers`設置的現有的`Proxy-Authorization` 自定義 headers。
proxy: {
host: '127.0.0.1',
port: 9000,
auth: : {
username: 'mikeymike',
password: 'rapunz3l'
}
},
// 「cancelToken」指定可用於取消請求的取消令牌
// (see Cancellation section below for details)
cancelToken:
new CancelToken(function (cancel) {
})
}
|
使用 then 時,您將收到以下響應:
1
2
3
4
5
6
7
8
|
axios.get(
'/user/12345')
.then(
function(response) {
console.log(response.data);
console.log(response.status);
console.log(response.statusText);
console.log(response.headers);
console.log(response.config);
});
|
您能夠指定將應用於每一個請求的配置默認值。
1
2
3
|
axios.defaults.baseURL =
'https://api.example.com';
axios.defaults.headers.common[
'Authorization'] = AUTH_TOKEN;
axios.defaults.headers.post[
'Content-Type'] = 'application/x-www-form-urlencoded';
|
1
2
3
4
5
6
7
|
//在建立實例時設置配置默認值
var instance = axios.create({
baseURL:
'https://api.example.com'
});
//在實例建立後改變默認值
instance.defaults.headers.common [
'Authorization'] = AUTH_TOKEN;
|
配置將與優先順序合併。 順序是lib / defaults.js中的庫默認值,而後是實例的defaults屬性,最後是請求的config參數。 後者將優先於前者。 這裏有一個例子。
1
2
3
4
5
6
7
8
9
10
11
12
|
//使用庫提供的配置默認值建立實例
//此時,超時配置值爲`0`,這是庫的默認值
var instance = axios.create();
//覆蓋庫的超時默認值
//如今全部請求將在超時前等待2.5秒
instance.defaults.timeout =
2500;
//覆蓋此請求的超時,由於它知道須要很長時間
instance.get(
'/ longRequest',{
timeout:
5000
});
|
你能夠截取請求或響應在被 then 或者 catch 處理以前
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
//添加請求攔截器
axios.interceptors.request.use(
function(config){
//在發送請求以前作某事
return config;
},
function(error){
//請求錯誤時作些事
return Promise.reject(error);
});
//添加響應攔截器
axios.interceptors.response.use(
function(response){
//對響應數據作些事
return response;
},
function(error){
//請求錯誤時作些事
return Promise.reject(error);
});
|
若是你之後可能須要刪除攔截器。
1
2
|
var myInterceptor = axios.interceptors.request.use(function () {/*...*/});
axios.interceptors.request.eject(myInterceptor);
|
你能夠將攔截器添加到axios的自定義實例。
1
2
|
var instance = axios.create();
instance.interceptors.request.use(
function () {/*...*/});
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
axios.get(
'/ user / 12345')
.catch(
function(error){
if(error.response){
//請求已發出,但服務器使用狀態代碼進行響應
//落在2xx的範圍以外
console.log(error.response.data);
console.log(error.response.status);
console.log(error.response.headers);
}
else {
//在設置觸發錯誤的請求時發生了錯誤
console.log('Error',error.message);
}}
console.log(error.config);
});
|
您可使用validateStatus配置選項定義自定義HTTP狀態碼錯誤範圍。
1
2
3
4
5
|
axios.get(
'/ user / 12345',{
validateStatus:
function(status){
return status < 500; //僅當狀態代碼大於或等於500時拒絕
}}
})
|
您可使用取消令牌取消請求。
axios cancel token API基於可取消的promise提議,目前處於階段1。
您可使用CancelToken.source工廠建立一個取消令牌,以下所示:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
var CancelToken = axios.CancelToken;
var source = CancelToken.source();
axios.get(
'/user/12345', {
cancelToken: source.token
}).catch(
function(thrown) {
if (axios.isCancel(thrown)) {
console.log('Request canceled', thrown.message);
}
else {
// 處理錯誤
}
});
//取消請求(消息參數是可選的)
source.cancel(
'操做被用戶取消。');
|
您還能夠經過將執行器函數傳遞給CancelToken構造函數來建立取消令牌:
1
2
3
4
5
6
7
8
9
10
11
12
|
var CancelToken = axios.CancelToken;
var cancel;
axios.get(
'/ user / 12345',{
cancelToken:
new CancelToken(function executor(c){
//一個執行器函數接收一個取消函數做爲參數
cancel = c;
})
});
// 取消請求
clear();
|
注意:您可使用相同的取消令牌取消幾個請求。
默認狀況下,axios將JavaScript對象序列化爲JSON。 要以應用程序/ x-www-form-urlencoded格式發送數據,您可使用如下選項之一。
在瀏覽器中,您可使用URLSearchParams API,以下所示:
1
2
3
4
|
var params = new URLSearchParams();
params.append(
'param1', 'value1');
params.append(
'param2', 'value2');
axios.post(
'/foo', params);
|
請注意,全部瀏覽器都不支持URLSearchParams,可是有一個polyfill可用(確保polyfill全局環境)。
或者,您可使用qs庫對數據進行編碼:
1
2
|
var qs = require('qs');
axios.post(
'/foo', qs.stringify({ 'bar': 123 });
|
在node.js中,可使用querystring模塊,以下所示:
1
2
|
var querystring = require('querystring');
axios.post(
'http://something.com/', querystring.stringify({ foo: 'bar' });
|
你也可使用qs庫。
axios 依賴本機要支持ES6 Promise實現。 若是您的環境不支持ES6 Promises,您可使用polyfill。
axios包括TypeScript定義。
1
2
|
import axios from 'axios';
axios.get(
'/user?ID=12345');
|
axios在很大程度上受到Angular提供的$http服務的啓發。 最終,axios努力提供一個在Angular外使用的獨立的$http-like服務。