若是你對XMLHttpRequest的使用不熟悉,建議先在MDN上先行學習。ios
項目源碼已經上傳到github,並已添加註釋,您可直接查看源碼學習。git
文章已經同步到個人技術博客,歡迎交流。github
axios({
method: 'post',
url: '/url',
data: {
a: 1,
b: 2
}
}).then((res) => {
console.log(res)
})
複製代碼
XMLHttpRequest:具體使用參見XMLHttpRequesttypescript
// xhr.js
const request = new XMLHttpRequest()
request.open(method.toUpperCase(), url, true)
request.onreadystatechange = function(){
// 監聽xhr狀態改變
}
request.send(data)
複製代碼
export function buildUrl(url: string, params: any): string {
if (!params) return url;
const parts: string[] = [];
Object.keys(params).forEach((key) => {
const val = params[key];
if (val === null || typeof val === 'undefined') {
return ''
}
let values = [];
if (Array.isArray(val)) {
values = val;
key += '[]'
} else {
values = [val]
}
values.forEach((val) => {
if (isDate(val)) {
val = val.toISOString()
} else if (isPlainObject(val)) {
val = JSON.stringify(val)
}
parts.push(`${encode(key)}=${encode(val)}`)
})
})
let serializedParams = parts.join('&');
if (serializedParams) {
const markIndex = url.indexOf('#')
if (markIndex !== -1) {
url = url.slice(0, markIndex)
}
url += (url.indexOf('?') === -1 ? '?' : '&') + serializedParams
}
return url
}
複製代碼
處理data信息比較簡單,直接上代碼:json
export function transformRequest(data: any): any {
if (isPlainObject(data)) {
return JSON.stringify(data)
}
return data
}
複製代碼
'application/json;charset=utf-8'
,具體代碼以下:function normalizeHeaderName(headers: any, normalizedName: string): void {
if (!headers) return
Object.keys(headers).forEach(name => {
if (name !== normalizedName && name.toUpperCase() === normalizedName.toUpperCase()) {
headers[normalizedName] = headers[name]
delete headers[name]
}
})
}
export function processHeaders(headers: any, data: any): any {
normalizeHeaderName(headers, 'Content-Type')
if (isPlainObject(data)) {
if (headers && !headers['Content-Type']) {
headers['Content-Type'] = 'application/json;charset=utf-8'
}
}
return headers
}
複製代碼
export function transformResponse(data: any): any {
if (typeof data === 'string') {
try {
data = JSON.parse(data)
} catch (e) {
// do nothing
}
}
return data
}
複製代碼