Ajax:自己用原生JS封装ajax请求函数

分成两个页面,一个html页面,一个js页面
html页面代码:

<body>
    <button onclick="testGet()">测试get请求</button>
    <button onclick="testForm()">测试post请求之form-data格式</button>
    <button onclick="testStr()">测试post请求之/x-www字符串格式</button>
    <button onclick="testJson()">测试post请求之Json格式</button>
    <script src="./myaxios.js"></script>
    <script>
        // 通过自己封装的ajax函数发起get或post请求
        // get请求
        function testGet() {
            axios({
                url: 'http://toutiao.itheima.net/v1_0/channels',
                params: {
                    name: 'Alex',
                    age: 23,
                    sex: 'women'
                }
            }).then(res => {
                console.log(res)
            })
        }

        // post请求之FormData格式 文件上传
        function testForm() {
            let fm = new FormData()
            fm.append('name', 'Piper')
            fm.append('age', '26')
            axios({
                url: 'http://www.liulongbin.top:3006/api/post',
                method: 'post',
                data: fm
            }).then(res => {
                console.log(res)
            })
        }

        // post请求之/x-www字符串格式
        function testStr() {
            axios({
                url: 'http://www.liulongbin.top:3006/api/post',
                method: 'post',
                data: 'name:Bob&age:22'
            }).then(res => {
                console.log(res)
            })
        }

        // post请求之json格式
        function testJson() {
            axios({
                url: 'http://www.liulongbin.top:3006/api/post',
                method: 'post',
                data: {
                    name: 'Alice',
                    height: '165cm',
                    age: 24
                }
            }).then(res => {
                console.log(res)
            })
        }
    </script>
</body>

myaxios.js页面代码

// 自己用原生JS封装ajax请求函数
// axios中的参数会传入一个对象
// 对象里有url、method、params、data,可以通过解构赋值的方式直接写到参数内
// 且给method赋上默认值为get,这样即便不写method:'get'也是可以的
function axios({ url, method = 'get', params, data }) {
    // 返回Promise对象
    return new Promise(function (resolve, reject) {
        try {
            let xhr = new XMLHttpRequest()
            // 判断是否有params对象,且params对象中是否有参数,如果有参数需要拼接字符串,没有则不拼接
            // Object.keys().length可以判断对象中是否有数据,length为0则表示没有数据,而0转成布尔值是false
            if (params && Object.keys(params).length) {
                // 处理params拼接
                let query = []
                for (let key in params) {
                    query.push(`${key}=${params[key]}`)
                }
                xhr.open(method, url + '?' + query.join('&'))
            } else {
                xhr.open(method, url)
            }
            // 监听ajax返回的数据结构
            xhr.addEventListener('load', function () {
                // 当数据有响应时,会得到返回的数据
                // xhr.response得到的是json字符串
                resolve(JSON.parse(xhr.response))
            })
            // 处理请求体参数
            // 如果请求类型不是get且data对象中有数据
            if (method.toLowerCase() !== 'get' && data) {
                // 1.判断data是不是FormData类型  用instanceof
                if (data instanceof FormData) {
                    // 设置请求头类型为Form-Data类型
                    xhr.setRequestHeader('Content-Type', 'multipart/form-data')
                    xhr.send(data)
                    return
                }
                // 2.判断data是不是x/www- 字符串类型
                if (typeof data === 'string') {
                    // 设置请求头类型为application/x-www-form-urlencoded类型
                    xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded')
                    xhr.send(data)
                    return
                }
                // 3.判断data是不是json格式
                if (data instanceof Object) {
                    // 设置请求头类型为application/json类型
                    xhr.setRequestHeader('Content-Type', 'application/json')
                    xhr.send(JSON.stringify(data))
                    return
                }
            }
            // 发送ajax请求
            xhr.send()
        } catch (err) {
            reject(err)
        }
    })
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值