基於Promise的HTTP客戶端,用於瀏覽器和node.jsjavascript
ajax
請求node.js
發出http請求Promise API
Axios
構造函數,添加默認配置,攔截器,原型上掛載請求方法// core/axios.js
// 構造Axios構造函數
function Axios(instanceConfig) {
this.defaults = instanceConfig;
// 添加攔截器
this.interceptors = {
request: new InterceptorManager(),
response: new InterceptorManager()
};
}
// 實際請求方法
Axios.prototype.request = function() {};
Axios.prototype.getUri = function() {};
// 沒有請求體 delete get head options
Axios.prototype.get = function(url, config = {}) {
return this.request(Object.assign(config, {
method: 'get',
url
}))
};
// 有請求體 post put patch
Axios.prototype.post = function(url, data, config = {}) {
return this.request(Object.assign(config, {
method: 'post',
url,
data
}))
};
複製代碼
Axios
實例context
,接着建立instance
指向Axios.prototype.request
方法,並綁定了上下文context
;extend
方法把context
中的原型方法和實例方法所有拷貝到instance
上 ,返回instance
create
,CancelToken
,all
等方法// axios.js
// 建立一個Axios實例,掛載輔助方法,並導出該混合對象
function createInstance(defaultConfig = {}) {
var context = new Axios(defaultConfig);
var instance = bind(Axios.prototype.request, context);
// Copy axios.prototype to instance
utils.extend(instance, Axios.prototype, context)
// copy context to instance
utils.extend(instance, context)
return intance
}
// create the default instance to be exported
var axios = createInstance({})
axios.Axios = Axios
axios.create= function(config) {
return createInstance(Object.assign(axios.defaults, config))
}
// 取消請求
axios.Cancel = require('./cancel/Cancel')
axios.CancelToken = require('./cancel/CancelToken')
axios.isCancel = require('./cancel/isCancel')
// Prmoise.all 的語法糖
axios.all = Promise.all
axios.spread = require('./helpers/spread')
複製代碼
axios
所支持的的功能Node
和 瀏覽器
端的 http
請求關鍵代碼java
原理介紹node
process
區分出 Node
環境和瀏覽器環境XMLHttpRquest
發起http請求,Node環境使用http
,https
模塊發起請求Promise
包裝實現請求方法關鍵代碼webpack
攔截器運行示意ios
Promise
.then(request[1].fulfilled, request[1].rejected)
.then(request[0].fulfilled, request[1].rejected)
.then(dispatchRequest, undefined)
.then(response[0].fulfilled, response[0].rejected)
.then(response[1].fulfilled, response[1].rejected)
.then() // user opt
複製代碼
use
, 移除攔截器方法 eject
, 遍歷攔截器方法 forEach
unshift
, push
方法,添加請求攔截器和響應攔截器Promise.then
鏈式調用添加的攔截器若是你們有了解過Koa
的中間件原理,可能會發現很類似git
關鍵代碼github
原理介紹web
transformRequest
, transformResponse
方法,處理常見狀況transformData
方法,遍歷多個轉換器,處理數據function transformData(data, headers, fns) {
/*eslint no-param-reassign:0*/
utils.forEach(fns, function transform(fn) {
data = fn(data, headers);
});
return data;
};
複製代碼
dispatchRequest
請求前,調用 transformData
調用全部的請求轉化器處理請求數據transformData
調用全部的響應轉化器處理響應數據關鍵代碼ajax
原理介紹axios
CancelToken
構造函數接受一個 executor
函數,內部實例化一個 pending
狀態的 Promise
對象,而後用一個 resolvePromise
變量指向 resolve
函數。cancel
函數,在 cancel
函數內部,會調用 resolvePromise
把 Promise
對象從 pending
狀態變爲 resolved
狀態。request
請求中的 resolvePromise.then
被執行XSRF
防範方法
referer
, 但因爲 referer
也能夠僞造,做用有限token
,並經過 set-cookie
的方式種到客戶端,而後客戶端發送請求的時候,從 cookie
中對應的字段讀取出 token
,而後添加到請求 headers
中。因爲這個 token
比較難僞造,因此就能區分這個請求是不是用戶正常發起的。關鍵代碼
原理介紹
withCredentials
爲 true
或者是同域請求,咱們纔會請求 headers
添加 xsrf
相關的字段。cookie
中讀取 xsrf
的 token
值。headers
的 xsrf
相關字段中。Axios
這樣的開源工具庫Axios
支持的 feature
,就是需求分析Axios
採用 grunt
構建 (如今更多會選擇 webpack
, rollup
, parcel
等),並具備完備的測試,示例代碼。Axios
就有多種多樣的使用方式,足夠靈活。Axios
的測試case很是之多,example
下的示例代碼也很豐富閱讀社區優秀的源碼,有助於開拓視野,作到知其因此然,遇到問題才能輕鬆解決~