ajax访问后台数据

250 阅读5分钟

ajax访问数据失败--排查方法

1. 打开network面板,点击错误的内容
2. 查看 Headers (标头)当前请求是否成功的发起,如果请求链接是红色,一定是请求的地址出错
3. 查看 Headers (标头)请求的url是否正确,method是否正确
4. 查看 Paylod  (载荷)是否按文档接口的要求传递了参数,同时参数的值或长度是否合理
5. 查看 Preview (预览)里面有没有提示 缺失一些必填的属性值、值是否合理
6. 查看 Response(响应)后台接口的返回数据

form 表单

表单由按个部分组成

常见的表单域:input 、textarea 、select等

1. type = 'submit' 表示提交按钮
2. 由于type属性的默认值是 submit 因此 type = 'submit' 可以省略不写

1650042246178

表单提交的问题:表单的默认提交行为会导致页面跳转

解决方案:

  • 《form》 表单负责采集数据
  • Ajax 负责将数据提交到服务器

axios所支持的参数格式有:

对象: {key = value,key = value} axiox内部会就行转换为 key=value&key=value

字符串: key=value&key=value&key=value.......

formdata: new Formdata

获取表单元素的方法

1.一个一个的获取

缺点:太过繁琐,获取多个不建议采用这种方式

 <script>
    // 属性选择器:querySelector('元素?[属性=值]')
    let bookname = document.querySelector('[name=bookname]')
    let author = document.querySelector('[name=author]')
    let publisher = document.querySelector('[name=publisher]')
    let btnadd = document.querySelector('.btnadd')
    btnadd.addEventListener('click', function (e) {
      // 按钮里的type='submit'有默认提交,所以阻止默认行为
      e.preventDefault()
​
      // 收集数据
      let data = {
        bookname: bookname.value,
        author: author.value,
        publisher: publisher.value
      }
​
       //实现文件上传
      axios({
        url: 'http://www.itcbc.com:3006/api/addbook',
        method: 'POST',
        data: data
      }).then(res => {
        alert(res.data.message)
      })
    })
​
  </script>

2.serialize 的说明

缺点:无法获取文件域的数据

语法:$('表单form的选择器').serialize() 
    //获取到的数据格式是: key=value&key=value&key=value.......--本质是字符串
$('#addForm').serialize():可以一次性的获取到  当前id为addForm的  form中所有拥有name属性的表单元素的value值
​
   // 1.表单元素一定要有name属性,因为name‘属性的值’就是‘参数的键’,没有键不可能生成键值对
   // 2.name属性的值不能随意设置,一定要参照后台接口文档的参数名称

文件上传的两种方式

第一种方式:一次性提交所有数据

  • 缺点:如果文件数据的内存比较大的时候,可能会造成提交响应的延迟,不利于用户体验

第二种方式:用户选择完文件后,就立刻进行文件上传

  • 优点:上传完,后台会生成文件的路径名(地址),特点:内存极小,路径名再和其他数据统一提交到后台。

3.FormData----以后就使用这种方法获取表单元素了

特点:将所有数据一起进行传递:包含表单的所有元素的数据

 注意,传递数据给后台建议将formdata二进制格式 转换为对象格式
 
语法:let formdata = new FormDate(表单元素对象)
    FormData:也可以获取指定表单中拥有name属性的表单元素的value值,生成一个formdata对象
    例如:let form = document.querSelector('#addForm')  -->表单元素对象
         let formdata = new FormDate(form)  -->二进制对象,不支持在控制台直接输出
         
    我们axios 虽然可以将formdata传递给后台,但是,不是每个后台接口都会接受formdata数据,但是接口几乎都支持对象格式的参数传递,所以往往我们需要将formdata转换为 对象 再进行参数传递
      let obj = {}
      formdata.forEach(function (value, key) {
        // console.log(value, key);
        obj[key] = value
      })
      
     //实现文件上传
      axios({
        url: '/api/addbook',
        method: 'post',
        data: obj
      }).then(res => {
        console.log(res);
      })
​

FormData 和 serialize 的区别

共同点:
  • 都需要设置表单各项的name属性
  • 都能快速收集表单数据
  • 都能够获取到隐藏()的值
  • 都不能获取禁用状态(disabled)的值
不同点:
  • FormData 属于原生(axios)的代码;serialiaze 是 jQuery封装的 方法
  • FormData 可以收集文件域 ()的值,而serialize不能,如果有文件上传,必须使用FormData
  • 得到的结果的数据类型不一样,FormData是二进制对象(object),而serialize是字符串(string)

文件上传

特点:将所有数据一起进行传递:包含表单的所有元素的数据

 注意,上传文件数据不需要将formdata二进制格式 转换为对象格式
 
 let iptFile = document.querySelector('#iptFile')
    // 用户选择文件之后所触发的事件:change
    iptFile.addEventListener('change', function () {
      let form = document.querySelector('form')
      let formdata = new FormData(form)
      // console.log(formdata.get('avatar'));
​
      axios({
        url: '/api/formdata',
        method: 'POST',
        // formdata可以直接作为参数传递
        data: formdata
      }).then(res => {
        console.log(res);
      })
    })

单独上传文件数据

特点:只希望传递文件数据

 let iptFile = document.querySelector('#iptFile')
    let form = document.querySelector('form')
    iptFile.addEventListener('change', function () {
      // let formdata = new FormData(form)
      // formdata.forEach(function (value, key) {
      //   console.log(value, key);
      // })
      // 我们值希望传递文件数据:如何获取用户当前选择的文件数据呢?
      // 1.files:获取当前用户所选择的文件列表,是个伪数组,里面存放着一个一个的文件对象,如果input里面有multiple属性,就可以选择多个文件上传了,默认只能选择上传一个
      let myfile = iptFile.files[0]
      // 2.只有faomdata才能收集文件数据
      let formdata = new FormData()
      // 3.将文件数据追加到formdata
      formdata.append('avatar', myfile)
      axios({
        url: 'http://www.itcbc.com:3006/api/formdata',
        method: 'POST',
        // formdata可以直接作为参数传递
        data: formdata
      }).then(res => {
        console.log(res);
      })
    })

本地预览上传的图片---createObjectURL()

  获取用户当前选择的文件对象
  let myfile = iptFile.files[0]
      // console.log(myfile);
      // createObjectURL():可以将你传入的文件对象数据存储到内存,并返回内存中的存储地址(路径)
      let myurl = URL.createObjectURL(myfile)
      thumb.src = myurl

FormData 的API方法

  • append('key','value')----向对象中追加数据
  • set('key','value')----修改对象中的数据
  • delete('key')----从对象中删除数据
  • get('key')----获取指定key的一项数据
  • getAll('key')----获取指定key的全部数据
  • forEach()----遍历对象中的数据