首頁 > 軟體

vue如何封裝Axios的get、post請求

2022-06-01 14:01:30

封裝Axios的get、post請求

Axios在vue專案中用的較多,每次都要寫一遍很是不方便,尤其其中的config設定項是公用的,完全可以封裝一下,這樣下次再用就可以直接CV了!畢竟CV大法香啊!

1.封裝Axios基礎設定

建立一個request.js 檔案,內容如下,我把解釋性文字放在註釋裡了。

import axios from 'axios'
export function request(config) {
  // 1.建立axios的範例
  const instance = axios.create({
    // 設定基礎的url設定項,這樣介面處的url前面就不用寫url:'http://127.0.0.1:8000/api/home',直接寫成 url:'/api/home', 就可以了
    baseURL: 'http://127.0.0.1:8000/', 
    //設定請求超時時間
    timeout: 5000 
  })
  // 2.axios的攔截器,用不到的可以忽略這節
  // 2.1.請求攔截的作用
  instance.interceptors.request.use(config => {
    return config
  }, err => {
    console.log('請求攔截err: '+err);
  })
  // 2.2.響應攔截
  instance.interceptors.response.use(res => {
    return res.data
  }, err => {
        console.log('響應攔截err: '+err);
  })
  // 3.傳送真正的網路請求
  return instance(config)
}

2.封裝網路請求

我們可以將相關的網路請求都放在一個js中,這樣再使用和修改的時候就方便查詢了。其中get請求比較簡單,post 的請求根據傳物件輸型別不同,要做不同設定。

現在來說說post請求常見的資料格式(content-type)

Content-Type: application/json : 請求體中的資料會以json字串的形式傳送到後端,這種是axios預設的請求資料型別,我們只需將引數序列化json字串進行傳遞即可,無需多餘的設定。

Content-Type: application/x-www-form-urlencoded:請求體中的資料會以普通表單形式(鍵值對)傳送到後端

Content-Type: multipart/form-data: 它會將請求體的資料處理為一條訊息,以標籤為單元,用分隔符分開。既可以上傳鍵值對,也可以上傳檔案。

建立一個network.js 檔案,內容如下:

// 匯入封裝好的Axios
import {request} from './request' //注意request.js的相對路徑問題
//1. get請求---獲取首頁的多個資料
export function getHomeMultidata() {
  return request({
    url:'/api/home',
    method:'get',
    // 可以帶引數也可以不帶引數
    // params: {
    //     userName: 'Lan',
    //     password: '123'
    // }
  })
}
// 2.1 post請求---傳輸json資料時,獲取電視劇多個資料
export function getTvshowMultidata() {
  return request({
    url:'/api/Tvshow',
     headers: {
      'Content-Type': 'application/json'
    },
    method:'post',
    data: {
        userName: 'Lan',
        password: '123'
     }
  })
}
//2.2 post請求---傳輸檔案流,表單Form Data 資料時
export function getMovieMultidata() {
  return request({
    url:'/api/Movie',
    headers: {
    'Content-Type': 'multipart/form-data';
    },
    method:'post',
    data: {
        userName: 'Lan',
        password: '123'
     }
  })
}

3.vue中使用

在script 標籤中按需匯入network.js 中需要使用的方法

import {getHomeMultidata} from "network/home/network"; //匯入js,路徑自己根據檔案位置設定

在方法中按照promise的格式呼叫函數即可 

created() {
      // 在方法中呼叫函數即可
        getHomeMultidata().then(
          res => {
          // 此處res 為返回的資料,將返回的資料進行處理顯示
            this.banners = res.homedata.slice(0,5)
            this.newestData = res.homedata.slice(5,12)
            
        ).catch(
          err => {
            console.log(err)
          }
        );
    },

network中的其他網路請求方法使用方法同上。

vue axios兩種方法(封裝和不封裝)get請求和post請求

沒有封裝的用法

1.首先在專案中下載axios

npm install axios -s //此方法會將axios下載到package.json中的"dependencies"模組中,大家可以自行檢視

2.因為沒有封裝所以需要在單個vue元件中的編寫js的地方進行參照axios;語法如下

<script>
import axios from  ' axios'
</script>

3.然後在生命週期函數中進行呼叫資料

export default{ 
created() {
 
      //get請求    
    axios.get("url", {
 
      params: { //此處為get請求傳遞的引數 但是一把get請求是沒有引數的 params是固定的
          password: "123456",
         userName: "320621200305185129",
        },
      })
      
 
     .then(function (response) {
       console.log(response, 666666);
     })
     .catch(function (error) {
        console.log(error, 44444);
      });
      
  },
}
 
//post請求
axios.post('url', {
//此處是引數
    firstName: 'Fred',
    lastName: 'Flintstone'
  })
  .then(function (response) {
    console.log(response);
  })
  .catch(function (error) {
    console.log(error);
  });

每個專案的的介面都是不一樣的,很多時候程式碼都不是唯一性的,要靈活的運用

封中之後的用法

首先一個目錄utils,在該目錄下建立request.js 在裡面編寫

import axios from 'axios'
export function request(config) {
  // 1.建立axios的範例
  const instance = axios.create({
    // 設定基礎的url設定項,這樣介面處的url前面就不用寫了
 
    baseURL: 'http://192.168.0.112:9518/', 基礎程式碼
    //設定請求超時時間
    timeout: 5000 
  })
 
  // 2.axios的攔截器,用不到的可以忽略這節
  // 2.1.請求攔截的作用
  instance.interceptors.request.use(config => {
    return config
  }, err => {
    console.log('請求攔截err: '+err);
  })
 
  // 2.2.響應攔截
  instance.interceptors.response.use(res => {
    return res.data
  }, err => {
        console.log('響應攔截err: '+err);
  })
 
  // 3.傳送真正的網路請求
  return instance(config)
}

然後在目錄下建立api在此處建立index.js  在此處參照上方建立axios範例

import {request} from '../utils/request'
//get請求
 
export function denglu() {
  return request({
    url: 'login',
    method: 'get',
    params:{ //此處為傳遞的引數 //get請求一般是不傳遞引數的
        password:'123456',
        uerName:'5555555555'
    }
    // header: { // 已經在request.js裡面進行全域性設定,也可以在請求裡面區域性設定其他headers
    //    'Content-Type': 'text/plain'
    // }
  })
}
 //post請求
export function denglu() {
  return request({
    url: 'login',
    method: 'post',
    data:{ //此處為傳遞的引數
        password:'123456',
        uerName:'5555555555'
    }
    // header: { // 已經在request.js裡面進行全域性設定,也可以在請求裡面區域性設定其他headers
    //    'Content-Type': 'text/plain'
    // }
  })
}

然後需要在vue元件的中 在編寫js的地方引入index.js

<script>
import denglu from  "../api/index"
</script>

之後就可以在vue元件方法中進行應用了,下面是我在vue元件中根據上面的程式碼進行應用的範例 

       

以上為個人經驗,希望能給大家一個參考,也希望大家多多支援it145.com。


IT145.com E-mail:sddin#qq.com