目录
标签的属性HTML如何从网页请求数据
数据,也是服务器对外提供的一种资源.只要是资源,必然要通过 请求 - 处理 - 响应 的方式进行获取.
如果要在网页中请求服务器上的数据资源,则需要用到 XMLHttpRequest 对象.
XMLHttpResquest 是浏览器提供的 js 成员,通过它,可以请求服务器上的数据资源.
最简单的用法:
var xhrObj = new XMLHttpRequest();
客户端请求服务器是,请求的方式有很多种,最常见的请求方式分别为 get 和 post 请求
· 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接口
- 选择请求的方式
- 填写的URL地址
- 填写请求的参数
- 点击 Send 按钮发起 GET 请求
- 查看服务器相应的结果
使用PostMan测试POST接口
- 选择请求的方式
- 填写请求的URL地址
- 选择Body面板并勾选数据格式
- 填写要发送的数据
- 点击 Send 按钮发起 POST 请求
- 查看服务器响应结果
实例: 图书管理系统(使用到了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 | 空格转化为 " + " ,但不对特殊字符编码.(很少用) |
表单的同步提交及其缺点
- <form> 表单同步提交后,整个界面会发生跳转,跳转到 action URL 所指向的地址, 用户体验差.
- <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请求
步骤:
- 创建 xhr 对象
- 调用 xhr.open() 函数
- 调用 xhr.send() 函数
- 监听 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请求
步骤:
- 创建 xhr 对象
- 调用 xhr.open() 函数
- 设置 Content-Type 属性 (固定写法)
- 调用 xhr.send()函数, 同时指定要发送的数据
- 监听 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 缺点
- XML 格式臃肿,和数据无关的代码太多, 体积大, 传输效率低.
- 在 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语法注意事项
- 属性名必须使用双引号包裹
- 字符串类型的值必须使用双引号
- JSON 中不允许使用单引号表示字符串
- JSON 中不能写注释
- JSON 最外层必须是对象或是数组
- 不能使用 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 新功能
- 可以设置 HTTP 请求的时限
- 可以使用 FormData 对象管理表单数据
- 可以上传文件
- 可以获得数据传输的进度信息
设置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 对象, 不仅可以发送文本信息, 还可以上传文件
实现步骤:
- 定义UI结构
- 验证是否选择了文件
- 向 FormData 中追加了文件
- 使用 xhr 发起上传文件的请求
- 监听 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 是专注于网络数据请求的库。
相比于原生的 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'))
});