Axios

171 阅读6分钟

Ajxa文件:📎axios.js

url

Ajxa 获取数据

axios({
      url: `http://wthrcdn.etouch.cn/weather_mini?city=${city}`,
      method: 'get''post',
      params:{ 键值对 } 或  data: { // 对象属性简写 username,password}
    }).then(res => {
     
    })

获取的一些方法

get与post的语法

常见状态码

获取数据的3种方式

一个一个获取元素进行收集 .value

 axios({
      url:"http://hmajax.itheima.net/api/books",
      method:'POST',
      data:{
        bookname:bookname.value,
        author:author.value,
        publisher:publisher.value,
        creater:creater.value
             }
    }).then(res=>{
        console.log(res);
      })

form-serialize插件

注意点:为表单元素设置name属性 name属性的值一定要参照后台接口的参数名称

serialize(form,{hash:false});
//获取到的 键=值&键=值&键=值....
//如:bookname=a&author=aa&publisher=aaa&creater=aaaa


serialize(form,{hash:true})
//{键:值,键:值,键:值,...}
//如:{bookname: 'a', author: 'aa', publisher: 'aaa', creater: 'aaaa'}

formdata

   let formdata=new FormData(form)  //form是获取到的表单form

formdata的基本使用

formdata的遍历

如:

 // 传递formdata:现在这个接口支持formdata,以后的接口不一定支持--以后再说
// 假设现在接口不支持formdata,只支持key=value | {key:value}
let formdata = new FormData(form)
        let obj = {}
        // 使用forEach遍历数据 -- 将formdata转换为对象
        formdata.forEach(function(value, key) {
          console.log(value, key)
          obj[key] = value
        })

file文件上传

file 多文件上传属性multiple

如:

<input type="file" multiple="multiple">  //加了multiple 属性 就可以进行多文件上传了

file (重点内容:只上传文件数据)

      // 重点内容:只上传文件数据
        // 1.创建一个空的formdata对象
        let formdata = new FormData()
        // 2.向formdata中追加文件参数
        // 键:后台接口文档的参数名称
        // 文件域.files可以获取当前用户所选择的文件对象,它是一个伪数组
        // console.log(fileEle.files[0])

        // formdata.append('avatar',用户当前选择的文件对象)
        formdata.append('avatar', fileEle.files[0])

file多文件上传

file是一个伪数组 可以使用forEach和for来进行遍历

  let formdata=new FormData()
for(let i=0;i<file.files.length;i++){
  formdata.append('avatar',file.files[i])
}

本地预览

let iptFile = document.querySelector('#iptFile')//file
let thumb = document.querySelector('.thumb') //img
iptFile.addEventListener('change', function() {
        // 1.先获取用户所选择的文件对象
        let myfile = iptFile.files[0]
        // 2.基于文件对象生成一个内存路径
        // createObjectURL:将图片存储到内存并返回一个临时路径
        let myurl = URL.createObjectURL(myfile)
        // 3.为元素赋值
        thumb.src = myurl
      })

Ajax配值url全局的根路径

添加一个单独的文件进行配置: utils文件夹/request.js文件 (可能也叫base.js)

如:

注意点:在引入axios.js之后 页面资源文件js之前 引入配置文件


如:

****

//配置全局的根路径
//作用:将来发起请求的时候 路径会自动拼接到url前面

 axios.defaults.baseURL='服务器地址'

如:// axios.defaults.baseURL='http://hmajax.itheima.net'

写完后 以后都只用写文件路径了

Ajax 原生获取方式

01原生方式发起get无参请求

let xhr =new XMLHttpRequest() //生成一个异步对象  XMLHttpRequest(帮助实现前后端的交互)//XMLHttpRequest是浏览器的内置对象    

xhr.open('get','http://hmajax.itheima.net/api/books')  //同过open方法进行设置相应行    //相应行 ('请求方式','请求地址')

xhr.send()   //通过send方法发起请求


xhr.addEventListener('load',function(){   //请求发起后  服务器响应后执行

console.log(JSON.parse(xhr.response));  //接受响应  //获取的是个json字符串  要转换回来 

   })

总结:1.创建一个异步对象--能够帮助我们实现前后端交互的对象:XMLHttpRequest

XMLHttpRequest:是浏览器的内置对象

2.发起请求--生成符合要求的请求报文

2.1 生成请求行:设置请求方式和请求地址,通过open方法进行设置 -- xhr.open(请求方式,请求地址

2.2 生成请求头:get方式不用设置

2.3 生成请求体:本次请求提交给服务器的数据,get方式的参数在url中拼接,所以get方式没有请求体,只需要发起请求,通过send方法发起请求

3.接收响应:当异步对象发起请求,服务器成功响应,且数据回到客户端可以使用的时候,就会触发一个事件:load

简单说load事件触发说明请求完成了

02原生方式发起get带参请求

 let xhr=new XMLHttpRequest()  //生成一个异步对象  来进行一个前后端的交互

        //  通过open来设置请求行 xhr.open('请求方式',`请求地址?参数=值`)
        xhr.open('get',`http://hmajax.itheima.net/api/robot?spoken=${input.value}`) 


        xhr.send()   //发起请求
        

        xhr.addEventListener('load',function(){  //服务器响应加载完 响应

           // console.log(  xhr.response);    //通过response内置方法拿到数据
            console.log(JSON.parse(xhr.response));    //因为拿到的是个JSON字符串 所以要经行转换

        })

03原生方式发起post请求-参数是key=value (字符串)

  let xhr=new XMLHttpRequest()   //创建一个异步对象经行前后端的交互

  xhr.open('post','http://hmajax.itheima.net/api/books') //通过open设置请求行 ('请求方式','请求地址')

                                               //键=值 的格式
  xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded') //通过setRequestHeader设置 请求头
('通过Content-Type设置格式','值')
    
        let data=serialize(addForm,{hash:false})  //通过插件获取值   hash=false:键=值
        xhr.send(data)            //post通过请求体传递值   

        xhr.addEventListener('load',function(){

            
            console.log(JSON.parse(xhr.response));  
        })

04原生方式发起post请求-参数是对象

  let xhr=new XMLHttpRequest()   //创建一个异步对象来经行一个前后端的交互

        
  xhr.open('post','http://hmajax.itheima.net/api/books')//通过open设置请求行:('请求方式','地址')

  
  xhr.setRequestHeader('Content-Type','application/json')//通过setRequestHeader这只请求头  ('通过Content-Type设置格式',
'设置对象的格式')

 
  let data=serialize(addForm,{hash:true}) //通过插件获取值  hash:拿到的值是对象

 
  xhr.send(JSON.stringify(data)) //通过send设置请求体   因为要传入的是个字符串 用JONS进行准换

  xhr.addEventListener('load',function(){

      console.log(JSON.parse(xhr.response)); 
        })

05原生方式发起post请求-参数是formdata

   // 创建异步对象 来进行前后端交互
         let xhr=new XMLHttpRequest()

        //  通过open来设置请求行
        xhr.open('post','http://hmajax.itheima.net/api/books')
        
        // 通过内置属性formdata来获取值
       //因为formdata会自动设置编码格式 Content-type:muitipart/form-data
       //    所以请求头可以省略不写
        let formdata=new FormData(addForm)
        
        // 通过send属性来设置请求体
         xhr.send(formdata)
          
         xhr.addEventListener('load',function(){
           
            console.log(xhr.response);
         })

原生方式发起post请求 不同参数类型 请求头的设置

1.参数是key=value&key=value格式:设置格式Content-Type为:application/x-www-form-urlencoded

2.参数是对象格式:设置格式Content-Type为:application/json,同时传递参数的时候将参数转换为json字符串

3.参数formdata:不用设置请求头 因为formdata会自动设置编码格式 Content-type为:muitipart/form-data

Promised的使用

Promised .then 与.catch 的使用

  	 // Promise 是个内置属性

      let a1=new Promise(function(resolve,reject ){ //创建 Promise(回调函数 (回参1,回参2){})
        let index=parseInt(Math.random()*11)       //生成随机数
        if(index>=5){                           //判断是否大于等于5
            resolve('操作成功了--'+index)      //大于等于时  调用回参1  resolve(参数)
        }else{                                //否则
            reject('操作失败了--'+index)      //调用回参2 reject(参数)
        }
      })


      a1.then(function(res){         //.then的时候 能拿到Promise的回参1  并且可以拿到回参1的参数
        console.log(res);
    }).catch(function(res2){        //.catch的时候 能拿到Promise的回参2  并且可以拿到回参2的参数
        console.log(res2);
    })
                            //    Promise的回参1成功的时候调用  回参2失败的时候调用  不过一般不用写回参2  只调用成功的

总结:.then()是拿到Promised的回调函数中的参数1 也可以拿到他传递的参数 成功的时候拿到

.catch()是拿到Promised的回调函数中的参数2 也可以拿到他传递的参数 失败的时候拿到

Promised.all的使用

注意: Promised.all 的括号里 要传入数组 Promised.all(数组) 执行数组里的所有的才执行

       function createPro(num){               //封装函数 
        return  new Promise((resolve,reject)=>{   //返回Promise 的值
            setTimeout(()=>{                //加一个定时器
                resolve(num)                //.then的时候拿到该函数的形参
            },num*1000)                   //形参*秒数
        })
     }

let p1=createPro(1)      
let p2=createPro(2)
let p3=createPro(3)
let p4=createPro(4)

Promise.all([p1,p2,p3,p4]).then(res=>{  //Promise.all括号里的传入的所有的执行完才执行.then
    console.log(res);      //[1, 2, 3, 4]       //打印输出数组里所有.then的参数
})

总结:Promise.all:执行所有传入的promise对象,全部执行完毕之后再统一返回结果(将所有promise的执行结果综合在一起) -- 结果是一个数组

all:返回的也是一个promise

Promised.race的使用

注意: Promised.race 的括号里 要传入数组 Promised.race(数组) 谁第一个执行完就立刻结束 不执行其他的

 function createPro(num){               //封装函数 
        return  new Promise((resolve,reject)=>{   //返回Promise 的值
            setTimeout(()=>{                //加一个定时器
                resolve(num)                //.then的时候拿到该函数的形参
            },num*1000)                   //形参*秒数
        })
     }

let p1=createPro(1)      
let p2=createPro(2)
let p3=createPro(3)
let p4=createPro(4)

// Promise.race:执行传入的对象,谁第一个执行完毕就立刻结束
Promise.race([p1, p2, p3, p4]).then(res => { //Promise.race括号里的传入的谁第一个执行完就执行.then
  console.log(res)     //1
})

async函数与await函数 (简化Promise.then方法)

注意:async 标记的函数才能够使用 await

概念:async指异步,说明这个函数会执行异步操作;简化Promise调用时then方法

await可以以同步方式调用异步代码

补充: 1、同步方法:往往有返回值,可以直接接收返回值

2、异步方法:没有返回值,需要传入回调函数,以回调函数的参数接收返回值

function createPro(num){               //封装函数 
        return  new Promise((resolve,reject)=>{   //返回Promise 的值
            setTimeout(()=>{                //加一个定时器
                resolve(num)                //.then的时候拿到该函数的形参
            },num*1000)                   //形参*秒数
        })
     }

//现在的做法:用 await 获取数据

async function fn(){            // 把await所在的函数 标记为 async   才能使用await 

console.log( await createPro(3) );  //await可以拿到.then的回调函数的参数  并且 执行完了这一行 才继续往下执行  
 console.log(await createPro(1));   //await可以拿到.then的回调函数的 参数 并且 执行完了这一行 才继续往下执行
      
}

fn() //  结果为   3  1

// 以前的做法:用.then 获取数据-----------------

function fn1(){

 createPro(3).then(res=>{   
  console.log(res); 
 })

 createPro(1).then(res2=>{
  console.log(res2);
 })

}

fn1() //结果为: 1  3

总结:async 标记的函数才能够使用 await 而且等await所有执行完才往下执行

try...catch语法 (代替Promise.catch方法)

以前出现错误用Promise.catch来抛出错误

现在直接 写再 catch()的大括号里

补充:1、异步操作的错误,一般通过回调函数处理

2、同步操作的错误,一般通过try…catch处理

语法:

try {
    //在此运行代码
}
catch(err){
    //在此处理错误
}

运行流程:
try{...}包含块中的代码有错误,则运行catch(err){...}内的代码,
否则不运行catch(err){...}内的代码。

小案例:

// 创建一个promise -- 封装
      function createPro(num) {
        return new Promise((resolve, reject) => {
          // let num = parseInt(Math.random() * 10)
          if (num >= 5) {
            resolve('本次生成的随机数是:' + num)
          } else {
            // new Error('本次操作错误了')
            reject('错误了')
          }
        })
      }

      // 将函数标记为async函数:async指异步,说明这个函数中会执行异步操作
      // 异常处理结构:try {可能会出错的代码} catch(err){}
      async function doSomthing() {
        try {
          let res = await createPro(6)   //因为传的6>=5 
          console.log(res)              //所以是 调用成功的resolve  并不再往下走
        } catch (err) {
          console.log(err)    //如果上面传递的参数小于5 则执行reject
        }
      }
      // 小总结:
      // 1。异步操作的错误,一般是通过回调函数进行处理
      // 2。同步操作的错误,一般是能过try..catch处理

      doSomthing()

Axios 请求头的设置

headers 是即将被发送的自定义请求头

语法:headers:{键:值}

Axios 全局的 请求头的设置

语法:axios.defaults.headers.ommon['键名']=值

axios.defaults.headers.common['键名']=值

token以请求头经行传递

补充说明:如果要以token以请求头的方式经行传递,且传递的时候键只能叫:Authorization