Ajax-day03

原生Ajax

Ajax Asynchronous Javascript and Xml 异步的JavaScript和Xml

原生Ajax基本用法

  • 浏览器已经实现了Ajax发送请求的技术XMLHttpRequest(2005之后)
  • 基本使用步骤get post 模板
    • 创建xhr对象
    • 调用xhr.open()方法准备参数
    • 调用xhr.send()方法执行发送动作
    • 监听xhr.onreadystatechange事件,用于获取服务器返回数据
  1. // 1、创建xhr实例对象
  2. var xhr = new XMLHttpRequest()
  3. // 2、准备发送请求的相关参数
  4. xhr.open('get', 'http://www.liulongbin.top:3006/api/getbooks')
  5. // 3、执行发送请求的动作
  6. xhr.send(null)
  7. // 4、指定回调函数,用于处理服务器的返回
  8. xhr.onreadystatechange = function () {
  9. // 该函数是服务器返回数据后触发,该方法不仅仅触发一次
  10. if (xhr.readyState === 4 && xhr.status === 200) {
  11. // 如果上述两个条件都满足,就可以获取服务器返回的正常数据
  12. // ret 是普通字符串
  13. var ret = xhr.responseText
  14. console.log(ret)
  15. console.log(typeof ret)
  16. }
  17. }

总结:使用原生Ajax发送请求很繁琐。

xhr对象详解-请求参数

  • get请求方式传参
    • url地址查询字符串方式传递参数
  1. xhr.open('get', 'http://www.liulongbin.top:3006/api/getbooks?id=1&author=吴承恩')
  2. var param = '?id=1&author=吴承恩'
  3. // params = encodeURI(params)
  4. xhr.open('get', 'http://www.liulongbin.top:3006/api/getbooks' + param)
  • url编码(url如果传递参数本身是不支持中文,所以get传参时需要编码,如果不进行编码,那么后端可能得不到正确的数据)
    • encodeURI() 编码函数
    • decodeURI() 解码函数
  1. var str = '黑马程序员'
  2. var str1 = encodeURI(str)
  3. console.log(str1)
  4. var str2 = decodeURI('%E9%BB%91%E9%A9%AC')
  5. console.log(str2)
  • post请求方式传参
    • 必须设置请求头
    • 必须在send方法调用前设置请求头
  1. // 设置 Content-Type 请求头(告诉服务器前端传递过去的数据格式)
  2. xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded')
  3. // 调用 send 函数
  4. xhr.send('bookname=水浒传&author=施耐庵&publisher=上海图书出版社')

xhr对象详解-响应状态

  • readyState
    • 如果该状态值为4表示服务器已经完全把数据返回了,此时可以获取后台的数据
    • 仅仅表示数据已经得到,但是正确与否不确定

image.png

  • status
    • http协议的状态:如果status是200表示数据正常,否则表示数据不正常
  1. // readyState状态值是4表示服务器数据已经完全返回
  2. // status的值是200表示服务器返回的数据是正常的
  3. // if (xhr.readyState === 4 && xhr.status === 200) {
  4. // // 如果这两个条件都成立,就可以获取服务器数据了
  5. // var res = xhr.responseText
  6. // console.log(typeof res)
  7. // } else {
  8. // alert(xhr.responseText)
  9. // }
  10. // ---------------------------------------------------
  11. // 考虑异常情况,需要用这种写法
  12. if (xhr.readyState === 4) {
  13. if (xhr.status === 200) {
  14. // 成功获取服务器数据
  15. var res = xhr.responseText
  16. } else {
  17. alert('服务器发生错误')
  18. }
  19. }

总结

  1. xhr.readyState===4表示后端已经把数据完整返回,但是正常与否不确定
  2. xhr.status===200表示服务器返回的数据是正常的,否则是异常的

xhr对象详解-响应数据

  • 数据格式分析
    • xml (类似于html格式,标签包裹数据)
      • 缺点1:冗余数据比较多,不方便网络传输
      • 缺点2:不方便前端解析
    • json(本质上是字符串,但是有规则)
      • 解决XML的两个问题
  • JSON基本规则(JSON是字符串的一种格式)
    • 数据结构为键值对 uname: ‘lisi’
    • key 必须是使用英文的双引号包裹的字符串 “uname”:”lisi”
    • 字符串类型的值必须使用双引号包裹 “uname”:”lisi”
    • JSON 中不能写注释
    • JSON 的最外层必须是对象或数组格式
    • 不能使用 undefined 或函数作为 JSON 的值
    • value 的数据类型可以是数字、字符串、布尔值、null、数组、对象6种类型
  • JSON格式转换(JSON和对象之间的关系)
    • 对象转字符串 JSON.stringify()
    • 字符串转对象 JSON.parse()
  1. var jsonStr = '{"a": "Hello", "b": "world"}'
  2. // 把JSON字符串转成对象
  3. var obj = JSON.parse(jsonStr)
  4. console.log(obj)
  5. // 把对象转成JSON字符串
  6. var obj2 = { a: 'hello', b: 'world', c: false }
  7. var str = JSON.stringify(obj2)
  8. console.log(str)
  • Ajax返回的结果处理
    • xhr.responseText本身是字符串
  1. var obj = JSON.parse(xhr.responseText)

总结:

  1. JSON格式的具体规范
  2. JSON字符串与对象之间的转换

模仿$.ajax封装函数

  • 基本结构分析:回调函数参数如何得到
  • 参数处理:支持get和post
  • 响应数据处理:转换为对象
  1. // 自己定义这样一个方法,可以实现$.ajax类似的功能
  2. // 那么,可以任务这就是jQuery方法的源代码
  3. function ajax(option) {
  4. // console.log(option.type)
  5. // console.log(option.url)
  6. // console.log(option.data.id)
  7. // console.log(option.success)
  8. // data可以认为是后端返回的数据
  9. // 1、创建xhr实例对象
  10. const xhr = new XMLHttpRequest()
  11. // 2、准备请求参数
  12. // http://www.liulongbin.top:3006/api/getbooks?id=1&author=abc
  13. // 需求:把对象转换为查询字符串
  14. /*
  15. {
  16. id: 1,
  17. author: 'abc'
  18. }
  19. 上述对象需要转换为如下的格式
  20. id=1&author=abc
  21. */
  22. let params = ''
  23. for (const key in option.data) {
  24. // id=1&author=abc&
  25. params += key + '=' + option.data[key] + '&'
  26. }
  27. if (params.length > 0) {
  28. // 去掉最后一个&符号
  29. if (params.lastIndexOf('&') === params.length - 1) {
  30. // 最后是&符号,那么就去掉
  31. params = params.substring(0, params.length - 1)
  32. }
  33. }
  34. // 只有get请求时,才拼接到URL地址之后
  35. // toUpperCase方法的作用:把字符串转换为大写
  36. if (option.type.toUpperCase() === 'GET') {
  37. option.url += '?' + encodeURI(params)
  38. }
  39. // http://www.liulongbin.top:3006/api/getbooks?id=1&author=abc
  40. xhr.open(option.type, option.url)
  41. // 3、执行发送请求的动作
  42. // 如果是post请求参数的话,需要使用send发送数据给服务器
  43. if (option.type.toUpperCase() === 'POST') {
  44. // post请求必须设置请求头
  45. xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded')
  46. xhr.send(params)
  47. } else {
  48. // get请求
  49. xhr.send(null)
  50. }
  51. // 4、监听服务器返回的数据
  52. xhr.onreadystatechange = function () {
  53. if (xhr.readyState === 4) {
  54. if (xhr.status === 200) {
  55. // 获取后端返回的原始数据
  56. let result = xhr.responseText
  57. result = JSON.parse(result)
  58. // const result = '{"uname": "lisi"}'
  59. option.success(result)
  60. }
  61. }
  62. }
  63. }
  64. ajax({
  65. type: 'post',
  66. url: 'http://www.liulongbin.top:3006/api/addbook',
  67. data: {
  68. author: 'nihao1',
  69. bookname: 'hello',
  70. publisher: 'abc'
  71. },
  72. success: function (ret) {
  73. console.log(ret.msg)
  74. }
  75. })

总结

  1. success是如何获取数据的
  2. Ajax发送请求的基本流程
  3. get请求参数如何传递
  4. post请求参数如何传递
  5. 返回的结果要转换成对象

原生Ajax升级版

XHR2.0介绍

  • 旧版的缺点
    • 仅仅支持文本数据传输,无法上传文件(早期文件上传基于Flash)
    • 传送数据没有进度提示
  • 新版功能
    • 可以使用FormData传递表单数据
    • 可以上传文件
    • 传输数据时进行提示

FormData基本用法

  • FormData是标准的js构造函数(WebAPI)
  • FormData作用是啥?传递post请求参数(一般数据来源于表单)
  • 如何知道FormData实例对象有几个方法?看官网

FormData相关方法

  • fd.append 添加数据
  • fd.get 获取数据
  • fd.has 判断是否有数据
  • fd.delete 删除数据
  1. var fd = new FormData()
  2. fd.append('msg', 'nihao')
  3. // var v = fd.get('msg')
  4. // fd.delete('msg')
  5. var f = fd.has('msg')
  6. console.log(f)

总结:

  1. FormData用于post提交参数
  2. FormData提供相关的方法用来操作参数数据

用法一:

  • 造函数不传参使用append方法添加参数
  • 注意:不需要设置请求头
  1. const btn = document.getElementById('btn')
  2. btn.onclick = function (e) {
  3. e.preventDefault()
  4. // 1、创建xhr实例对象
  5. const xhr = new XMLHttpRequest()
  6. // 2、准备请求参数
  7. // 如下的接口专门用于测试FormData数据的,
  8. // 该接口的功能是:提交什么数据就返回什么数据
  9. xhr.open('post', 'http://www.liulongbin.top:3006/api/formdata')
  10. // 3、执行发送请求动作
  11. const items = document.getElementsByTagName('input')
  12. const bookname = items[0].value
  13. const author = items[1].value
  14. const publisher = items[2].value
  15. // console.log(bookname, author, publisher)
  16. const fd = new FormData()
  17. fd.append('bookname', bookname)
  18. fd.append('author', author)
  19. fd.append('publisher', publisher)
  20. // FormData数据格式是独立的一种格式multipart/form-data
  21. // 这种格式的数据,后端需要额外处理才可以得到这种数据
  22. xhr.send(fd)
  23. // 4、监听服务器返回的结果
  24. xhr.onreadystatechange = function () {
  25. if (xhr.readyState === 4) {
  26. if (xhr.status === 200) {
  27. // 获取正常数据
  28. const ret = xhr.responseText
  29. console.log(ret)
  30. }
  31. }
  32. }
  33. }

总结:

  1. FormData数据格式是独立的一种格式multipart/form-data
  2. 这种格式的数据,后端需要额外处理才可以得到这种数据
  3. 不可以设置请求头,默认自动设置为multipart/form-data

用法二:

  • 这种方式,表单的输入域必须提供name属性
  1. // 通过 DOM 操作,获取到 form 表单元素
  2. var form = document.querySelector('#form1')
  3. // 创建 FormData,快速获取到 form 表单中的数据
  4. var fd = new FormData(form)
  5. // 也可以一块使用append继续追加数据
  6. fd.append('info', 'abc')
  7. // 发送请求
  8. xhr.send(fd)

总结

  1. 表单的输入域必须提供name属性
  2. 可以和append结合使用

FormData文件上传

文件上传的本质:把本地的文件传递到服务器并进行存储,然后返回文件的URL

  • UI布局需要用到file标签
  • 判断是否选择文件
  • 向FormData中追加文件
  • 使用xhr发起上传文件请求
  • 监听onreadystatechange事件
  1. <form id='upload'>
  2. <!-- 添加multiple属性表示支持多选,默认仅仅可以选择一个文件 -->
  3. <input type="file" id="myfile" multiple>
  4. <input type="submit" value="点击">
  5. </form>
  1. // 基于FormData上传文件
  2. const form = document.getElementById('upload')
  3. form.onsubmit = function (e) {
  4. e.preventDefault()
  5. // 1、创建xhr实例对象
  6. const xhr = new XMLHttpRequest()
  7. // 2、准备请求参数
  8. xhr.open('post', 'http://www.liulongbin.top:3006/api/upload/avatar')
  9. // 3、执行发送请求动作
  10. const file = document.getElementById('myfile')
  11. console.log(file.files)
  12. const fd = new FormData()
  13. // file表示input类型是file的标签DOM对象,他有一个属性files表示选中的文件列表
  14. fd.append('avatar', file.files[0])
  15. xhr.send(fd)
  16. // 4、监听服务器返回的结果
  17. xhr.onreadystatechange = function () {
  18. if (xhr.readyState === 4) {
  19. if (xhr.status === 200) {
  20. // 获取正常数据
  21. const ret = xhr.responseText
  22. console.log(ret)
  23. }
  24. }
  25. }
  26. }
  • 直接基于Form表单也可以进行文件上传
  1. <form>
  2. <input type="file" name="avatar" id="myfile">
  3. <button id="btn">点击</button>
  4. </form>
  1. // 通过FormData上传文件
  2. var form = document.querySelector('form')
  3. var fd = new FormData(form)

总结

  1. 文件上传需要通过FormData进行
  2. 可以直接把文件append进去
  3. 也可以通过new FormData时直接把表单DOM放到构造函数的参数中
  4. file标签的multiple属性用于控制多文件上传

基于jQuery上传文件

需求:基于jQuery的方式上传文件

  1. <form id='upload'>
  2. <!-- 添加multiple属性表示支持多选,默认仅仅可以选择一个文件 -->
  3. <input type="file" name='avatar' id="myfile" multiple>
  4. <input type="submit" value="点击">
  5. </form>
  6. <script src="lib/jquery.js"></script>
  7. <script>
  8. // 基于jQuery上传文件
  9. $('#upload').submit(function (e) {
  10. e.preventDefault()
  11. console.log('hello')
  12. const fd = new FormData()
  13. fd.append('avatar', $('#myfile').get(0).files[0])
  14. $.ajax({
  15. type: 'post',
  16. url: 'http://www.liulongbin.top:3006/api/upload/avatar',
  17. // 默认Ajax提交的数据是application/x-www-form-urlencoded
  18. // 但是FormData的格式是multipart/form-data
  19. // false表示不把数据的格式进行转换,而是保留FormData的原始格式
  20. processData: false,
  21. // false表示不采用默认的提交数据类型,而是采用FormData的格式
  22. contentType: false,
  23. data: fd,
  24. success: function (ret) {
  25. console.log(ret)
  26. }
  27. })
  28. })
  29. </script>

总结:

  1. $.ajax默认提交的数据格式是 application/x-www-form-urlencoded (uname=lisi&age=12)
  2. 为了上传文件,需要定制提交的数据格式
    1. processData: false, 表示不把数据的格式进行转换,而是保留FormData的原始格式
    2. contentType: false, 表示不采用默认的提交数据类型,而是采用FormData的格式

上传文件进度提示

上传大一点儿的文件需要一些时间,这段时间最好给一个提示,提升用户体验

  • xhr.upload.onprogress = function (e) {}
    • 监听文件上传进度
  • xhr.upload.onload = function () {}
    • 监听文件上传完成事件
  1. <progress id="pg" max="100" value="0"></progress>
  2. <!-- bootstrap 中的进度条 -->
  3. <div class="progress" style="width: 500px; margin: 15px 10px;">
  4. <div class="progress-bar progress-bar-striped active" style="width: 0%" id="percent">
  5. 0%
  6. </div>
  7. </div>
  1. // 获取到用户选择的文件列表
  2. var files = document.querySelector('#file1').files
  3. if (files.length <= 0) {
  4. return alert('请选择要上传的文件!')
  5. }
  6. var fd = new FormData()
  7. // 将用户选择的文件,添加到 FormData 中
  8. fd.append('avatar', files[0])
  9. var xhr = new XMLHttpRequest()
  10. // 监听文件上传的进度
  11. xhr.upload.onprogress = function (e) {
  12. if (e.lengthComputable) {
  13. // 判断文件是否正在上传
  14. // 已经上传的大小/文件的总大小 = 进度
  15. var rate = Math.ceil((e.loaded / e.total) * 100)
  16. // 把进度数据应用到进度条上
  17. var bar = document.getElementById('percent')
  18. // 修改进度条的进度
  19. bar.style = 'width: '+ rate +'%'
  20. // 进度条显示的文字进度
  21. bar.innerHTML = rate + '%'
  22. }
  23. }
  24. // 监听文件上传完成的动作
  25. xhr.upload.onload = function () {
  26. // 文件上传完成后触发,修改进度条颜色
  27. var bar = document.getElementById('percent')
  28. // DOM元素的classList可以操作类名
  29. // 删除已有的类名
  30. bar.classList.remove('progress-bar-striped')
  31. // 添加一个新的类名
  32. bar.classList.add('progress-bar-success')
  33. }
  34. xhr.open('POST', 'http://www.liulongbin.top:3006/api/upload/avatar')
  35. xhr.send(fd)

总结:

  1. 监听文件上传的进度 e.loaded/e.total
  2. 监听文件上传的完成

基于jQuery的方式监听上传进度

技术采用jQuery,需要控制上传文件的进度

  1. // 提供一种定制原生Ajax对象的方式
  2. xhr: function () {
  3. const xhr = new XMLHttpRequest()
  4. xhr.upload.onprogress = function (e) {
  5. if (e.lengthComputable) {
  6. const percent = Math.floor(e.loaded / e.total * 100) + '%'
  7. $('#percent').css('width', percent).html(percent)
  8. }
  9. }
  10. xhr.upload.onload = function () {
  11. $('.progress').hide()
  12. }
  13. return xhr
  14. },
  15. // ---------------------------------
  16. let xhr = new XMLHttpRequest()
  17. if (option.xhr) {
  18. xhr = option.xhr()
  19. }

总结:xhr的函数内部,可以创建一个新的原生Ajax的实例对象,如果内部的默认xhr对象

总结

  • 关于FormData
    • FormData的作用:post提交数据给服务器
    • FormData的基本使用
      • fd.append 添加数据
      • fd.get 查看数据
    • 应用场景:直接提交表单数据;上传文件
      • new FormData时,构造函数没有参数,而是通过append动态添加数据
      • new FormData时,构造函数传入一个参数(参数是form标签DOM对象),前提条件表单输入域必须有name属性,属性值由后端接口决定
    • 文件上传也是基于FormData实现
      • 手动获取file标签的文件数据,然后append进入FormData里面
      • 直接在new FormData时,把form标签的DOM元素添加到构造函数里面即可
    • 基于Ajax的xhr2特性上传文件 xhr.send(fd)
    • 监听文件上传的进度
      • xhr.upload.onprogress 监听上传进度
      • xhr.upload.onload 监听上传完成

axios

axios介绍

  • axios 是一个专门用于调用后台接口的js库,后续Vue和React环境都可以使用它
    • 支持客户端发送Ajax请求
    • 支持服务端Node.js发送请求
    • 支持Promise相关用法(解决回调地狱问题)
    • 支持请求和响应的拦截器功能(登录时会用到)
    • 可以手动取消请求
    • 自动转换JSON数据(JSON.parse(res))
    • 可以更加安全的处理请求

基本用法

  • 发送请求通过axios.get
  • 获取结果通过then方法
    • 对于返回的结果来说,axios会在后台返回的数据外面包裹一层data属性
      • 假如后台返回的数据是 {status: 200, msg: ‘返回成功’,data: [{}]}
      • 那么axios实际得到的数据是 {data: {status: 200, msg: ‘返回成功’,data: [{}]}}
  1. axios.get('http://www.liulongbin.top:3006/api/getbooks')
  2. .then(function (res) {
  3. // 这里用于获取服务端返回的结果
  4. // res.data中的data是由axios规定的名称,表示从后台得到的数据
  5. console.log(res.data)
  6. })

image.png

axios的get用法

  • get 请求数据并传递参数
    • get方法第二个参数是配置对象 axios(url, [, config])
      • params 用于传递get参数,它的值为对象,对象中用于传递键值对形式参数
      • 发送请求时,params中的参数会自动拼接到url中进行发送
      • params 是专门用于get请求
  1. // 上述传参方式不太方便
  2. axios.get('http://www.liulongbin.top:3006/api/getbooks', {
  3. // params名称是否固定?是的,是axios的规定
  4. params: {
  5. id: 1,
  6. bookname: 'nihao'
  7. }
  8. }).then(function (res) {
  9. // 这里用于获取服务端返回的结果
  10. console.log(res)
  11. })
  1. // api/get 接口专门测试get请求,请求参数是什么,就返回什么
  2. axios.get('http://www.liulongbin.top:3006/api/get', {
  3. // params名称是否固定?是的,是axios的规定
  4. params: {
  5. id: 1,
  6. bookname: 'nihao',
  7. publisher: 'abc'
  8. }
  9. }).then(function (res) {
  10. // 这里用于获取服务端返回的结果
  11. console.log(res)
  12. })

总结:

  1. get传参可以直接在url地址中拼接参数,不建议这样做
  2. 可以基于axios提供的参数params传递get请求参数

axios发送post请求

  • post请求数据传递
    • 传统的表单提交的数据格式 content-type: application/x-www.form-urlencoded
      • 后端一般默认支持这种提交的参数格式
    • post请求参数如果是对象,默认发送的是json形式的参数(content-type: application/json)
      • 这种方式的请求参数也需要后台提供支持
  1. // axios发送post请求 post(url[, data[, config]])
  2. // post 参数一:请求地址
  3. // post 参数二:表示请求参数,可选的
  4. // post 参数三:表示配置对象,可选的
  5. // 传统的表单提交的数据格式 content-type: application/x-www.form-urnencoded
  6. // 如下的请求方式,默认发送的是json形式的参数(content-type: application/json)
  7. // 这种方式的请求参数也需要后台提供支持
  8. axios.post('http://www.liulongbin.top:3006/api/post', {
  9. uname: 'lisi',
  10. pwd: '123'
  11. })
  12. .then (function (res) {
  13. console.log(res)
  14. })
  • 强制采用content-type: application/x-www.form-urnencoded 请求参数格式
  1. // axios发送post请求 post(url[, data[, config]])
  2. // post 参数一:请求地址
  3. // post 参数二:表示请求参数,可选的
  4. // post 参数三:表示配置对象,可选的
  5. // 强制post发送这种格式请求参数 content-type: application/x-www-form-urlencoded
  6. // 类似于FormData的用法,专门用于参数传递
  7. // URLSearchParams 是一个标准的构造函数,类似于FormData,属于新的API
  8. var fd = new URLSearchParams()
  9. fd.append('uname', 'lisi')
  10. fd.append('pwd', '123')
  11. // 发送请求时会转换为如下格式
  12. // uname=lisi&pwd=123
  13. // 这种格式的请求参数,服务器一般默认都支持
  14. axios.post('http://www.liulongbin.top:3006/api/post', fd)
  15. .then (function (res) {
  16. console.log(res)
  17. })

总结

  1. post请求默认发送的数据格式是 application/json
  2. post请求也可以强制发送 application/x-www.form-urlencoded 格式数据(基于URLSearchParams)
  • 前端提交给后端的数据格式(具体用那种格式由后端决定)
    • application/x-www-form-urlencoded
    • multipart/form-data
    • application/json

另一种用法

  • axios作为方法使用
    • 支持各种请求方式
    • 支持各种方式传参
  1. // axios更加通用的调用接口方式
  2. // axios({
  3. // // 表示请求方式
  4. // method: 'get',
  5. // url: 'http://www.liulongbin.top:3006/api/get',
  6. // params: {
  7. // id: 1,
  8. // uname: 'lisi'
  9. // }
  10. // }).then(function (res) {
  11. // console.log(res)
  12. // })
  13. // 发送请求参数 json格式
  14. // axios({
  15. // // 表示请求方式
  16. // method: 'post',
  17. // url: 'http://www.liulongbin.top:3006/api/post',
  18. // data: {
  19. // id: 123,
  20. // uname: 'lisi',
  21. // age: 12
  22. // }
  23. // }).then(function (res) {
  24. // console.log(res)
  25. // })
  26. // 发送请求参数 form格式
  27. // var fd = new URLSearchParams()
  28. // fd.append('uname', 'lisi')
  29. // fd.append('pwd', '123')
  30. // axios({
  31. // // 表示请求方式
  32. // method: 'post',
  33. // url: 'http://www.liulongbin.top:3006/api/post',
  34. // data: fd
  35. // }).then(function (res) {
  36. // console.log(res)
  37. // })

总结

  1. axios既可以发送get请求,也可以发送post请求
  2. post请求默认发送json格式数据,也可以基于URLSearchParams强制发送www格式数据

全局默认配置

  • 配置基准URL地址
    • 做项目时,基准一般配置一次即可,发送请求时检修url后面的路径即可
  1. axios.defaults.baseURL = 'http://www.liulongbin.top:3006/'
  2. axios.get('api/get?id=1').then(function (res) {
  3. console.log(res)
  4. })

总结

  1. 设置基准路径,可以简化发送请求时的路径
  2. 方便上线时随时调整基准路由(只有一个地方有基准路径)

总结

  • 模仿$.ajax封装原生Ajax
    • success如何获取结果
    • Ajax的基本请求流程
      • 创建实例对象
      • 准备请求参数 xhr.open
      • 执行发送动作 xhr.send
      • 监听返回的结果 xhr.onreadystatechange
    • get请求参数处理
    • post请求参数处理
    • 返回的结果需要转换为对象
  • FormData
    • 作用:post提交参数
    • 熟悉基本用法
    • 提交表单数据
      • 先new在append
      • 直接new时传入form元素
      • 两者可以结合使用
    • 利用它进行文件上传
      • 先new在append
      • 直接new时传入form元素
    • 文件上传的进度监控
      • xhr.upload.onprogress
      • xhr.upload.onload
    • jQuery方式上传文件并处理进度监控
  • axios
    • 这是一个专门发送请求的js库
    • 基本使用(获取数据时需要需要ret.data)
    • get请求传递参数,需要使用params属性
    • post请求直接通过axios.post参数二传递对象即可
      • 默认请求参数格式为json
      • 可以强制设置为www格式
    • 通用请求方法axios()
      • 支持get请求,需要params属性
      • 支持post请求,需要data属性
        • 默认是json格式
        • 可以指定为www格式
    • 设置基准路径