axios簡介
Axios 是一個基於 promise 的 HTTP 庫,可以用在瀏覽器和 node.js 中。
axios的優勢:
- 從瀏覽器中創建 XMLHttpRequests
- 從 node.js 創建 http 請求
- 支持 Promise API
- 攔截請求和響應
- 轉換請求數據和響應數據
- 取消請求
- 自動轉換 JSON 數據
- 客戶端支持防御 XSRF
axios的基本使用
如何引入axios
可以通過npm安裝來進行使用
$ npm install axio
也可以使用 bower進行安裝,然后在頁面中進行引入:
$ bower install axios
還可以使用CDN來進行引入到頁面中去
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
如何應用axios
當我們引入了axios之后,接下來我們就要開始正式的使用axios了,對於axios的使方法比較多:
1、可以通過向 axios 傳遞相關配置來創建請求:axios(config)
// 發送 POST 請求
axios({
method: 'post',
url: '/user/12345',
data: {
firstName: 'Fred',
lastName: 'Flintstone'
}
});
2、在上面的方法的基礎上,我們還可以將url作為第一個參數傳遞給axios方法:axios(url,[config]),對於這樣來說,如果我們沒有傳config,或者config中的method沒有傳的情況下,axios會默認使用get請求方法來進行請求:
// 發送 GET 請求(默認的方法)
axios('/user/12345');
3、針對於get類的請求(get,delete,head,options)我們還可以使用axios[method](url, [config]),這樣的形式來進行請求,這樣的形似其實和我們所熟知的jquery中的ajax的很類似,但是還是有區別的,對於jquery的來說,我們的針對ajax的請求的傳參都是使用data這樣的字段來進行傳遞的,但是對於ajax來說,針對於get類的請求這樣的請求,傳遞的數據,要么我們放在url上面,要么通過config中的params這個參數來進行配置。針對與post類的請求(post,put,patch),這樣的請求來說,我們上面的我們可以通過config中的data來進行傳遞參數,除此之外,我們還可以通過過用以下的形式來進行傳遞參數:axios[method](url, data,[config])。下面是幾個例子:
get請求:
// 為給定 ID 的 user 創建請求
axios.get('/user?ID=12345')
.then(function (response) {
console.log(response);
})
.catch(function (error) {
console.log(error);
});
// 可選地,上面的請求可以這樣做
axios.get('/user', {
params: {
ID: 12345
}
})
.then(function (response) {
console.log(response);
})
.catch(function (error) {
console.log(error);
});
post 請求
axios.post('/user', {
firstName: 'Fred',
lastName: 'Flintstone'
})
.then(function (response) {
console.log(response);
})
.catch(function (error) {
console.log(error);
});
具體的使用方法我們可以如下:
為方便起見,為所有支持的請求方法提供了別名
- 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]])
4、當然,我們也重新創建一個新的axios實例來進行使用axios,然后通過實例來使用,其使用的方法,和以上三種使用方法類似。
var instance = axios.create({
baseURL: 'https://some-domain.com/api/',
timeout: 1000,
headers: {'X-Custom-Header': 'foobar'}
});
instance.get('helloword.api')
如何使用axios來進行攔截請求和響應
在談攔截請求和響應的前,我們先介紹一下攔截器這個概念:
(如果你熟悉中間件,那么就很好理解了,因為它起到的就是基於promise的中間件的作用)攔截器分為請求攔截器和響應攔截器,顧名思義:請求攔截器(interceptors.request)是指可以攔截住每次或指定http請求,並可修改配置項響應攔截器(interceptors.response)可以在每次http請求后攔截住每次或指定http請求,並可修改返回結果項。
針對於axios的攔截器,主要分為請求攔截器和響應攔截器。請求攔截器是指可以攔截住每次請求或者是指定的http請求,並且可以修改其配置項。響應攔截器是指在http請求后,可以攔截住每次的響應或者是指定http的響應,並且可以修改其結果。
具體的使用過程:
/ 添加請求攔截器
const myRequestInterceptor = axios.interceptors.request.use(config => {
// 在發送http請求之前做些什么
return config; // 有且必須有一個config對象被返回
}, error => {
// 對請求錯誤做些什么
return Promise.reject(error);
});
// 添加響應攔截器
axios.interceptors.response.use(response => {
// 對響應數據做點什么
return response; // 有且必須有一個response對象被返回
}, error => {
// 對響應錯誤做點什么
return Promise.reject(error);
});
// 移除某次攔截器
axios.interceptors.request.eject(myRequestInterceptor);
請求攔截器和響應攔截器的的使用場景。
請求攔截器:
1、在我們發送的請求中,我們每次都需要向后端傳遞的內容,比如說,用戶登陸認證的token等相關的內容
2、如果我們需要對請求數據進行加密的情況下我們可以在請求攔截器中添加
3、請求鏈接的處理
4、統一添加版本號等相關的內容
響應攔截器:
1、我們對相應結果需要進行統一處理的
2、我們對相應中的錯誤進行統一處理,
3、我們對相應的數據進行統一處理
等等
如何使用axios來進行取消請求
當我們發送一個請求,但是在發送過程中希望取消請求,在傳統的ajax中使用的,提供有abort()方法來取消ajax請求,但是在axios中,頁提供了有關取消請求的方法,具體的使用方法如下:
import axios from 'axios'
// 第一種取消方法
axios.get(url, {
cancelToken: new axios.CancelToken(cancel => {
if (/* 取消條件 */) {
cancel('取消日志');
}
})
});
// 第二種取消方法
const CancelToken = axios.CancelToken;
const source = CancelToken.source();
axios.get(url, {
cancelToken: source.token
});
source.cancel('取消日志');
如何配置axios
在以上的使用方法中我們看到了在axios請求的時,我們可以添加配置項,但是可以配置的內容有哪些呢:
{
// `url` 是用於請求的服務器 URL
url: '/user',
// `method` 是創建請求時使用的方法
method: 'get', // 默認是 get
// `baseURL` 將自動加在 `url` 前面,除非 `url` 是一個絕對 URL。
// 它可以通過設置一個 `baseURL` 便於為 axios 實例的方法傳遞相對 URL
baseURL: 'https://some-domain.com/api/',
// `transformRequest` 允許在向服務器發送前,修改請求數據
// 只能用在 'PUT', 'POST' 和 'PATCH' 這幾個請求方法
// 后面數組中的函數必須返回一個字符串,或 ArrayBuffer,或 Stream
transformRequest: [function (data) {
// 對 data 進行任意轉換處理
return data;
}],
// `transformResponse` 在傳遞給 then/catch 前,允許修改響應數據
transformResponse: [function (data) {
// 對 data 進行任意轉換處理
return data;
}],
// `headers` 是即將被發送的自定義請求頭
headers: {'X-Requested-With': 'XMLHttpRequest'},
// `params` 是即將與請求一起發送的 URL 參數
// 必須是一個無格式對象(plain object)或 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
// - 瀏覽器專屬:FormData, File, Blob
// - Node 專屬: Stream
data: {
firstName: 'Fred'
},
// `timeout` 指定請求超時的毫秒數(0 表示無超時時間)
// 如果請求話費了超過 `timeout` 的時間,請求將被中斷
timeout: 1000,
// `withCredentials` 表示跨域請求時是否需要使用憑證
// 打一個比方如果在跨域請求的時候,如果我們需要向后台發送cookie的情況下,這個時候我們需要將這個字段設置成true
withCredentials: false, // 默認的
// `adapter` 允許自定義處理請求,以使測試更輕松
// 返回一個 promise 並應用一個有效的響應 (查閱 [response docs](#response-api)).
adapter: function (config) {
/* ... */
},
// `auth` 表示應該使用 HTTP 基礎驗證,並提供憑據
// 這將設置一個 `Authorization` 頭,覆寫掉現有的任意使用 `headers` 設置的自定義 `Authorization`頭
auth: {
username: 'janedoe',
password: 's00pers3cret'
},
// `responseType` 表示服務器響應的數據類型,可以是 'arraybuffer', 'blob', 'document', 'json', 'text', 'stream'
responseType: 'json', // 默認的
// `xsrfCookieName` 是用作 xsrf token 的值的cookie的名稱
xsrfCookieName: 'XSRF-TOKEN', // default
// `xsrfHeaderName` 是承載 xsrf token 的值的 HTTP 頭的名稱
xsrfHeaderName: 'X-XSRF-TOKEN', // 默認的
// `onUploadProgress` 允許為上傳處理進度事件
onUploadProgress: function (progressEvent) {
// 對原生進度事件的處理
},
// `onDownloadProgress` 允許為下載處理進度事件
onDownloadProgress: function (progressEvent) {
// 對原生進度事件的處理
},
// `maxContentLength` 定義允許的響應內容的最大尺寸
maxContentLength: 2000,
// `validateStatus` 定義對於給定的HTTP 響應狀態碼是 resolve 或 reject promise 。如果 `validateStatus` 返回 `true` (或者設置為 `null` 或 `undefined`),promise 將被 resolve; 否則,promise 將被 rejecte
validateStatus: function (status) {
return status >= 200 && status < 300; // 默認的
},
// `maxRedirects` 定義在 node.js 中 follow 的最大重定向數目
// 如果設置為0,將不會 follow 任何重定向
maxRedirects: 5, // 默認的
// `httpAgent` 和 `httpsAgent` 分別在 node.js 中用於定義在執行 http 和 https 時使用的自定義代理。允許像這樣配置選項:
// `keepAlive` 默認沒有啟用
httpAgent: new http.Agent({ keepAlive: true }),
httpsAgent: new https.Agent({ keepAlive: true }),
// 'proxy' 定義代理服務器的主機名稱和端口
// `auth` 表示 HTTP 基礎驗證應當用於連接代理,並提供憑據
// 這將會設置一個 `Proxy-Authorization` 頭,覆寫掉已有的通過使用 `header` 設置的自定義 `Proxy-Authorization` 頭。
proxy: {
host: '127.0.0.1',
port: 9000,
auth: : {
username: 'mikeymike',
password: 'rapunz3l'
}
},
// `cancelToken` 指定用於取消請求的 cancel token
// (查看后面的 Cancellation 這節了解更多)
cancelToken: new CancelToken(function (cancel) {
})
}
以上就是axois中常用的配置項的內容。其實對於axios還有一個通用的默認配置,就比如說,我們請求超時的時間,如我們不會在每次請求的時候都去設置這個超時時間,那么我們又沒方法能夠進行統一設置這個超時時間的呢,其實我們可以通過使用default.config的方法來進行設置axios的通用的請求配置的內容。
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';
小結
以上就是我自己總結的有關axios的使用方法,可能有些地方存在問題,這些對於axios的基本使用已經算足夠的,如果希望更深入的去了解axios,就需要我們在實際的使用過程中,不斷的總結。總結我們遇到的實際的場景,並且場景中的具體的表現和實際解決思路。
