JS异步请求

JS异步请求XMLHttpRequest是一个浏览器接口,开发者可以使用它提出HTTP和HTTPS请求,而且不用刷新页面就可以修改页面内容。一、创建XMLHttpRequest对象IE6及以下版本letreq=newActiveXObject(“Microsoft.XMLHTTP”)非IE浏览器及IE7及以上版本letreq=newXMLHttpRequest()二、发送异步请求1.打开连接,初始化HTTP请求的参数open(method,url,async,userna.

XMLHttpRequest是一个浏览器接口,开发者可以使用它提出HTTP和HTTPS请求,而且不用刷新页面就可以修改页面内容。

一、创建XMLHttpRequest对象

IE6及以下版本

let req = new ActiveXObject("Microsoft.XMLHTTP")

非IE浏览器及IE7及以上版本

let req = new XMLHttpRequest()

二、发送异步请求

1. 打开连接,初始化HTTP请求的参数

open(method, url, async, username, password)

参数说明:

method:用于请求的HTTP方法,包括GET、POST和HEAD
url: 所调用的服务器资源的url
async:是否是异步请求,默认true
username:授权用户名,可选参数
password:认证密码,可选参数

2. 设置请求头

setRequestHeader(字段名, 值)

例如:

req.setRequestHeader("Content-Type", "application/json")

3. 发送请求

send(请求参数)

4. 请求状态

XMLHttpRequest对象把一个Http请求发送到服务器时将经历若干状态,ReadyState属性表示请求的状态。取值及说明如下:

说明
0 已创建XMLHttpRequest对象,但还没有初始化,及还未调用open方法
1 正在加载:open方法已调用
2 请求已发送:已调用send方法,但服务器还未响应
3 请求处理中:已接收到HTTP响应头信息,但消息体还未完全接收结束
4 请求已完成:数据接收完毕,服务器的响应完成

5. 接收服务器响应数据

当ReadyState发生改变的时候,XMLHttpRequest对象会触发onreadystatechange事件。
在响应处理函数中通常会根据XMLHttpRequest对象的ReadyState和其他属性决定如何处理

XMLHttpRequest对象常用属性

属性 说明
responseText 文本响应内容。ReadyState=0,1,2时,此属性为空字符串。ReadyState=3时,此属性为完成的响应信息。ReadyState=4时,此属性为响应信息
responseXML 用于当接收到完整的响应时(ReadyState=4时)描述XML响应。0~3时此属性为null
status HTTP状态码。ReadyState的值为3或4时,此属性才可用
statusText 描述HTTP状态码文本。ReadyState的值为3或4时,此属性才可用

三、基于Promise封装详细代码

1. request.js文件


export const baseURL = ""

/** * 请求头处理函数 */
export function header(){ 
   
    let header = { 
   
        'Content-Type': 'application/x-www-form-urlencoded',
        // 'Content-Type': 'application/json',
        "token": "ABC"
    }
    return header
}

/** * 网络请求 * @param url 请求路径 * @param data 请求数据 * @param method 请求方法 */
 export default function request(url, data, method = "GET") { 
   
    const GET_REQ = method == "GET" || method == "get"
    const POST_REQ = method == "POST" || method == "post"
    const head = header()
    // 将对象key:value形式改为key1=value1&key2=value2形式
    let param = ""
    for(let key in data){ 
   
        param += key + "=" + data[key] + "&"
    }
    param = param.endsWith("&") ? param.substr(0, param.length - 1) : param
    // 如果是get请求方式,则直接拼接到url中
    url = GET_REQ ? url + "?" + param : url

    return new Promise((resolve, reject) => { 
   
        let req = window.XMLHttpRequest ? new XMLHttpRequest() : window.ActiveXObject ? new ActiveXObject("Microsoft.XMLHTTP") : null
        if(!req) throw new Error("无法创建请求")

        req.open(method, baseURL + url)
        // 设置请求头
        for(let key in head){ 
   
            req.setRequestHeader(key, head[key])
        }
        if(GET_REQ){ 
    
            req.send()
        }
        else if(POST_REQ){ 
    
            if(head['Content-Type'] == "application/x-www-form-urlencoded"){ 
   
                req.send(param)
            }else if(head['Content-Type'] == "application/json"){ 
   
                req.send(JSON.stringify(data)) 
            }
        }
        // 响应处理
        req.onreadystatechange = function (e) { 
   
            // console.log("请求状态改变", e)
            if (req.readyState == 4) { 
   
                if (req.status == 200) { 
   
                    // console.log(req.responseText, typeof req.responseText)
                    let res = JSON.parse(req.responseText)
                    // 根据自定义请求码判定是否成功
                    if(res.code == 1){ 
   
                        resolve(res)
                    }else{ 
   
                        reject(res)
                    }
                }
                //其他状态码处理 
                else{ 
   
                    console.log("请求出错", req.status, req.responseText)
                    reject(req.status, req.responseText)
                }
            }
        }
    })
}

/** * 上传文件 * @param { Object } file 文件对象 * @param { Function } progressHandler 监听上传进度 * @param { Function } successHandler 上传成功回调 */
export function upload(file,progressHandler,successHandler){ 
   
    let formData = new FormData();
    formData.append("file", file);

    let req = window.XMLHttpRequest ? new XMLHttpRequest() : window.ActiveXObject ? new ActiveXObject("Microsoft.XMLHTTP") : null
    if(!req) throw new Error("无法创建请求")
    
    req.onreadystatechange = function() { 
   
        if (req.readyState === 4 && req.status === 200) { 
   
            console.log("上传成功", req.responseText);
            if(successHandler){ 
   
                successHandler(JSON.parse(req.responseText))
            }
        }
    };
 
    req.upload.addEventListener("progress", function(event) { 
   
        if(event.lengthComputable){ 
   
            let percent = Math.ceil(event.loaded * 100 / event.total);
            console.log("上传进度", percent)
            if(progressHandler){ 
   
                progressHandler(percent)
            }
        }
    }, false);

    req.open("POST", baseURL + "/common/upload");
    req.send(formData);
}

2. api.js:接口地址

import request from "./request.js"

export const UserInfo = (data) => request("./data/user.json", data)
export const OrderInfo = (data) => request("./data/order.json", data)

这里模拟一下服务器返回的数据:
/data/user.json文件

{ 
   
    "code": 1,
    "msg": "获取用户信息成功",
    "data": { 
   
        "id": 1,
        "name": "Herrona",
        "gender": "女"
    }
}

/data/order.json文件

{ 
   
    "code": 1,
    "msg": "获取订单信息成功",
    "data": { 
   
        "id": 1,
        "number": "DJKFDSJ001",
        "name": "零食"
    }
}

3. 执行异步请求

在html文件中调用(需要在服务器环境下运行)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>原生js异步请求</title>
</head>
<body>
    <script type="module"> import { 
      UserInfo, OrderInfo } from "./api.js" UserInfo({ 
      id: "1", name: "Herrona" }).then(({ 
       data })=>{ 
      console.log("用户信息", data) }) const { 
      data } = await OrderInfo({ 
      id: 1 }) console.log("订单信息", data) </script>
	
	<!-- 上传文件 -->
	<input type="file"/>
    <script type="module"> import { 
      upload } from "./request.js" let fileSelector = document.querySelector("input") fileSelector.onchange = function(){ 
      upload(this.files[0]) } </script>
</body>
</html>

执行结果如下:
在这里插入图片描述
控制台:
在这里插入图片描述

今天的文章JS异步请求分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/5722.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注