封装简易axios#
基于
Promise
+
XHR
封装
myAxios
函数
封装axios获取省份列表#
步骤:
- 定义myAxios函数,接收 配置对象 ,返回 Promise对象
-
发起
XHR
请求,默认请求方法为GET
- 调用成功/失败的处理程序
- 使用myAxios函数,获取省份列表
// 1.1定义函数,接收配置对象,返回Promise对象
function myAxios(config) {
return new Promise((resolve, reject) => {
// 1.2发起XHR请求,默认请求方法GET
const xhr = new XMLHttpRequest()
xhr.open(config.method || 'GET', config.url)
xhr.addEventListener('loadend', function() {
// 1.3调用成功/失败的处理程序
if (xhr.status >= 200 && xhr.status < 300) {
resolve(JSON.parse(xhr.response))
} else {
reject(new Error(xhr.response))
}
})
xhr.send()
})
}
// 1.4使用myAxios函数获取数据
myAxios({
url: 'http://hmajax.itheima.net/api/province'
}).then(res => {
document.querySelector('.provincebox').innerHTML = res.list.join('---')
console.log(res);
}).catch(err => {
document.querySelector('.provincebox').innerHTML = err.message
console.log(err);
})
封装axios获取地区列表#
需求:修改myAxios函数支持传递查询参数,获取"四川省","成都市"对应地区列表数据,回显页面
(偷一下懒,后面的回显都不写样式了,简单点,说话的方式简单点~[doge])
要求:
-
myAxios函数调用后,传入
params
选项 -
基于
URLSearchParams
转换为查询参数字符串 - 使用自己封装的myAxios函数展示地区列表
步骤:
- 封装有params选项,携带查询参数
- 使用URLSearchParams转换,并携带到url
- 使用myAxios函数获取数据
function myAxios(config) {
return new Promise((resolve, reject) => {
// 1.2发起XHR请求,默认请求方法GET
const xhr = new XMLHttpRequest();
// 2.1判断是否有params选项,携带查询参数
if (config.params) {
// 2.2使用URLSearchParams
const paramsObj = new URLSearchParams(config.params)
const queryString = paramsObj.toString();
// 查询参数字符串拼接到url
config.url += `?${queryString}`
}
...
})
}
// 2.3使用myAxios获取地区列表
myAxios({
url: 'http://hmajax.itheima.net/api/area',
params: {
pname: '四川省',
cname: '成都市'
}
}).then(res => {
console.log(res);
document.querySelector('.areabox').innerHTML = res.list.join('---')
}).catch(err => {
document.querySelector('.areabox').innerHTML = err.message
})
封装axios注册用户#
需求:修改myAxios函数支持传递 请求体数据 ,完成注册用户功能
步骤:
-
myAxios函数调用后,判断
data
选项 -
转换数据类型,在
send()
方法中发送请求体数据 - 使用自己封装的myAxios函数完成注册用户功能
用户注册
function myAxios(config) {
return new Promise((resolve, reject) => {
...
xhr.addEventListener('loadend', function() {
...
});
// 3.1判断是否有data选项,携带请求体
if (config.data) {
// 3.2接口要求传参为JSON字符串,转换类型
const dataStr = JSON.stringify(config.data)
xhr.setRequestHeader('Content-Type', 'application/json')
xhr.send(dataStr)
} else {
// 若没有请求体数据,则正常发送
xhr.send()
}
})
}
// 3.3使用myAxios注册用户
document.querySelector('.regsubmit').addEventListener('click', function() {
// 获取表单值
const username = document.querySelector('#username').value;
const password = document.querySelector('#password').value;
myAxios({
url: 'http://hmajax.itheima.net/api/register',
method: 'POST',
data: {
username,
password
}
}).then(res => {
console.log(res);
}).catch(err => {
console.log(err);
})
})
完整myAxios()#
// 1.1定义函数,接收配置对象,返回Promise对象
function myAxios(config) {
return new Promise((resolve, reject) => {
// 1.2发起XHR请求,默认请求方法GET
const xhr = new XMLHttpRequest();
// 2.1判断是否有params选项,携带查询参数
if (config.params) {
// 2.2使用URLSearchParams
const paramsObj = new URLSearchParams(config.params)
const queryString = paramsObj.toString();
// 查询参数字符串拼接到url
config.url += `?${queryString}`
}
xhr.open(config.method || 'GET', config.url)
xhr.addEventListener('loadend', function() {
// 1.3调用成功/失败的处理程序
if (xhr.status >= 200 && xhr.status < 300) {
resolve(JSON.parse(xhr.response))
} else {
reject(new Error(xhr.response))
}
});
// 3.1判断是否有data选项,携带请求体
if (config.data) {
// 3.2接口要求传参为JSON字符串,转换类型
const dataStr = JSON.stringify(config.data)
xhr.setRequestHeader('Content-Type', 'application/json')
xhr.send(dataStr)
} else {
// 若没有请求体数据,则正常发送
xhr.send()
}
})
}