XMLHttpRequest介绍

2023-09-18 15:19:22

一、介绍

1.创建 XMLHttpRequest

let xhr = new XMLHttpRequest();

2.初始化

xhr.open(method, URL, [async, user, password])

使用 open 方法进行一些初始化配置,method 和 URL 是必传的,其余的是可选的。

参数说明:

method —— HTTP 方法。通常是 “GET” 或 “POST”,小写也可。
URL —— 要请求的 URL,通常是一个字符串,也可以是 URL 对象。
async —— 是否同步。如果不传默认为true,如果显式地设置为 false,那么请求将会以同步的方式处理。
user,password —— HTTP 基本身份验证(如果需要的话)的登录名和密码。

3.发送请求

xhr.send([body])

使用 send 方法就会建立连接,发送请求。

参数说明:

body 是可选的,是 POST 请求方式的请求体。
即如果你上面的 xhr.open 里 method 是 使用的是 GET 请求 ,那么 body 参数是不需要的 ;
如果你上面的 xhr.open 里 method 是 使用的是 POST 请求,那么请求体就是 body 。

4.获取响应

下面这三个事件是最常用的:

  • load —— 当请求完成(即使 HTTP 状态为 400 或 500 等),并且响应已完全下载。
  • error —— 当无法发出请求,例如网络中断或者无效的 URL。
  • progress —— 在下载响应期间定期触发,报告已经下载了多少。
xhr.onload = function() { //请求正常发出时
 alert(`状态码: ${xhr.status} 结果: ${xhr.response}`);
};

xhr.onerror = function() { // 仅在根本无法发出请求时触发
 alert(`网络错误`);
};

xhr.onprogress = function(event) { // 定期触发,一般用于下载文件之类的返回下载进度
 // event.loaded —— 已经下载了多少字节
 // event.lengthComputable = true,当服务器发送了 Content-Length header 时
 // event.total —— 总字节数(如果 lengthComputable 为 true)
 alert(`总字节数: ${event.total} 已下载字节数: ${event.loaded} `);
};

5.响应类型

我们可以使用 xhr.responseType 属性来设置响应格式:

  • “”(默认)—— 响应格式为字符串
  • “text” —— 响应格式为字符串
  • “arraybuffer” —— 响应格式为 ArrayBuffer(对于二进制数据,请参见 ArrayBuffer,二进制数组)
  • “blob” —— 响应格式为 Blob(对于二进制数据,请参见 Blob),即文件数据
  • “document” —— 响应格式为 XML document(可以使用 XPath 和其他 XML 方法)或 HTML document(基于接收数据的 MIME 类型)
  • “json” —— 响应格式为 JSON(自动解析)
let xhr = new XMLHttpRequest();

xhr.open('GET', '/article/xmlhttprequest/example/json');

xhr.responseType = 'json';

xhr.send();

// 响应为 {"message": "Hello, world!"}
xhr.onload = function() {
  let responseObj = xhr.response;
  alert(responseObj.message); // Hello, world!
};

注意:

在旧的脚本中,你可能会看到 xhr.responseText,甚至会看到 xhr.responseXML 属性。

它们是由于历史原因而存在的,以获取字符串或 XML 文档。如今,我们应该在 xhr.responseType 中设置格式,然后就能获取如上所示的 xhr.response 了。

二、发送GET请求示例

let xhr = new XMLHttpRequest();
xhr.open("GET", "http://localhost:8081/apiList/v1/worldAddressAnalysis?country=中国");
xhr.send();

//请求正常发出时
xhr.onload = function () { 
     alert(`状态码: ${xhr.status} 结果: ${xhr.response}`);
};

// 仅在根本无法发出请求时触发
xhr.onerror = function () { 
    alert(`网络错误`);
};

三、发送POST请求示例

let xhr = new XMLHttpRequest();
xhr.open("POST", "http://localhost:8081/apiList/v1/calculator");
xhr.setRequestHeader('Content-Type', 'application/json; charset=utf-8');

//post 请求体参数
let param = {calculatorStr: "8*8-4"};
xhr.send(JSON.stringify(param));

//请求正常发出时
xhr.onload = function () { 
    alert(`状态码: ${xhr.status} 结果: ${xhr.response}`);
};

// 仅在根本无法发出请求时触发
xhr.onerror = function () { 
   alert(`网络错误`);
};

四、发送POST请求下载文件示例

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>

<body>
    <button id="btn">下载文件</button>

    <script>
        let btn = document.querySelector("#btn");
        btn.addEventListener("click", () => {
            let xhr = new XMLHttpRequest();
            xhr.open("POST", "http://localhost:8081/apiList/v1/downloadExcel");
            //设置请求头和响应类型
            xhr.setRequestHeader("Content-Type", "application/json;charset=UTF-8"); 
            xhr.responseType = 'blob';

            //设置请求体参数
            let param = { "fileName": "测试", "tableHeader": ["年级", "班级", "班主任", "男生人数", "女生人数", "语文平均分"] };
            xhr.send(JSON.stringify(param));

            //请求正常发出时
            xhr.onload = function () { 
                if (xhr.status === 200) {
                    // 获取文件blob数据并保存
                    saveAs(xhr.response, "download.xlsx");
                }
            };

            // 仅在根本无法发出请求时触发
            xhr.onerror = function () { 
                alert(`网络错误`);
            };

            // 定期触发 查看下载进度
            xhr.onprogress = function (event) { 
                alert(`总字节数: ${event.total} 已下载字节数: ${event.loaded} `);
            };
        });

        function saveAs(data, name) {
                var urlObject = window.URL || window.webkitURL || window;
                var export_blob = new Blob([data]);
                var save_link = document.createElementNS('http://www.w3.org/1999/xhtml', 'a')
                save_link.href = urlObject.createObjectURL(export_blob);
                save_link.download = name;
                save_link.click();
            }

    </script>
</body>

</html>

五、发送POST请求上传文件示例

假设我 springboot 上传文件的接口如下:

    @ApiOperation("文件上传到jar包所在服务器")
    @PostMapping(value = "/v1/fileSelfUpload1", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
    public JSONObject fileSelfUpload1(@RequestParam String filePath, @RequestParam(value = "file", required = true) MultipartFile file) {
        return userConsumer.fileSelfUpload(filePath, file);
    }

使用 XMLHttpRequest 上传文件示例如下:

<!DOCTYPE html>
<html lang="en-us">

<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Shopping list example</title>
    <style>
        li {
            margin-bottom: 10px;
        }

        li button {
            font-size: 8px;
            margin-left: 20px;
            color: #666;
        }
    </style>
</head>

<body>

    <div class="container">
        <input type="file" name="doc" id="doc">
        <button type="submit" id="submit">提交</button>
    </div>

    <script>
        var doc = document.querySelector('#doc')
        var subbtn = document.querySelector('#submit')

        subbtn.addEventListener('click', function (e) {
            // 获取上传的文件,数组
            let filedata = doc.files

            //先判断是否已经上传文件
            if (filedata.length <= 0) {
                return alert('请上传文件')
            }

            //通过FormData可以获取表单数据,也可以通过append添加数据,最后把FormData实例对象直接  上传发送请求
            let fd = new FormData()
            fd.append('file', filedata[0])
            fd.append('filePath', '/user/save/')

            const xhr = new XMLHttpRequest()
            xhr.open('POST', 'http://localhost:8081/apiList/v1/fileSelfUpload1')
            xhr.send(fd)

            xhr.onreadystatechange = function () {
                if (xhr.readyState === 4 && xhr.status === 200) {
                    console.log('上传成功');
                }
            }

        })
    </script>
</body>

</html>

参考:

XMLHttpRequest

XMLHttpRequest api

更多推荐

抖音seo源码关键词霸屏搜索

抖音seo源码mvg框架依据关键词霸屏搜索引擎机制技术代开发,抖音seo优化系统,抖音seo优化系统最终也是类比百度seo关键词霸屏搜索引擎来搭建,从短视频ai创意制作,发布,多账号平台管理。1:抖音SEO霸屏系统的简介抖音SEO霸屏系统,是一款专为抖音视频创作者和传播者量身打造的视频编辑软件。使用抖音SEO霸屏系统可

leetcode:118. 杨辉三角

一、题目函数原型:int**generate(intnumRows,int*returnSize,int**returnColumnSizes)参数解析:numRows是指明要求前几行杨辉三角returnSize是返回指针数组的元素个数returnColumnSizes是指明杨辉三角每一行有几个元素二、思路既然需要函数

Go 文件操作

创建文件将数据存储到文件之前,先要创建文件。GO语言中提供了一个Create()函数专门创建文件。该函数在创建文件时,首先会判断要创建的文件是否存在,如果不存在,则创建,如果存在,会先将文件中已有的数据清空。同时,当文件创建成功后,该文件会默认的打开,所以不用在执行打开操作,可以直接向该文件中写入数据。创建文件的步骤:

使用vue-cli搭建spa项目

目录什么是vue-cli安装vue-cli使用脚手架vue-cli(来构建项目)vue项目结构的说明基于spa项目完成路由基于spa项目完成嵌套路由什么是vue-cliVueCLI是一个官方发布的用于快速搭建Vue.js项目的命令行工具。它提供了一套交互式的脚手架,可以帮助开发者初始化项目、配置构建工具、管理依赖等。安

【GitLab私有仓库】在Linux上用Gitlab搭建自己的私有库并配置cpolar内网穿透

文章目录前言1.下载Gitlab2.安装Gitlab3.启动Gitlab4.安装cpolar5.创建隧道配置访问地址6.固定GitLab访问地址6.1保留二级子域名6.2配置二级子域名7.测试访问二级子域名前言GitLab是一个用于仓库管理系统的开源项目,使用Git作为代码管理工具,并在此基础上搭建起来的Web服务。G

数据库-理论基础

目录1.什么是数据库?2.数据库与文件系统的区别?3.常见的数据库由那些?4.关系型数据库(MySQL)的特征及组成结构介绍1.什么是数据库?数据:描述事物的符号记录,可以是数字,文字,图形,声音,语言等多种形式,他们都可以经过数字化后存入计算机数据库:存储数据的仓库,是长期存放在计算机内,有组织,可共享的大量数据集合

Flutter热更新技术探索

一,需求背景:APP发布到市场后,难免会遇到严重的BUG阻碍用户使用,因此有在不发布新版本APP的情况下使用热更新技术立即修复BUG需求。原生APP(例如:Android&IOS)的热更新需求已经比较成熟,但Flutter技术栈目前还缺少类似的技术方案,因此Flutter研发团队,也需要类似的热更新技术。二,Flutt

南大通用数据库-Gbase-8a-学习-39-show命令汇总(持续更新)

目录一、环境信息二、show功能参数三、show命令示例1、SHOWLOADLOGS(加载日志报错)2、SHOWCOLUMNS(列信息)3、SHOWCREATEDATABASE(建库信息)4、SHOWCREATEPROCEDURE(存储过程信息)5、SHOWCREATETABLE(建表信息)6、SHOWTABLELOC

中国核动力研究设计院使用 DolphinDB 替换 MySQL 实时监控仪表

随着仪表测点的大幅增多和采样频率的增加,中国核动力研究设计院仪控团队原本基于MySQL搭建的旧系统已经无法满足大量数据并发写入、实时查询和聚合计算的需求。他们在研究DB-Engines时序数据库榜单时了解到国内排名第一的DolphinDB。经过测试,发现其非常符合业务需求,并且在2022年1月正式选择了DolphinD

2023年全国研究生数学建模竞赛华为杯C题大规模创新类竞赛评审方案研究

2023年全国研究生数学建模竞赛华为杯C题大规模创新类竞赛评审方案研究原题再现:现在创新类竞赛很多,其中规模较大的竞赛,一般采用两阶段(网评、现场评审)或三阶段(网评、现场评审和答辩)评审。创新类竞赛的特点是没有标准答案,需要评审专家根据命题人(组)提出的评审框架(建议)独立评审。所以,对同一份作品,不同评委的评分可能

MySQL 开源证书真比 Postgres 更能带动社区吗?

笔者之前写的「全方位对比Postgres和MySQL」还在持续发酵,最近腾讯的公众号也发布了一篇「MySQLVSPostgreSQL,谁是世界上最成功的数据库?」,其中在对比两者使用的开源证书时写到:PostgreSQLLicense是一个宽松的开源许可证,类似于MIT许可证。它允许用户自由使用、修改和分发,无需公开源

热文推荐