05使用axios/vueresource发送HTTP请求

1.1 axios 简介与安装
1、axios简介
1. vue本身不支持发送AJAX请求,需要使用vue-resource、axios等插件实现
2. axios是一个基于Promise的HTTP请求客户端,用来发送请求,也是vue2.0官方推荐的,同时不再对vue-resource进行更新和维护
3. 参考:GitHub上搜索axios,查看API文档:https://github.com/axios/axios
2、安装axios
1. npm install axios -S # 也可直接下载axios.min.js文件
2. 下载后即到 C:\Users\tom\node_modules\axios\dist 路径下找到 axios.min.js 文件
1.2 axios 基本用法
1、 axios最基本使用
<!DOCTYPE html><html lang="en">
<head>
<meta charset="UTF-8">
<title>发送AJAX请求</title>
</head>
<body>
<div id="itany">
<button @click="sendGet">GET方式发送AJAX请求</button>
</div>
<script src="js/vue.js"></script>
<script src="js/axios.min.js"></script>
<script src="js/qs.js"></script>
<script>
  window.onload=function(){
new Vue({
      el:'#itany',
      data:{
        uid:''
      },
      methods:{
        sendGet(){
// 1、发送get请求
          axios({
            url: 'http://127.0.0.1:8000/data/',                 //1、请求地址
            method: 'get',                                        //2、请求方法
            params: {ids: [1,2,3],type: 'admin'},                //3、get请求参数
          })
// 2、回调函数
          .then(resp => {
            console.log(resp.data);
          })
// 3、捕获异常
          .catch(err => {
            console.log('请求失败:'+err.status+','+err.statusText);
          });
        }
      }
    });
  }
</script>
</body>
</html>
get: axios最基本get请求参数
<!DOCTYPE html><html lang="en">
<head>
<meta charset="UTF-8">
<title>发送AJAX请求</title>
</head>
<body>
<div id="itany">
<button @click="sendPost">POST方式发送AJAX请求</button>
</div>
<script src="js/vue.js"></script>
<script src="js/axios.min.js"></script>
<script src="js/qs.js"></script>
<script>
  window.onload=function(){
new Vue({
      el:'#itany',
      data:{
        uid:''
      },
      methods:{
        sendPost(){
// 1、发送post请求
          axios({
            url: 'http://127.0.0.1:8000/data/',             //1、请求地址
            method: 'post',                                  // 2、请求方法
            data: {ids: [1,2,3],type: 'admin'},              //3、提交数据
            transformRequest:[                               //4、在发送请求前可以改变要传的数据
function(data){
                let params='';
for(let index in data){
                  params+=index+'='+data[index]+'&';         //5、拼接成:name=alice&age=20& 的字符串
                }
return params;
              }
            ]
        })
// 2、回调函数
        .then(resp => {
          console.log(resp.data);
        })
// 3、捕获异常
        .catch(err => {
          console.log('请求失败:'+err.status+','+err.statusText);
        });
        }
      }
    });
  }
</script>
</body>
</html>
post: axios发送最基本post请求参数
2、axios借助Qs对提交数据进行序列化
axios参考博客:https://www.jianshu.com/p/68d81da4e1ad
https://www.cnblogs.com/yiyi17/p/9409249.html
<!DOCTYPE html><html lang="en">
<head>
<meta charset="UTF-8">
<title>发送AJAX请求</title>
</head>
<body>
<div id="itany">
<button @click="sendGet">GET方式发送AJAX请求</button>
</div>
<script src="js/vue.js"></script>
<script src="js/axios.min.js"></script>
<script src="js/qs.js"></script>
<script>
  window.onload=function(){
new Vue({
      el:'#itany',
      data:{
        uid:''
      },
      methods:{
        sendGet(){
// 1、发送get请求
          axios({
            url: 'http://127.0.0.1:8000/data/',                 //1、请求地址
            method: 'get',                                        //2、请求方法
            params: {ids: [1,2,3],type: 'admin'},                //3、get请求参数
            paramsSerializer: params => {                          //4、可选函数、序列化`params`
return Qs.stringify(params, { indices: false })
            },
            responseType: 'json',                                //5、返回默认格式json
            headers: {'authorization': 'xxxtokenidxxxxx'},     //6、认证token
          })
// 2、回调函数
          .then(resp => {
            console.log(resp.data);
          })
// 3、捕获异常
          .catch(err => {
            console.log('请求失败:'+err.status+','+err.statusText);
          });
        }
      }
    });
  }
</script>
</body>
</html>
get:axios发送get请求
<!DOCTYPE html><html lang="en">
<head>
<meta charset="UTF-8">
<title>发送AJAX请求</title>
</head>
<body>
<div id="itany">
<button @click="sendPost">POST方式发送AJAX请求</button>
</div>
<script src="js/vue.js"></script>
<script src="js/axios.min.js"></script>
<script src="js/qs.js"></script>
<script>
  window.onload=function(){
new Vue({
      el:'#itany',
      data:{
        uid:''
      },
      methods:{
        sendPost(){
// 1、发送post请求
          axios({
            url: 'http://127.0.0.1:8000/data/',             //1、请求地址
            method: 'post',                                  // 2、请求方法
            data: Qs.stringify(                               //3、可选函数、序列化`data`
              {ids: [1,2,3],type: 'admin'},                  //4、提交数据
              { indices: false }                             // indices: false
            ),
            responseType: 'json',                           //5、返回默认格式json
            headers: {'authorization': 'xxxtokenidxxxxx'},//6、身份验证token
        })
// 2、回调函数
        .then(resp => {
          console.log(resp.data);
        })
// 3、捕获异常
        .catch(err => {
          console.log('请求失败:'+err.status+','+err.statusText);
        });
        }
      }
    });
  }
</script>
</body>
</html>
post:axios发送post请求
def data(request):if request.method == 'GET':        token_id 
= request.META.get('HTTP_AUTHORIZATION')  # header中的tokenidprint(request.GET.getlist('ids'))                   # 获取get请求中列表
        data = {
'id':1,
'name': 'zhangsan'
        }
return HttpResponse(json.dumps(data))
elif request.method == 'POST':
        token_id = request.META.get('HTTP_AUTHORIZATION')  # header中的tokenid
print(request.POST.getlist('ids'))                  # 获取post请求中的列表
        data = {
'id':1,
'name': 'zhangsan',
'method': 'POST'
        }
return HttpResponse(json.dumps(data))
views.py后端测试接口
#1、qs用途:  在 axios中,利用QS包装data数据#
2、安 装:   npm install qs -S#3、常见用法:
'''
import Qs from 'qs';
Qs.stringify(data);
Qs.parse(data)
'''3、vuejs借助axios发送ajax请求(同级目录下创建以下两个文件)
{"id":1001,"name":"秋香","age":18}
user.json
<!DOCTYPE html><html lang="en">
<head>
<meta charset="UTF-8">
<title>发送AJAX请求</title>
</head>
<body>
<div id="itany">
<button @click="send">发送AJAX请求</button>
</div>
<script src="js/vue.js"></script>
<script src="js/axios.min.js"></script>
<script>
        window.onload=function(){
new Vue({
                el:'#itany',
                data:{
                    user:{
// name:'alice',
// age:19
                    },
                    uid:''
                },
                methods:{
                    send(){
                        axios({
                            method:'get',
                            url:'user.json'
                        }).then(function(resp){        // 请求成功调用此函数
                            console.log(resp.data);    // {id: 1001, name: "秋香", age: 18}
                        }).catch(resp => {              // 请求失败调用此函数
                            console.log('请求失败:'+resp.status+','+resp.statusText);
                        })
                    }
                }
            });
        }
</script>
</body>
</html>
index.html
<!DOCTYPE html><html lang="en">
<head>
<meta charset="UTF-8">
<title>发送AJAX请求</title>
</head>
<body>
<div id="itany">
        GitHub ID: <input type="text" v-model="uid">
<button @click="getUserById(uid)">获取指定GitHub账户信息并显示</button>
<br>
        姓名:{{user.name}} <br>
        头像:<img :src="user.avatar_url" alt="">
<hr>
</div>
<script src="js/vue.js"></script>
<script src="js/axios.min.js"></script>
<script>
        window.onload=function(){
new Vue({
                el:'#itany',
                data:{
                    user:{
                        name:'alice',
                        age:19
                    },
                    uid:''
                },
                methods:{
                    getUserById(uid){
                        axios.get(`https://api.github.com/users/${uid}`)
                        .then(resp => {
// console.log(resp.data);
this.user=resp.data;
                        });
                    },
                }
            });
        }
</script>
</body>
</html>
例2:发送get请求,输入GitHub用户id获取用户名和头像
4、vuejs借助axios发送get请求
<?php//获取参数$name=$_POST['name'];
$age=$_POST['age'];
//响应数据
echo '姓名:',$name,',年龄:',$age;
?>
server.php
<!DOCTYPE html><html lang="en">
<head>
<meta charset="UTF-8">
<title>发送AJAX请求</title>
</head>
<body>
<div id="itany">
<button @click="sendGet">GET方式发送AJAX请求</button>
</div>
<script src="js/vue.js"></script>
<script src="js/axios.min.js"></script>
<script>
        window.onload=function(){
new Vue({
                el:'#itany',
                data:{
                    user:{
// name:'alice',
// age:19
                    },
                    uid:''
                },
                methods:{
                    sendGet(){                        // axios.get('server.php?name=tom&age=23')
                        axios.get('server.php',{
                            params:{
                                name:'alice',
                                age:19
                            }
                        })
                        .then(resp => {
                            console.log(resp.data);
                        }).catch(err => {
                            console.log('请求失败:'+err.status+','+err.statusText);
                        });
                    },
                }
            });
        }
</script>
</body>
</html>
index.html
5、vuejs借助axios发送post请求
1. axios默认发送数据时,数据格式是Request Payload,并非我们常用的Form Data格式,
2. 所以参数必须要以键值对形式传递,不能以json形式传参
       3. 传参方式:
         1. 自己拼接为键值对
         2. 使用transformRequest,在请求发送前将请求数据进行转换
         3. 如果使用模块化开发,可以使用qs模块进行转换
<?php//获取参数$name=$_POST['name'];
$age=$_POST['age'];
//响应数据
echo '姓名:',$name,',年龄:',$age;
?>
server.php
<!DOCTYPE html><html lang="en">
<head>
<meta charset="UTF-8">
<title>发送AJAX请求</title>
</head>
<body>
<div id="itany">
<button @click="sendPost">POST方式发送AJAX请求</button>
</div>
<script src="js/vue.js"></script>
<script src="js/axios.min.js"></script>
<script>
        window.onload=function(){
new Vue({
                el:'#itany',
                data:{
                    user:{
                        name:'alice',
                        age:19
                    },
                    uid:''
                },
                methods:{
                    sendPost(){
// axios.post('server.php',{     // 这个是官方给出的post请求,但是后天无法收到
//         name:'alice',
//         age:19
// })
// axios.post('server.php','name=alice&age=20&') //方式1
                        axios.post('server.php',this.user,{
                            transformRequest:[                 // 在发送请求前可以改变要传的数据
function(data){
                                    let params='';
for(let index in data){
                                        params+=index+'='+data[index]+'&';   // 拼接成:name=alice&age=20& 的字符串
                                    }
return params;
                                }
                            ]
                        })
                        .then(resp => {
                            console.log(resp.data);
                        })
                        .catch(err => {
                            console.log('请求失败:'+err.status+','+err.statusText);
                        });
                    },
                }
            });
        }
</script>
</body>
</html>
vuejs借助axios发送post请求
1.3 使用vue-resource发送跨域请求
1、安装vue-resource并引入
1. cnpm install vue-resource -S
2. 参考:GitHub上搜索 vue-resource ,查看API文档:https://github.com/pagekit/vue-resource
2、基本用法
使用this.$http发送请求
this.$http.get(url, [options])
this.$http.head(url, [options])
this.$http.delete(url, [options])
this.$http.jsonp(url, [options])
this.$http.post(url, [body], [options])
this.$http.put(url, [body], [options])
this.$http.patch(url, [body], [options])
3、使用
<!DOCTYPE html><html lang="en">
<head>
<meta charset="UTF-8">
<title>发送AJAX请求</title>
</head>
<body>
<div id="itany">
<button @click="sendJSONP">向360搜索发送JSONP请求</button>
</div>
<script src="js/vue.js"></script>
<script src="js/vue-resource.min.js"></script>
<script>
        window.onload=function(){
new Vue({
                el:'#itany',
                data:{
                    user:{
                        name:'alice',
                        age:19
                    },
                    uid:''
                },
                methods:{
                    sendJSONP(){
//https://sug.so.360.cn/suggest?callback=suggest_so&encodein=utf-8&encodeout=utf-8&format=json&fields=word&word=a
this.$http.jsonp('https://sug.so.360.cn/suggest',{
                            params:{
                                word:'python'// 要查询的内容
                            }
                        }).then(resp => {
                            console.log(resp.data.s);    // 返回的查询结果
// ["python官网", "python视频教程", "python 培训", "python基础教程", "python下载", ]
                        });
                    },
                }
            });
        }
</script>
</body>
</html>
向360搜索发送JSONP请求
<!DOCTYPE html><html lang="en">
<head>
<meta charset="UTF-8">
<title>发送AJAX请求</title>
</head>
<body>
<div id="itany">
<button @click="sendJSONP2">向百度搜索发送JSONP请求</button>
</div>
<script src="js/vue.js"></script>
<script src="js/vue-resource.min.js"></script>
<script>
        window.onload=function(){
new Vue({
                el:'#itany',
                data:{
                    user:{
                        name:'alice',
                        age:19
                    },
                    uid:''
                },
                methods:{
                    sendJSONP2(){
//https://sp0.baidu.com/5a1Fazu8AA54nxGko9WTAnF6hhy/su?wd=a&json=1&p=3&sid=1420_21118_17001_21931_23632_22072&req=2&csor=1&cb=jQuery110208075694879886905_1498805938134&_=1498805938138
this.$http.jsonp('https://sp0.baidu.com/5a1Fazu8AA54nxGko9WTAnF6hhy/su',{
                            params:{
                                wd:'a'
                            },
                            jsonp:'cb'//百度使用的jsonp参数名为cb,所以需要修改
                        }).then(resp => {
                            console.log(resp.data.s);
// ["爱奇艺", "阿黛尔", "艾力绅", "阿里云", "阿里巴巴", "安居客", ]
                        });
                    }
                }
            });
        }
</script>
</body>
</html>
向百度搜索发送JSONP请求
4、发送get请求,并将请求内容添加到插件中
      get(url, option)
         Url :表示请求地址
         Option :表示请求配置
         Params :定义query数据
<!DOCTYPE html><html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="x-ua-compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Title</title>
</head>
<body>
<div id="app">
<h1>vue实例化对象</h1>
<router-view></router-view><!--定义渲染容器-->
</div>
<script type="text/javascript" src="vue.js"></script>
<script type="text/javascript" src="vue-router.js"></script>
<script type="text/javascript" src="vue-resource.min.js"></script>
<script>
var Home = {
            template:'<h1>home--{{data}}</h1>',
            data:function () {
return {
                    data:''
                }
            },
            created:function () {
this.$http.get('demo.json?123',{
                    params:{
                        color:'red'
                    }
                })
                    .then(function (res) {
this.data = res.data.name  //  res.data 是请求获取的内容
                    })
            }
        };
// 第一步:定义路由规则
var routes = [
            {
                path:'/home',
                name:'home',
                component:Home
            },
        ];
// 第二步:实例化路由对象
var router =new VueRouter({
            routes:routes
        });
// 第三步:在vue实例化对象中注册路由
var app =new Vue({
            el:'#app',
            router:router
        })
</script>
</body>
</html>
发送get请求
5、发送post请求
      post(url, data, option)
        Url :表示请求地址
        Data :表示请求的数据
        Option :表示请求的配置
        Params :定义query数据
<!DOCTYPE html><html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="x-ua-compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Title</title>
</head>
<body>
<div id="app">
<h1>vue实例化对象</h1>
<router-view></router-view><!--定义渲染容器-->
</div>
<script type="text/javascript" src="vue.js"></script>
<script type="text/javascript" src="vue-router.js"></script>
<script type="text/javascript" src="vue-resource.min.js"></script>
<script>
var Home = {
            template:'<h1>home--{{data}}</h1>',
            data:function () {
return {
                    data:''
                }
            },
            created:function () {
this.$http.post('demo.json?123',{'arg1':'price'},{
                    params:{
                        b:200
                    }
                })
                    .then(function (res) {
this.data = res.data.name  //  res.data 是请求获取的内容
                    })
            }
        };
// 第一步:定义路由规则
var routes = [
            {
                path:'/home',
                name:'home',
                component:Home
            },
        ];
// 第二步:实例化路由对象
var router =new VueRouter({
            routes:routes
        });
// 第三步:在vue实例化对象中注册路由
var app =new Vue({
            el:'#app',
            router:router
        })
</script>
</body>
</html>
发送post请求
1.4 封装axios请求
1、初始化环境
vue init webpack deaxios
npm install axios –S
cnpm install vuex -S
2、封装axios(创建 src/api 文件夹)
export default {// api请求地址// API_URL: 'http://mup.dev.yiducloud.cn/'
  API_URL: 'http://1.1.1.3:8888'
}
config\urls.js 配置全局url变量
import Axios from 'axios'import URLS from 
'../../config/urls'//1、使用自定义配置新建一个 axios 实例
const instance = Axios.create({
  baseURL: URLS.API_URL,
  headers: {
'Content-Type': 'application/json'
  }
});
//2、添加请求拦截器
instance.interceptors.request.use(
  config => {
//发送请求前添加认证token
    config.headers.Authorization = sessionStorage.getItem('token')
// console.log(sessionStorage.getItem('token'),11223344)
return config
  },
  err => {
return Promise.reject(err)
  });
//3、添加响应拦截器
instance.interceptors.response.use(function (response) {
// 对响应数据处理
if (response.status === 200 || response.status === 201 || response.status === 400) {
    const data = response.data
if (data.code === 200 || data.code === 201) {
return data
    }
  }
return Promise.reject(response)
}, function (error) {
if (error.response) {
switch (error.response.status) {
case 400:
return Promise.reject(error.response.data)
case 401:
        window.location.href = '/login'
    }
  }
// const errorData = error.response.data
// if (errorData.code === 400) {
//   return Promise.reject(errorData.desc)
// }
// return Promise.reject(errorData)
})
// export const getNodegroups = params => { return instance.get(`${base}/nodegroup/v1/nodegroups/list/`, params).then(res => res.data) }
// export const getNodegroups = params => { return instance.get(`/nodegroup/v1/nodegroups/list/`, params).then(res => res) }
export default instance
src\api\ajax.js
import URLS from '../../config/urls'import ajax from 
'./ajax'let base 
= URLS.API_URL// 用户相关export const requestLogin = params => { return ajax.post(`${base}/users/v1/user/login/`, params).then(res => res) }
src\api\api.js
import * as api from './api'export 
default apisrc\api\index.js
3、使用vuex
import Vue from 'vue'import Vuex from 
'vuex'import login from 
'./modules/login/login'Vue.use(Vuex);
export 
defaultnew Vuex.Store({  modules:{
    login
  }
});
src\store\index.js
import {  requestLogin,
} from 
'../../../api/api'  // 导入封装后的axios请求
const state = {}
const getters = {}
const actions = {
  async loginMethod ({commit}, params) {
return requestLogin(params).then(response => response)
  },
};
const mutations = {}
export default {
  state,
  getters,
  actions,
  mutations
}
src\store\modules\login\login.js
4、入口
// The Vue build version to load with the `import` command//
 (runtime-only or standalone) has been set in webpack.base.conf with an alias.import Vue from 'vue'
import App from './App'
import router from './router'
import store from './store/index'
Vue.config.productionTip = false
/* eslint-disable no-new */
new Vue({
  el: '#app',
  router,
  store,
  components: { App },
  template: '<App/>'
})
main.js 导入store
<template><div id="app">
<p @click="handleLogin">点击发送axiso请求</p>
<router-view/>
</div>
</template>
<script>
  import { mapActions } from 'vuex'
export default {
  name: 'App',
  methods: {
    ...mapActions(['loginMethod']),
    handleLogin () {
var loginParams = { username: 'zhangsan', password: '123456' }
this.loginMethod(loginParams).then(response => {
// this.logining = false
            sessionStorage.setItem('token', response.data)
// this.$router.push({ path: '/' })
          }).catch(error => {
this.loading =false
this.error(error.desc ? error.desc : '服务器异常')
          })
        }
    },
}
</script>
<style>
#app {
  font-family: 'Avenir', Helvetica, Arial, sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-align: center;
  color: #2c3e50;
  margin-top: 60px;
}
</style>
App.vue 组件发送请求
5、封装axios作用
1. 我们在此将此项目所用到的所有接口调用方法都做了定义,这样既方便查看也利于管理。在
2. 我们需要调用接口方法的时候,我们只需要在对应vue文件中的标签里直接import想用的接口方法就行了
例如:import { getOptList,branchList,addOperator } from "../../api/index";
6、使用vuex发送get请求
import Vue from 'vue'import Vuex from 
'vuex'import meeting from 
'./modules/meeting/meeting'Vue.use(Vuex)
export 
defaultnew Vuex.Store({  strict: process.env.NODE_ENV 
!== 'production',  modules: {
    meeting
  }
})
src\store\index.js
import {  getMeetingList
} from 
'../../../api/api'import {getUrl} from 
"../../../utils/global/geturl";  // 导入封装后的axios请求
const state = {};
const getters = {};
const actions = {
  async getMeetingListMethod ({commit}, params) {
return getMeetingList(getUrl(params)).then(response => response)
  },
};
const mutations = {};
export default {
  state,
  getters,
  actions,
  mutations
}
src/store/modules/meeting/meeting.js
<template></template>
<script>
  import { mapActions } from 'vuex'
  export default {
    data() {
return {};
    },
    methods: {
      ...mapActions(['getMeetingListMethod']),
// 获取会议室信息
      requestMeetingListMethod () {
var parms = {};
this.getMeetingListMethod(parms).then(response => {
          console.log(123456)
          console.log(response)
// this.tableData = response.data.data_list
// this.listQuery.total = response.data.total
this.loading = false
        }).catch(error => {
this.loading = false;
this.error(error.desc ? error.desc : '服务器异常')
        })
      },
    },
    created(){
this.requestMeetingListMethod();  // 获取会议室信息
    },
  };
</script>
<style scoped>
</style>
src/views/meeting/index.vue
以上是 05使用axios/vueresource发送HTTP请求 的全部内容, 来源链接: utcz.com/z/508674.html

