axios

特点:

1 从浏览器创建XMLHttpRequests

2 从node.js创建http请求

3 支持Promise API

4 拦截请求和响应

5 转换请求和响应的数据

6 取消请求

7 自动转换JSON数据

8 客户端支持预防XSRF

 Axios是一个基于promise的HTTP库,可以用于浏览器和node.js

 

vue-cli3,生成的项目,public就是根目录,实际上访问的就是public下的index.htm,所在在

public下的文件需要访问,直接/文件名 就可以了

axios请求的方法常见有5种

:get post put delete patch

get:获取数据

post:提交数据  表单提交,文件上传

put:更新数据(所有数据推送到后端)

patch:更新数据(只将修改的数据推送到后端)

delete:删除数据

post 有content-type     

form-data  表单提交 文件上传 图片上传

需要使用FormData 将数据转化程度能够formData格式

let formData=new FormData();

for(let key in data){formData.append(key,data[key])}

applicition/json

 

并发请求:同时进行多个请求,并统一处理他们的返回值

axios.all() axios.spread()

axios.all() 参数是数组,请求方法,所有请求都成功之后执行回调函数axios.spread()

demo:

axios.all([axios.get(url1),axios.get(url2),axios.get(url3)]).then(

axios.spread((data1,data2,data3)=>{//执行回调函数spread,有一个请求就有几个返回值

})

);

axios实例   axios.create()

用处:多个后台接口域名  超时时长不一样

axios参数配置

baseURL:请求的域名,基本地址

timeout:设置请求的超时时长,单位是毫秒(ms)

url:请求的路径

method:请求的方法

headers:{}设置请求头 ,比如token

params:{},//请求参数拼在url上

data:{}请求参数放在请求体中

1 axios全局配置  用的比较少

2 axios实例配置   实际开发中,都会声明一个实例,在实例中进行配置

3 axios请求配置

1 全局配置

axios.defaults.timeout=1000;

axios.defaults.baseURL="xxxxxxxx";

2 实例配置

let instance=axiso.create();

instance.defaults.timeout=3000;

3 请求配置

instance.get(url,{timeout:5000}).then().catch()

优先级:1 2 3 由低到高

拦截器

在请求或响应被处理前拦截它们

请求拦截器 响应拦截器

axios.interceptors.request.use(config=>{//爱发送请求前做些什么return config},err=>{return Promise.reject(err)})

axios.interceptors.response.use(res=>{//请求成功对响应数据做处理return res;},err=>{//响应错误做些什么 return Promise.reject(err)})

请求错误:请求没有发送到后台出现的错误

响应错误:发送到后台,出现的错误

取消拦截器(了解)

let interceptors=axios.inerceptors.request.use(config=>{},err=>{})

axios.interceptors.request.eject()

 

错误处理:请求错误和响应错误都会进入catch

404 请求没有找到 401 请求超时

响应错误以5开头的

500 系统错误 502 系统重启

在实际开发中,一般添加统一错误处理

就是使用请求和响应拦截器

取消请求:

用于取消正在进行的http请求(了解)

需要在发送的请求中带上取消请求的token参数

demo:

let source=axios.CancelToken.source();

axios.get().then(res=>{

console.log(res)

}).catch(err=>{//请求取消之后进入catch

})

//取消请求(message会被cancel捕获)

source.cancel('cancel http')

//什么情况下可能用到取消请求

在请求数据时间比较长,需要取消请求的地方会用到

 

axios封装:

demo:

第一步:将所有的请求放在一个文件中

1.1 新建service文件键,新建url.js

const urlList={
    getList:{
        url:'/getList',
        method:'get'
    },
    saveList:{
        url:'',
        method:'post'
    },
    updataList:{
        url:'',
        method:'post'
    },
};
export default urlList;

1.2 新建http.js ,新建axios实例,时间request和response的过滤,通过for循环实现不同的请求方法

import urlList from './url.js'
import axios from 'axios'
let instance=axios.create({
    baseURL:'http://localhost:8081',
    timeout:1000
});
instance.interceptors.request.use(config=>{
    return config;
},err=>{
    console.log(err);
})
instance.interceptors.response.use(res=>{
    return res;
},err=>{
    console.log(err);
})
const Http={};//包装请求方法的容器
// 循环遍历输出不同的请求方法
for(let i in urlList){
    // 使用async await的原因,避免进入回调地狱,
    //使用回调的弊端:一个请求的参数依赖于另一个请求的返回值,就需要在回调函数中执行另一个请求,如果这样的依赖比较多就会陷入回调地狱,使用async await 可以直接按正常代码进行书写,看着更规范易懂
    Http[i]=async function(params,isFormata=false,config={}){
        let api=urlList[i];
        let res=null;
        let newParams=params;
        if(api.method=="post"||api.method=='put'||api.method=='patch'){
            try{
                res=await instance[api.method](api.url,newParams,config);
            }catch(err){
                res=err;
            }
           
        }else{
            config.params=newParams;
            try{
                res=await instance[api.method](api.url,config);
            }catch(err){
                res=err;
            }
        }
        return res;
        
    }
}
export default Http;

第二步:在main,js中注册http为vue的全局变量

import Http from './service/http'
Vue.prototype.$http=Http;

第三步:使用(要与封装的方法一直,使用async 和await)

async getList(){
        let res=await this.$http.getList();
  }

 

posted on 2019-07-31 14:27  半夏微澜ぺ  阅读(296)  评论(0)    收藏  举报