Vue封装axios请求

为了方便调用api接口,我们封装axios请求

1、在vue项目的src目录下创建api文件夹

并在api文件夹中创建两个两个js文件(http.js、api.js)

http.js文件中写入:

import axios from 'axios'
axios.defaults.baseURL="http://127.0.0.1:8000/"
axios.defaults.timeout = 1000000;
axios.defaults.headers.post['Content-Type'] = 'application/json';
axios.defaults.headers.put['Content-Type'] = 'application/json';

axios.interceptors.request.use(
   config => {
       // 每次发送请求之前判断是否存在token,如果存在,则统一在http请求的header都加上token,不用每次请求都手动添加了
       const token = sessionStorage.getItem("jwt_token")
       console.log(token)
       if (token){
           config.headers.Authorization = 'JWT '+ token
       }
       return config;
   },
   error => {
       return Promise.error(error);
   })

axios.interceptors.response.use(
   // 请求成功
   res => res.status === 200 ? Promise.resolve(res) : Promise.reject(res),

   // 请求失败
   error => {
       if (error.response) {
           // 判断一下返回结果的status == 401?  ==401跳转登录页面。  !=401passs
           console.log(error.response)
           if(error.response.status===401){
               // 跳转不可以使用this.$router.push方法、
               // this.$router.push({path:'/login'})
               window.location.href="http://127.0.0.1:8080/#/login"
           }else{
               // errorHandle(response.status, response.data.message);
               return Promise.reject(error.response);
           }
           // 请求已发出,但是不在2xx的范围
       } else {
           // 处理断网的情况
           // eg:请求超时或断网时,更新state的network状态
           // network状态在app.vue中控制着一个全局的断网提示组件的显示隐藏
           // 关于断网组件中的刷新重新获取数据,会在断网组件中说明
           // store.commit('changeNetwork', false);
           return Promise.reject(error.response);
       }
   });

// 封装xiaos请求  封装axios里的get
export function axios_get(url,params){
   return new Promise(
       (resolve,reject)=>{
           axios.get(url,{params:params})
           .then(res=>{
               console.log("封装信息的的res",res)
               resolve(res.data)
           }).catch(err=>{
               reject(err.data)
           })
       }
   )
}

export function axios_post(url,data){
   return new Promise(
       (resolve,reject)=>{
           console.log(data)
           axios.post(url,JSON.stringify(data))
           .then(res=>{
               console.log("封装信息的的res",res)
               resolve(res.data)
           }).catch(err=>{
               reject(err.data)
           })
       }
   )
}

export function axios_put(url,data){
   return new Promise(
       (resolve,reject)=>{
           console.log(data)
           axios.put(url,JSON.stringify(data))
           .then(res=>{
               console.log("封装信息的的res",res)
               resolve(res.data)
           }).catch(err=>{
               reject(err.data)
           })
       }
   )
}

export function axios_delete(url,data){
   return new Promise(
       (resolve,reject)=>{
           console.log(data)
           axios.delete(url,{params:data})
           .then(res=>{
               console.log("封装信息的的res",res)
               resolve(res.data)
           }).catch(err=>{
               reject(err.data)
           })
       }
   )
}

api.js路面写入:

import {axios_get,axios_post,axios_delete,axios_put} from './http.js'

export const login_post = p  => axios_post("/myapp/index/",p)  //定义路由,post请求

export const login_get = p  => axios_get("/myapp/index/",p)  //定义路由,get请求

2、在components文件中创建index.vue

新建index.vue页面

3、在index.vue中写入代码(post请求)

<template>
	<body>
     <input type="text" v-model="username"  placeholder="用户名">
     <input type="password" v-model="password"  placeholder="密码">
      <button v-on:click="login">登录</button>
	</body>
</template>
<script>
 import {login_post} from '../api/api'
   export default {
       name: "index",
       data() {
           return {
                   username:'',
                   password: ''
   	   }
       	},
       methods: {
   	login:function(){
   	    var data={'username':this.username,'password':this.password}
   	    login_post(data).then( res => {
   		  if(res.code==200){
   			this.$Message('登录成功')
   		   }else {
   			this.$Message('登录失败)
   		   }
   		})
   	     }
            }
   }
</script>
<style>
</style>

4、在index.vue中写入代码(get请求)

<template>
	<body>
     <input type="text" v-model="username"  placeholder="用户名">
     <input type="password" v-model="password"  placeholder="密码">
     <button v-on:click="login">登录</button>
	</body>
</template>
<script>
 import {login_get} from '../api/api'
   export default {
       name: "index",
       data() {
           return {
                   username:'',
                   password: ''
   	   }
       	},
        methods: {
   	login:function(){
   	    var  params={'username':this.username,'password':this.password}
   	    login_get(params).then( res => {
   		  if(res.code==200){
   			this.$Message('登录成功')
   		    }else {
   			 this.$Message('登录失败)
   		   	}
   		   })
   	      }
            }
   }
</script>
<style>
</style>

*** 注:get请求和post请求方式参数不同(前者是params后者是data)**

5、在router文件下的index.js中注册路由

import Vue from 'vue'
import Router from 'vue-router'
import index from '@/components/index'

Vue.use(Router)

var routes = [
    {
         path:'/',
         name:'index',
         component:index,
       },
]

export default new Router({
 routes:routes,
 mode:'history'   /*hash*/
})


6、启动vue项目就可以了

npm run dev
posted @ 2020-10-14 15:58  李厚奇  阅读(491)  评论(0编辑  收藏  举报