18

1、安装axios

npm安装:npm install axios --save
yarn安装:yarn add axios
Vue安装:vue add axios

2、发送请求

有三种发送请求的方式:axios.get()、axios.post()、axios.all()

    axios.get('/user?ID=12345')    //get请求
        .then(function(res){
            console.log(res.data);    //返回获取的数据
            console.log(res.status);    //返回状态码:200、404
            console.log(res.statusText);    //返回状态文本:OK
            console.log(res.headers);    //返回响应头信息
            console.log(res.config);    //返回请求的配置信息
        }).catch(function(err){
            console.log(err)
        })
      
      
    axios.post('/user',{    //post请求
        name:'cai',
        pwd:'111'
    })
    .then(function(response){
        //请求成功
    })
    .then(function(err){
        //请求失败
    })
    
    
    function getUser(){
        return axios.get('/user/1234');
    }
    function getInfo(){
        return axios.get('/user/1234/info')
    }
    axios.all([getUser(),getInfo()])        //并发请求
    .then(axios.spread(function(user,info){
        //当这两个请求都完成的时候会触发这个函数,两个参数分别代表返回的结果
    }))
    并发的API为:
    axios.all(iterable);
    axios.spread(callback);
    
    请求方式的别名:
    axios.request(config);
    axios.get(url[,config]);
    axios.delete(url[,config]);
    axios.head(url[,config]);
    axios.post(url[,data[,config]]);
    axios.put(url[,data[,config]]);
    axios.patch(url[,data[,config]])

3、axios全局默认配置

axios.defaults.baseURL='http://api.exmple.com';
axios.defaults.headers.common['Authorization'] = AUTH_TOKEN;
axios.defaults.headers.post['content-Type'] = 'appliction/x-www-form-urlencoded';
axios.defaults.withCredentials = true;   // axios 默认不发送cookie,需要全局设置true发送cookie
axios.defaults.baseURL = $core.use('http'); //确认协议和地址

4、自定义axios的配置

var instance=axios.create({
    url:'/user',    //如果不是绝对地址,baseURL会自动加到url前面
    methods:'post',    //默认为 get 
    baseURL:'https://www.xxx.com/api/',
    params:{   
        id:123    //参数
    },
    data:{
        name:'cai',    //需要被发送的数据仅适用于:put、post、patch
        age:18    //当没有设置`transformRequest`选项时dada必须是以下几种类型之一
        //string/plain/object/ArrayBuffer/ArrayBufferView/URLSearchParams
        //仅仅浏览器:FormData/File/Bold
        //仅node:Stream
    }
    paramsSerializer: function(params){    //序列化参数 (可选)
        return Qs.stringify(params,{arrayFormat:'brackets'})
    },
    transformRequest:[function(data){    //请求发送到服务器之前,可在这对发送的数据做些改动,仅限于put、post、patch方法
        return data;    //数组里面的最后一个函数必须返回一个字符串、-一个`ArrayBuffer`或者`Stream`
    }],
    transformResponse:[function(data){    //在数据传送到`then/catch`方法之前对得到的数据进行改动
        return data;
    }],
    timeout:1000,    //请求超时最长1000毫秒
    headers: {'X-Requested-With':'XMLHttpRequest'},
    withCredentials:true,    //是否跨域请求,默认为false(跨域需要用到证书)
    adapter:function(){
        //返回一个promise,并提供验证返回
        //可自定义处理请求,用于测试
    },
    auth:{    //开启http用户认证,重新设置Authorization头信息
        username:'cai',
        password:'123456'
    },
    responseType:'json',    //可选项是arraybuffer,blob,document,json,text,stream
    xsrfCookieName: 'XSRF-TOKEN',//用作 xsrf token 值的 cookie 名称
    xsrfHeaderName:'X-XSRF-TOKEN',//带有 xsrf token 值 http head 名称
    onUploadProgress:function(progressEvent){
        //上传进度事件,允许在上传过程中的做一些操作
    },
    onDownloadProgress:function(progressEvent){
        //下载进度事件,允许在下载过程中的做一些操作
    },
    maxContentLength:2000,    //相应内容最大值
    validateStatus:function(status){    //定义了是否根据http相应状态码,来resolve或者reject promise
        return status >= 200 && status <300;//default
    },
    maxRedirects: 5,    //在nodejs中重定向的最大数量
    httpAgent: new http.Agent({keeyAlive:true}),    //定义了当发送http请求要用到的自定义代理(默认:false)
    httpsAgent: new https.Agent({keeyAlive:true}),    //定义了当发送https请求要用到的自定义代理(默认:false)
    proxy: {
        host:'127.0.0.1',    //proxy定义了主机名字和端口号
        port: 9000,
        auth: {
            username:'Cai',
            password:'123456'
        }
    },
    cancelToken: new cancelToken(function(cancel){
        //cancelToken定义了一个用于取消请求的cancel token
    })
})

//当实例创建时候修改配置
instance.defaults.headers.common["Authorization"] = AUTH_TOKEN;

//使用自定义的axios实例
instance.get('/longRequest',{    //这里的配置优先级高于上面的
  timeout: 5000    //5秒后请求
});

5、拦截器

//你可以在请求、响应在到达then/catch之前拦截他们
//添加一个请求拦截器
axios.interceptors.request.use(function(config){
    //在请求发出之前进行一些操作,比如:显示loading图标
    return config;
},function(err){
    //Do something with request error
    return Promise.reject(error);
});
//添加一个响应拦截器
axios.interceptors.response.use(function(res){
    //在这里对返回的数据进行处理,比如隐藏loading图标
    return res;
},function(err){
    //Do something with response error
    return Promise.reject(error);
})

//取消拦截器
var myInterceptor = axios.interceptor.request.use(function(){/*....*/});
axios.interceptors.request.eject(myInterceptor);

//给自定义的 axios 实例添加拦截器
var instance = axios.create();
instance.interceptors.request.use(function(){})

6、错误处理

axios.get('/user/12345')
    .catch(function(error){
        if(error.response){
          //请求已经发出,但是服务器响应返回的状态吗不在2xx的范围内
          console.log(error.response.data);
          console.log(error.response.status);
          console.log(error.response.header);
        }else {
          //一些错误是在设置请求的时候触发
          console.log('Error',error.message);
        }
        console.log(error.config);
    });
  

7、取消请求

var CancelToken = axios.CancelToken;    //通过一个cancel token来取消一个请求
var source = CancelToken.source();    //通过CancelToken.source工厂函数来创建一个cancel token

axios.get('/user/12345',{
    cancelToken: source.token
}).catch(function(thrown){
    if(axios.isCancel(thrown)){
        console.log('取消请求',thrown.message);
    }else {
        //handle error
    }
});
//取消请求(信息的参数可以设置的)
source.cance("操作被用户取消");


//换种写法
var cancelToken = axios.CancelToken;
var cance;
axios.get('/user/12345',{
    cancelToken: new CancelToken(function(c){
        //这个executor函数接受一个cancel function作为参数
        cancel = c;
    })
})
//取消请求
cancel();

8、get/delete 请求,也称作 query 请求

axios.get('/user', {  //params参数必写 , 如果没有参数传{}也可以
    params: {  
       id: 12345,
       name: user
    }
})
.then(function (res) {
    console.log(res);
})
.catch(function (err) {
    console.log(err);
});

9、post/put/patch 请求(三种传参方式)

1、传参格式为 formData 
    var formData=new new FormData();
    formData.append('user','cai');
    formData.append('pwd',123456);
    axios.post('notice',formData)
        .then((res)=>{return res})
        .catch((err)=>{return err})
        
2、传参格式为 query 形式
    第一种情况:使用 $qs.stringify
        import Qs from 'qs'   //引入方式
        Vue.prototype.$qs = Qs  //全局加载
        this.$qs.stringify(data);  //使用方式
        this.$qs.parse(data);  //使用方式
        var readyData=this.$qs.stringify({
            id:1234,
            name:user
        });
        axios.post("/notice",readyData)
             .then((res) => {return res})
             .catch((err) => {return err})
    第二种情况:使用 URLSearchParams(浏览器不支持,需要polyfill)
        var params = new URLSearchParams();
        params.append('param1', 'value1');
        params.append('param2', 'value2');
        axios.post('/foo', params);
        
3、 传参格式为 raw (JSON 格式) 
     第一种情况: axios 将 JavaScript 对象序列化为 JSON
        var readyData={
            id:1234,
            name:user
        };
        axios.post("/notice",readyData)
             .then((res) => {return res})
             .catch((err) => {return err})
     第二种情况:
         var readyData=JSON.stringify({
              id:1234,
              name:user
         });
         axios.post("/notice",readyData)
              .then((res) => {return res})
              .catch((err) => {return err})

蔡万胜
625 声望40 粉丝

« 上一篇
Vue.js动画笔记
下一篇 »
Koa.js学习笔记

引用和评论

0 条评论