vue使用axios實現前后端通信


安裝依賴

npm install --save axios
# vue-axios是對axios的簡單封裝
npm install --save vue-axios

用例

在main.js里面進行全局引入

import Vue from 'vue'
// 這里引入
import Axios from 'axios';
import VueAxios from 'vue-axios';
import App from './App'
import router from './router'
// 這里初始化
Vue.use(VueAxios, Axios)
Vue.config.productionTip = false

/* eslint-disable no-new */
new Vue({
  el: '#app',
  router,
  components: { App },
  template: '<App/>'
})

在組件中調用方法

<template>
  <section class="container">
    <h1>姓名: {{ this.data.name }}</h1> // 張三
    <h1>性別: {{ this.data.sex }}</h1> // 男
    <h1>年齡: {{ this.data.age }}</h1> // 24
  </section>
</template>

<script>
export default {
  data() {
    return {
      data: {}
    };
  },
  mounted() {
    this.$http
      .post("http://rap2api.taobao.org/app/mock/14963/api/list", {name: '12312321'})
      .then(result => {
        this.data = result.data;
      })
      .catch(err => {
        console.log(err);
      });
  }
};
</script>

<style>
</style>

封裝

main.js

import Vue from 'vue'
import App from './App'
import router from './router'
import { get, post, uploadFile } from './module/http'

// 配置全局變量
Vue.prototype.post = post
Vue.prototype.get = get
Vue.prototype.uploadFile = uploadFile
Vue.config.productionTip = false

/* eslint-disable no-new */
new Vue({
  el: '#app',
  router,
  components: { App },
  template: '<App/>'
})

組件中調用

<template>
  <section class="container">
    <h1>我是{{$route.query.name}},我今年{{$route.query.age}}歲了</h1>
    <h1>姓名: {{ this.data.name }}</h1>
    <h1>性別: {{ this.data.sex }}</h1>
    <h1>年齡: {{ this.data.age }}</h1>
  </section>
</template>

<script>
export default {
  data() {
    return {
      data: {}
    };
  },
  mounted() {
    this.post("http://rap2api.taobao.org/app/mock/14963/api/list").then((result) => {
      this.data = result;
    });
  }
};
</script>

<style>
</style>

http.js

/**axios封裝
 * 請求攔截、相應攔截、錯誤統一處理
 */
import axios from 'axios';
import QS from 'qs';
import { Toast } from 'vant';
// import store from '../store/index'

// 環境的切換
if (process.env.NODE_ENV == 'development') {
  axios.defaults.baseURL = '/api';
} else if (process.env.NODE_ENV == 'debug') {
  axios.defaults.baseURL = '';
} else if (process.env.NODE_ENV == 'production') {
  axios.defaults.baseURL = 'http://api.123dailu.com/';
}

// 請求超時時間
axios.defaults.timeout = 10000;

// post請求頭
axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded;charset=UTF-8';

// 請求攔截器
axios.interceptors.request.use(
  config => {
    // 每次發送請求之前判斷是否存在token,如果存在,則統一在http請求的header都加上token,不用每次請求都手動添加了
    // 即使本地存在token,也有可能token是過期的,所以在響應攔截器中要對返回狀態進行判斷
    const token = // store.state.token;
      token && (config.headers.Authorization = token);
    return config;
  }, error => {
    return Promise.error(error);
  })

// 響應攔截器
axios.interceptors.response.use(
  response => {
    if (response.status === 200) {
      return Promise.resolve(response);
    } else {
      return Promise.reject(response);
    }
  },
  // 服務器狀態碼不是200的情況 
  error => {
    if (error.response.status) {
      switch (error.response.status) {
        // 400 請求錯誤
        case 400:
          break;
        // 401: 未登錄    
        // 未登錄則跳轉登錄頁面,並攜帶當前頁面的路徑    
        // 在登錄成功后返回當前頁面,這一步需要在登錄頁操作。    
        case 401:
          router.replace({
            path: '/login',
            query: {
              redirect: router.currentRoute.fullPath
            }
          });
          break;
        // 403 token過期    
        // 登錄過期對用戶進行提示    
        // 清除本地token和清空vuex中token對象    
        // 跳轉登錄頁面    
        case 403:
          Toast({
            message: '登錄過期,請重新登錄',
            duration: 1000,
            forbidClick: true
          });
          // 清除token     
          localStorage.removeItem('token');
          // store.commit('loginSuccess', null);
          // 跳轉登錄頁面,並將要瀏覽的頁面fullPath傳過去,登錄成功后跳轉需要訪問的頁面
          setTimeout(() => {
            router.replace({
              path: '/login',
              query: {
                redirect: router.currentRoute.fullPath
              }
            });
          }, 1000);
          break;
        // 404請求不存在    
        case 404:
          Toast({
            message: '網絡請求不存在',
            duration: 1500,
            forbidClick: true
          });
          break;
        // 408 請求超時
        case 408:
          err.message = '請求超時(408)';
          break;
        // 500 服務器錯誤
        case 500:
          err.message = '服務器錯誤(500)';
          break;
        case 501:
          err.message = '服務未實現(501)';
          break;
        case 502:
          err.message = '網絡錯誤(502)';
          break;
        case 503:
          err.message = '服務不可用(503)';
          break;
        case 504:
          err.message = '網絡超時(504)';
          break;
        case 505:
          err.message = 'HTTP版本不受支持(505)';
          break;
        // 其他錯誤,直接拋出錯誤提示    
        default:
          Toast({
            message: error.response.data.message,
            duration: 1500,
            forbidClick: true
          });
      }
      return Promise.reject(error.response);
    }
  });

/** 
 * get方法,對應get請求
 * @param {String} url [請求的url地址]
 * @param {Object} params [請求時攜帶的參數]
 */
export const get = (url, params) => {
  return new Promise((resolve, reject) => {
    axios.get(url, {
      params: params
    }).then(res => {
      if (ds.resultCode === '1') {
        resolve(ds.resultData);
      } else {
        resolve(ds.resultMsg);
      }
    }).catch(err => {
      reject(err.data)
    })
  });
}

/** 
 * post方法,對應post請求
 * @param {String} url [請求的url地址]
 * @param {Object} params [請求時攜帶的參數]
 */
export const post = (url, params) => {
  return new Promise((resolve, reject) => {
    axios.post(url, QS.stringify(params)).then(res => {
      const ds = res.data;
      if (ds.resultCode === '1') {
        resolve(ds.resultData);
      } else {
        resolve(ds.resultMsg);
      }
    }).catch(err => {
      reject(err);
    })
  });
}

/**
 * POST方法封裝(文件上傳)
 * @param {String} url [請求的url地址]
 * @param {Object} params [請求時攜帶的參數]
 * @param {String} headers [設置請求headers]
 */
export const uploadFile = (url, params, headers) => {
  return new Promise((resolve, reject) => {
    axios.post(url, QS.stringify(params), headers).then(res => {
      if (ds.resultCode === '1') {
        resolve(ds.resultData);
      } else {
        resolve(ds.resultMsg);
      }
    }).catch(err => {
      reject(err.data)
    })
  })
}



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM