AJAX基础学习

发布于:2022-11-09 ⋅ 阅读:(25) ⋅ 点赞:(0) ⋅ 评论:(0)

目录

HTML如何从网页请求数据

什么是Ajax

了解jQuery中的Ajax

$.get()函数的语法

$.get()发起不带参数的请求

$.get()发起带参数的请求

$.post()函数的语法

$.ajax()函数的语法

$.ajax()发起GET请求

 $.ajax()发起POST请求

接口

接口测试工具

使用PostMan测试GET接口

使用PostMan测试POST接口

form表单的使用

标签的属性

1. action 属性

2. target 属性

3. method 属性

4. enctype 属性

表单的同步提交及其缺点

通过Ajax提交表单数据

阻止表单默认提交行为

快速获取表单中的数据

XMLHttpRequest的基本使用

使用xhr发起GET请求

xhr 对象的readystate属性

使用xhr发出带参数的GET请求

查询字符串

URL 编码

URL编码与解码

 使用xhr发起POST请求

数据交换格式

XML

XML 缺点

JSON

JSON两种结构

JSON语法注意事项

JSON 和 JS 对象转换

XMLHttpRequest Level2

XMLHttpRequest Level2 新功能

设置HTTP请求时限

FormData 对象管理表单数据

上传文件

显示文件上传进度

Axios.js

axois.get()

axios.post() 

直接使用axios发起请求


HTML如何从网页请求数据

数据,也是服务器对外提供的一种资源.只要是资源,必然要通过 请求 - 处理 - 响应 的方式进行获取.

如果要在网页中请求服务器上的数据资源,则需要用到 XMLHttpRequest 对象.

XMLHttpResquest 是浏览器提供的 js 成员,通过它,可以请求服务器上的数据资源.

最简单的用法:

var xhrObj = new XMLHttpRequest();

客户端请求服务器是,请求的方式有很多种,最常见的请求方式分别为 getpost 请求 

· get 请求通常用于获取服务端资源(向服务器资源)

例如: 根据 URL 地址,从服务器获取HTML文件,css文件,js文件,图片文件,数组资源等

· post 请求通常用于向服务器提交数据(向服务器发送资源)

例如: 登录时向服务器提交的登录信息,注册时向服务器提交的注册信息,添加用户时向服务器提交用户信息等各种数据提交操作.

什么是Ajax

通俗理解: 在网页中利用 XMLHttpRequest 对象和服务器进行数据交互的方式,就是 Ajax.

Ajax 能让我们轻松实现网页与服务器之间的数据交互. 

了解jQuery中的Ajax

jQuery 中发起 Ajax 请求最常用的三个方法如下:

  • $.get()
  • $.post()
  • $.ajax()

$.get()函数的语法

jQuery 中 $.get() 函数的功能单一,专门用来发起 get 请求,从而将服务器上的资源请求到客户端来进行使用.

$.get() 函数语法如下:

$.get(url, [data], [callback]);

参数名 参数类型 是否必选 说明
url string 要请求的资源地址
data object 请求资源期间要携带的参数(发送到服务器)
callback function 请求成功时的 

$.get()发起不带参数的请求

直接提供请求的url地址和请求成功之后的回调函数即可,示例代码如下

$.get(http://www.liulongbin.top:3006/api/getbook'),  function(res) {

        console.log(res) // 这里的 res 是服务器返回的数据

})

<!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>Document</title>
</head>
<script src="./jQuery.js"></script>
<body>
    <button id="btnGET">
        不带参数的get请求
    </button>
    <script>
        $(function() {
            $('#btnGET').on('click', function() {
                $.get('http://liulongbin.top:3006/api/getbooks', function(res) {
                    console.log(res); // 结果为 {status: 200, msg: '获取图书列表成功', data: Array(8)}
                })
            })
        })
    </script>
</body>
</html>

$.get()发起带参数的请求

示例代码如下:

$.get('http://www.liulongbin.top:3006/api/getbooks', { id: 1}, function(res) {

        console.log(res);

});

<!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>Document</title>
</head>
<script src="./jQuery.js"></script>

<body>
    <button id="btnGET">
        带参数的get请求
    </button>
    <script>
        $(function () {
            $('#btnGET').on('click', function () {
                $.get('http://liulongbin.top:3006/api/getbooks', { id: 1 }, function (res) {
                    console.log(res); // 结果为 {status: 200, msg: '获取图书列表成功', data: Array(1)}
                })
            })
        })
    </script>
</body>

</html>

$.post()函数的语法

Query 中 $.post() 函数的功能单一,专门用来发起 post 请求, 向服务器提交数据

$.post() 函数的语法如下:

$.post(url, [data], [callback]);

参数名 参数类型 是否必选 说明
url string 提交数据的地址
data object 要提交的数据
callback function 数据提交成功后的回调函数

$.post() 向服务器提交数据的示例代码如下:

$.post (

        'http://liulongbin.top:3006/api/addbook',  // 请求的url地址

        { bookname: '水浒传', author: ' 施耐庵', publisher: '上海图书出版社' }, // 提交的数据

        function(res) {

                console.log(res);

         }

);

<!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>Document</title>
</head>
<script src="./jQuery.js"></script>

<body>
    <button id="btnPOST">
        post请求
    </button>
    <script>
        $(function () {
            $('#btnPOST').on('click', function () {
                $.post(
                    'http://liulongbin.top:3006/api/addbook',  // 请求的url地址
                    { bookname: '水浒传牛通版', author: ' 施耐庵', publisher: '上海图书出版社' }, // 提交的数据
                    function (res) {
                        console.log(res); // {status: 201, msg: '添加图书成功'}
                    }
                )
            })
        })
    </script>
</body>

</html>

$.ajax()函数的语法

相比于 $.get() 和 $.post() 函数, jQuery 中能够提供的 $.ajax() 函数,是一个功能比较综合的函数,他允许我们对Ajax请求进行更详细的配置.

$.ajax() 函数的基本语法如下:

$.ajax ({

        type: '', // 请求的方式, 例如 GET 或 POST(可以不用大写)

        url: '' , //请求的 URL 地址

        data: { }, // 这次请求要携带的数据

        success: function(res)  { } // 请求成功之后的回调函数

});

$.ajax()发起GET请求

$.ajax ({

        type: 'GET', // 请求的方式

        url: 'http://www.liulongbin.top:3006/api/getbooks' , //请求的 URL 地址

        data: { id: 1 }, // 这次请求要携带的数据

        success: function(res)  {

                console.log(res);  // 请求成功之后的回调函数

        }

});

 $.ajax()发起POST请求

$.ajax({

    type: 'POST', // 请求的方式

    url: 'http://www.liulongbin.top:3006/api/addbook', //请求的 URL 地址

    data: {

        bookname: '水浒传',

        author: '施耐庵',

        publisher: '上海图书馆出版社'

    },  // 这次请求要携带的数据

    success: function (res) {

        console.log(res); // 请求成功之后的回调函数

    }

});

接口

使用Ajax请求数据时, 被请求的 URL 地址,就叫作数据接口(简称接口).同时,每一个接口必须有请求方式.

例如:

http://www.liulongbin.top:3006/api/getbooks 获取图书列表的接口(get请求)

http://www.liulongbin.top:3006/api/addbook 添加图书的接口(post请求)

接口测试工具

为了验证接口能否正常被访问, 我们常常需要使用接口测试工具,对数据接口进行检测

好处: 接口测试工具能让我们再不写任何代码的情况下, 对接口进行调试和测试.

使用PostMan测试GET接口

  1.  选择请求的方式
  2. 填写的URL地址
  3. 填写请求的参数
  4. 点击 Send 按钮发起 GET 请求
  5. 查看服务器相应的结果

使用PostMan测试POST接口

  1. 选择请求的方式
  2. 填写请求的URL地址
  3. 选择Body面板并勾选数据格式
  4. 填写要发送的数据
  5. 点击 Send 按钮发起 POST 请求
  6. 查看服务器响应结果

实例: 图书管理系统(使用到了bootstrap 和 jquery)

<!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>Document</title>
      <link rel="stylesheet" href="./css/bootstrap.css">
      <script src="./js/jquery-3.5.1.js"></script>
      <script src="./js/bootstrap.js"></script>
</head>

<body style="padding :15px">
      <!-- 添加图书的panel面板 -->


      <div class="panel panel-primary">
            <div class="panel-heading">
                  <h3 class="panel-title">添加图书</h3>
            </div>
            <div class="panel-body form-inline">

                  <div class="input-group">
                        <div class="input-group-addon">书名</div>
                        <input type="text" class="form-control" id="iptBookname" placeholder="请输入书名">
                  </div>
                  <div class="input-group">
                        <div class="input-group-addon">作者</div>
                        <input type="text" class="form-control" id="iptAuthor" placeholder="请输入作者">
                  </div>
                  <div class="input-group">
                        <div class="input-group-addon">出版社</div>
                        <input type="text" class="form-control" id="iptPublisher" placeholder="请输入出版社">
                  </div>
                  <button id="btnAdd" class="btn btn-primary">添加</button>

            </div>
      </div>


      <!-- 图书的表格 -->


      <table class="table table-bordered table-hover">
            <thead>
                  <tr>
                        <th>Id</th>
                        <th>书名</th>
                        <th>作者</th>
                        <th>出版社</th>
                        <th>操作</th>
                  </tr>
            </thead>
            <tbody id="tb">
            </tbody>
      </table>

      <script>
            $(function () {
                  function getBookList() {
                        $.get('http://www.liulongbin.top:3006/api/getbooks', function (res) {
                              if (res.status == 200) {
                                    console.log(res);
                                    //遍历获取到的数据
                                    var rows = [];

                                    $.each(res.data, function (i, item) {
                                          rows.push('<tr><td>' + item.id + '</td><td>' + item.bookname + '</td><td>' + item.author + '</td><td>' + item.publisher + '</td><td><a herf="javascript:;" class = "del" data-id="' + item.id + '">删除</a></td></tr>')
                                    });
                                    //遍历结束之后添加到<tbody>中
                                    $('#tb').empty().append(rows.join(''));
                              } else {
                                    return alert('获取图书失败');
                              }

                        })
                  }
                  getBookList();

                  //删除图书事件
                  // 通过代理的方式为动态添加的元素绑定点击事件
                  $('tbody').on('click', '.del', function () {
                        var id = $(this).attr('data-id') // 获取自定义属性的值
                        $.get('http://www.liulongbin.top:3006/api/delbook',
                              { id: id },
                              function (res) {
                                    if (res.status != 200) return alert('删除图书失败');
                                    getBookList();
                              }
                        );
                  })

                  // 添加图书事件
                  $('#btnAdd').on('click', function () {
                        var bookname = $('#iptBookname').val().trim();
                        var author = $('#iptAuthor').val().trim();
                        var publisher = $('#iptPublisher').val().trim();
                        if (bookname.length <= 0 || author.length <= 0 || publisher.length <= 0) {
                              return alert('请填写完整的图书信息');
                        }
                        console.log(bookname + author + publisher);
                        $.post('http://www.liulongbin.top:3006/api/addbook',
                              { bookname: bookname, author: author, publisher: publisher },
                              function (res) {
                                    if (res.status != 201) return alert('添加图书失败');
                                    getBookList();
                                    $('#iptBookname').val('');
                                    $('#iptAuthor').val('');
                                    $('#iptPublisher').val('');
                              }
                        );
                  })
            })
      </script>

</body>

</html>

form表单的使用

表单在网页中主要负责数据采集的功能, HTML中<form>标签,就是用于采集用户输入的信息,并通过<form>标签的提交操作,把采集来的数据提交到服务器进行处理.

 表单由三个基础部分组成:

  • 表单标签
  • 表单域
  • 表单按钮

表单域: 包括了文本框, 密码框, 隐藏框, 多行文本框, 复选框, 单选框,  下拉选择框和文件文件上传框等.

<form>标签的属性

<form>标签用来采集数据, <form>标签的属性用来规定如何把采集到的数据发送到服务器

属性 描述
action URL地址 规定当提交表单时,向何处发送表单数据
method get 或 post 规定以何种方式把表单数据提交到 action URL
enctype

application/x-www-form-urlencoded

multipart/form-data

text-plain

规定再发送表单数据之前如何对其进行解码
target

_blank

_self

_parent

_top

framename

规定在何处打开action URL

1. action 属性

action 属性用来规定当提交表单时, 向何处发送表单数据.

action 属性的值应该是后端提供的一个 URL 地址, 这个 URL 地址专门负责接收表单提交过来的数据.

当 <form> 标签再未指定action属性值的情况下, action 的默认值为当前页面的URL地址.

注: 当提交表单后,页面会立即跳转到 action 属性指定的 URL地址.

2. target 属性

target 属性用来规定在何处打开 action URL.

它的可选值有五个, 默认情况下,target 的值是 _self, 表示在相同的框架中打开 action URL.

描述
_blank 在新窗口中打开
_self

默认.在相同的框架中打开

_parent 在父框架集中打开(很少用)
_top 在整个窗口中打开(很少用)
framename 在指定窗口中打开(很少用)

3. method 属性

规定以何种方式把表单数据提交到 action URL

它的可选类型有两个,分别是 get 和 post.

默认情况下, method 的值是get, 表示通过URL地址的形式,把表单数据提交到 action URL.

method 的值是post, 表示通过Form Data的形式, 把表单数据提交到 action URL.

注:

get 方式适合用来提交少量的,简单的数据.

post 方式适合用来提交大量的, 复杂的, 或包含文件上传的数据.

实际开发中, 使用post最多.

4. enctype 属性

规定在发送表单数据之前如何对数据进行编码.

他有三个可选值.

描述
application/x-www-form-urlencoded 在发送前编码所有字符(默认)
multipart/form-data

不对字符进行编码.

在使用包含文件上传控件的表单时,一定使用这个值

text/plain 空格转化为 " + " ,但不对特殊字符编码.(很少用)

表单的同步提交及其缺点

  1. <form> 表单同步提交后,整个界面会发生跳转,跳转到 action URL 所指向的地址, 用户体验差.
  2. <form> 表单同步提交后,页面之前的状态和数据会丢失.

解决方法:表单只负责采集数据, 使用Ajax将数据提交到服务器

通过Ajax提交表单数据

在jQuery中, 有两种方式监听到表单的提交时间.

$('#form1').submit(function (e) {

        alert('监听了表单的提交事件');

})

$('#form1').on('submit', function (e) {

        alert('监听了表单的提交事件');

})

阻止表单默认提交行为

点击表单提交按钮会自动跳转到action URL地址, 这就是表单的默认提交行为.

当监听到表单提交时间后,可以调用事件对象的 event.preventDefault()函数,来阻止表单的提交和页面的跳转,示例代码如下:

$('#form1').submit(function (e) {

        // 阻止表单的提交和页面的跳转

        e.preventDefault();

})

$('#form1').on('submit', function (e) {

        // 阻止表单的提交和页面的跳转

        e.preventDefault();

})

快速获取表单中的数据

为了简化表单中数据的获取操作, jQuery 提供了 serialize()函数, 其语法格式如下:

$(selector).serialize();

serialize() 函数的好处:可以一次性获取到表单中的所有的数据.

注: 在使用serialize()函数快速获取表单数据时,必须为每一个表单元素添加 name 属性.

<!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>Document</title>
    <script src="../jQuery.js"></script>
</head>

<body>

    <form id="form1" action="/login">
        <input type="text" name="user_name">
        <input type="password" name="password">
        <button type="submit">提交</button>
    </form>
    <script>
        $(function () {
            $('#form1').on('submit', function (e) {
                // 阻止表单的提交跳转事件
                e.preventDefault();
                alert('监听了表单的提交事件');
                //获取表单中的数据
                var data = $(this).serialize();
                console.log(data); // 结果为user_name=xxx&password=xxx
            })
        })

    </script>
</body>

</html>

XMLHttpRequest的基本使用

XMLHttpRequest 简称(xhr) 是浏览器提供的 JavaScript 对象,通过它,可以请求服务器上的数据资源. jQuery 中的 Ajax 函数, 就是基于 xhr 对象封装出来的.

使用xhr发起GET请求

步骤:

  1. 创建 xhr 对象
  2. 调用 xhr.open() 函数
  3. 调用 xhr.send() 函数
  4. 监听 xhr.onreadystatechange 事件
<script>
        // 1. 创建 XHR 对象
        var xhr = new XMLHttpRequest();
        // 2. 调用 open 函数,指定 请求方式 与 URL 地址
        xhr.open('get', 'http://www.liulongbin.top:3006/api/getbooks');
        // 3. 调用 send 函数, 发起Ajax请求
        xhr.send()
        // 4. 监听 onreadystatechange 事件
        xhr.onreadystatechange = function () {
            // 4.1 监听 xhr 对象的请求状态 readystate ; 与服务器响应的状态 status
            if (xhr.readyState === 4 && xhr.status === 200) {
                // 4.2 打印服务器响应回来的数据
                console.log(xhr.responseText);
            }
        }
</script>

xhr 对象的readystate属性

状态 描述
0 UNSENT XMLHttpRequest 对象已被创建,但尚未调用 open 方法
1 OPENED open() 方法已经被调用
2 HEADERS_RECEIVED send() 方法已被调用,响应头也被接收
3 LOADING 数据接收中,此时 response 属性中已经包含部分数据
4 DONE Ajax 请求完成, 这意味着数据传输彻底完成或失败

使用xhr发出带参数的GET请求

只需要在调用 xhr.open() 函数期间, 为 URL 地址指定参数即可:

xhr.open('GET', 'httwww.liulongbin.top:3006/api/getbooks?id=1&bookname=西游记')

在URL地址后面通过问号的方式传参数, 通过键值对的方式,多个参数可以通过 '&' 拼接.

这种在URL地址后面拼接的参数, 叫做查询字符串

查询字符串

定义: 查询字符串 (URL 参数) 是指在 URL 的末尾加上用于向服务器发送信息的字符串(变量).

格式: 将英文 ? 放在 URL 的末尾, 然后再加上 参数 = 值, 想加上多个参数的话, 使用 '&' 符号进行分隔. 以这个形式, 可以将想要的数据添加到 URL 中.

URL 编码

URL地址中只允许出现英文相关的字母, 表单符号, 数字, 因此, 在URL地址中不允许出现中文字符. 

如果 URL 中需要包含中文这样的字符都必须编码(转义).

URL 编码原则: 使用安全的字符 ( 没有特殊用途或者特殊含义的可打印字符) 去表示那些不安全的字符.

URL编码与解码

浏览器提供的 URL编码和解码的API 分别是:

  • encode URL() 编码的函数
  • decode URL() 解码的函数
<script>
        console.log(encodeURI('我是程序员'));
        // 结果为 %E6%88%91%E6%98%AF%E7%A8%8B%E5%BA%8F%E5%91%98
        console.log(decodeURI('%E6%88%91%E6%98%AF'));
        // 结果为 我是 (每3个%是一个中文字符)
</script>

 使用xhr发起POST请求

 步骤:

  1. 创建 xhr 对象
  2. 调用 xhr.open() 函数
  3. 设置 Content-Type 属性 (固定写法)
  4. 调用 xhr.send()函数, 同时指定要发送的数据
  5. 监听 xhr.onreadystatechange 事件
<script>
        // 1. 创建 xhr 对象
        var xhr = new XMLHttpRequest();
        // 2. 调用 open() 函数
        xhr.open('post', 'http://www.liulongbin.top:3006/api/addbook');
        // 3. 设置 Content-Type 属性 (固定写法)
        xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded')
        // 4. 调用 send() 函数. 同时将数据以查询字符串的形式, 提交到服务器
        xhr.send('bookname=水浒传&author=施耐庵&publisher=天津图书出版社');
        // 5. 监听 xhr.onreadystatechange()事件
        xhr.onreadystatechange = function () {
            if (xhr.readyState === 4 && xhr.status === 200) {
                console.log(xhr.responseText);
            }
        }
</script>

数据交换格式

最常见的数据交换格式 XML 和 JSON

XML

XML 即 "可扩展标记语言" , 因此 XML 和HTML类似也是一种标记语言 但两者并没有什么关系.

  • HTML 被设计用来描述网页上的内容, 是网页内容的载体
  • XML 被设计用来传输和存储数据, 是数据的载体

XML 缺点

  1. XML 格式臃肿,和数据无关的代码太多, 体积大, 传输效率低.
  2. 在 JavaScript 中解析 XML 比较麻烦

JSON

JSON 即 " JavaScript 对象表示法 " , 简单来讲 JSON 就是 JavaScript 对象和数组的字符串表示法, 它使用文本表示一个 JS 对象或数据的信息, 因此 JSON 的本质是字符串.

作用: JSON是一个轻量级的文本数据交换格式,在作用上类似于 XML, 专门用于存储和传输数据, 但是JSON 比XML 更小 更快 更易解析.

JSON两种结构

JSON 就是用字符串来表示 JavaScript 的对象和数组, 所以, JSON 中包含对象数组两种结构,通过这两种结构的相互嵌套,可以表示各种复杂的数据结构.

对象结构 : 对象结构在 JSON 中表示为 { } 括起来的内容 数据结构为{ key: value, key: value, ...}

key 必须为字符串. value 可以为 数字, 字符串, 布尔值, null, 数组, 对象6中类型.

数组结构 : 数组结构在 JSON 中表示为 [ ] 括起来的内容. 数据结构为["java", 30, true, ...]

数据类型可以为 数字, 字符串, 布尔值, null, 数组, 对象6中类型.

JSON语法注意事项

  1. 属性名必须使用双引号包裹
  2. 字符串类型的值必须使用双引号
  3. JSON 中不允许使用单引号表示字符串
  4. JSON 中不能写注释
  5. JSON 最外层必须是对象或是数组
  6. 不能使用 undefined 或函数作为 JSON 值

JSON 和 JS 对象转换

使用JSON.parse() 方法

var obj = JSON.parse( ' { "a": "Hello", "b": "World" } ' )

// 结果是 { a: 'Hello', b: 'World' }

 使用JSON.stringify() 方法

 var json = JSON.parse( { a: 'Hello', b: 'World' } )

// 结果是 ' { "a": "Hello", "b": "World" } ' 

XMLHttpRequest Level2

XMLHttpRequest Level2 新功能

  1. 可以设置 HTTP 请求的时限
  2. 可以使用 FormData 对象管理表单数据
  3. 可以上传文件
  4. 可以获得数据传输的进度信息

设置HTTP请求时限

XMLHttpRequest 增加了 timeout 属性,可以设置 HTTP 请求时限:

xhr.timeout = 3000

上述语句,将最长等待事件设置为 3000 毫秒, 过了这个时限, 就自动停止 HTTP 请求. 与之搭配的还有一个 timeout 事件, 用来指定回调函数:

xhr.ontimeout = function.(event) {

        alert('请求超时!')

}

FormData 对象管理表单数据

 Ajax 操作往往用来提交表单数据, 为了方便表单的处理, HTML5 新增了一个 FormData 对象, 可以模拟表单操作

<script>
        // 1. 创建FormData对象
        var fd = new FormData()
        // 2. 为FormData 添加表单项
        fd.append('uname', 'maimai');
        fd.append('upwd', '123456');
        // 3. 创建 XHR 对象
        var xhr = new XMLHttpRequest();
        // 4. 指定请求类型与URL地址
        xhr.open('post', 'http://www.liulongbin.top:3006/api/formdata')
        // 5. 直接提交 FormData 对象,这与提交网页表单的效果,完全一样.
        xhr.send(fd);
        // 打印请求成功后回调的内容
        xhr.onreadystatechange = function () {
            if (xhr.readyState === 4 && xhr.status === 200 {
                console.log(JSON.parse(xhr.responseText));
            }
        }
</script>

 FormData 也可以用来获取网页HTML表单元素的值

<body>
    <form id="form1">
        <input type="text" name="uname" autocomplete="off" />
        <input type="password" name="upwd" />
        <button type="submit">提交</button>
    </form>

    <script>
        // 获取表单元素
        var form = document.querySelector('#form1');
        // 监听表单元素的 submit 事件
        form.addEventListener('submit', function (e) {
            e.preventDefault();
            var fd = new FormData(form);
            var xhr = new XMLHttpRequest();
            xhr.open('post', 'http://www.liulongbin.top:3006/api/formdata');
            xhr.send(fd);
            xhr.onreadystatechange = function() {
                if (xhr.readyState === 4 && xhr.status === 200) {
                    console.log(JSON.parse(xhr.responseText));
                }
            }
        })
    </script>
</body>

上传文件

新版 XMLHttpRequest 对象, 不仅可以发送文本信息, 还可以上传文件

实现步骤:

  1. 定义UI结构
  2. 验证是否选择了文件
  3. 向 FormData 中追加了文件
  4. 使用 xhr 发起上传文件的请求
  5. 监听 onreadystatechange 事件
<body>
    <!-- 1. 文件选择框 -->
    <input type="file" id="file1">
    <!-- 2. 上传按钮 -->
    <button id="btnUpload">上传文件</button>
    <br>
    <!-- 3. 显示上传到服务器的图片 -->
    <img id='img' src="" alt="" width="800">
    <script>


        // 1. 获取上传文件的按钮
        var btnUpload = document.querySelector('#btnUpload');
        // 2. 为按钮添加 click 事件监听
        btnUpload.addEventListener('click', function () {
            // 3. 获取到选择文件的列表
            var files = document.querySelector('#file1').files
            if (files.length <= 0) {
                return alert('请选择要上传的文件!');
            } else {
                console.log('已选择要上传的文件');
            }
            // 1. 创建 FormData 对象
            var fd = new FormData();
            // 2. 将用户选择的文件,添加到 FormData 中
            fd.append('avatar', files[0]);


            // 1. 创建 xhr 对象
            var xhr = new XMLHttpRequest();
            // 2. 调用 open 函数,指定请求类型与URL地址,其中请求类型必须为 POST
            xhr.open('post', 'http://www.liulongbin.top:3006/api/upload/avatar');
            // 3. 发起请求
            xhr.send(fd);

            
            // 监听事件
            xhr.onreadystatechange = function () {
                if (xhr.readyState === 4 && xhr.status === 200) {
                    var data = JSON.parse(xhr.responseText)
                    if (data.status === 200) { // 上传文件成功
                        // 将服务器返回的图片地址,设置 <img> 标签的 src 属性
                        document.querySelector('#img').src = 'http://www.liulongbin.top:3006' + data.url
                    } else { // 上传文件失败
                        console.log('图片上传失败' + data.message)
                    }
                }
            }
        })
    </script>
</body>

显示文件上传进度

可以通过监听 xhr.upload.onprogress 事件, 来获取到文件上传进度.

// 创建 xhr 对象
var xhr = new XMLHttpRequest();
// 监听 xhr.upload 的 onprogress 事件
xhr.upload.onprogress = function(e) {
// e.lengthComputable 是一个布尔值,表示当前上传的资源是否具有可计算的长度
    if (e.lengthComputable) {
    // e.loaded 已传输的字节
    // e.total  需传输的字节
    var percentComplete = Math.ceil((e.loaded / e.total) * 100);
    }
}

可以通过监听 xhr.upload.onload 事件, 监听上传完成事件.

Axios.js

起步 | Axios 中文文档 | Axios 中文网

Axios 是专注于网络数据请求的库。

相比于原生的 XMLHttpRequest 对象,axios 简单易用。

相比于 jQuery, axios更轻量级,只专注于网络数据请求。 

axois.get()

axios.get('url', { params: { /*参数*/ }}).then(callback)
// 请求的 URL 地址
var url = 'http://www.liulongbin.top:3006/api/get'
// 请求的参数对象
var paramsObj = { name:'maimai', age: 20}
// 调用 axios.get() 发起 get 请求
axios.get(url, {params: paramsObj}).then(function(res){
    //res.data 是服务器返回的数据
    var result = res.data
    console.log(result)
}

axios.post() 

axios.post('url', { /*参数*/ }).then(callback)
// 请求的 URL 地址
var url = 'http://www.liulongbin.top:3006/api/post'
// 提交到服务器的对象
var dataObj = { name:'maimai', age: 20}
// 调用 axios.post() 发起 post 请求
axios.post(url, dataObj).then(function(res){
    //res.data 是服务器返回的数据
    var result = res.data
    console.log(result)
}

直接使用axios发起请求

axios({
    method: '请求类型',
    url: '请求的URL地址',
    data: {/* post数据 */},
    params: {/* get参数 */}
}).then(callback)

​​​​​​​

// post请求 url-> data -> function
axios.post('/user', {
    firstName: 'Fred',
    lastName: 'Flintstone'
  })
  .then(function (response) {
    console.log(response);
  })
  .catch(function (error) {
    console.log(error);
  });
//多个并发请求
function getUserAccount() {
  return axios.get('/user/12345');
}

function getUserPermissions() {
  return axios.get('/user/12345/permissions');
}

Promise.all([getUserAccount(), getUserPermissions()])
  .then(function (results) {
    const acct = results[0];
    const perm = results[1];
  });
// 在 node.js 用GET请求获取远程图片
axios({
  method: 'get',
  url: 'http://bit.ly/2mTM3nY',
  responseType: 'stream'
})
  .then(function (response) {
    response.data.pipe(fs.createWriteStream('ada_lovelace.jpg'))
  });