使用axios進行apiService的封裝

前言:

最近在進行項目前端架構的過程中,一直在想如何封裝異步請求的apiService,達到更規范的應用和更簡便的書寫。剛開始想使用定義抽象類的方式進行書寫,后面發現不可行,并不能達到自己想象的減少代碼量,并且能保持很強的重用性。最后想到使用構造函數的方式進行封裝。具體代碼實現如下:

一、攔截器的代碼實現:

import axios from 'axios'

// 創建axios實例
const service = axios.create({
  // baseURL: process.env.BASE_API, // api的base_url
  timeout: 30000 // 請求超時時間
});

// request攔截器
service.interceptors.request.use(config => {
  //此處進行token等數據處理
  return config
}, error => {
  // Do something with request error
  Promise.reject(error)
});

// respone攔截器
service.interceptors.response.use(
  response => {
    const res = response.data;
    if (res.code !== 200) {
      //此處進行異常處理
      return Promise.reject(res);
    }
    return response
  },
  error => {
    //此處進行異常處理
    return Promise.reject(error)
  }
);

export default service

首先實現攔截器的配置,對項目實際使用時的錯誤提示、token的綁定進行統一處理

二、apiService的構造函數實現

import request from './request'

export class ApiService {
  constructor(url) {
    this.baseUrl = url;
  }

  //獲取列表數據
  list(query) {
    return request({
      url: this.baseUrl + '/list',
      method: 'get',
      params: query
    })
  }

  //新增數據
  create(data) {
    return request({
      url: this.baseUrl + '/create',
      method: 'post',
      data: data
    })
  }

  //修改數據
  update(data) {
    return request({
      url: this.baseUrl + '/update',
      method: 'put',
      data: data
    })
  }

  //刪除數據
  delete(id) {
    return request({
      url: this.baseUrl + '/delete/' + id,
      method: 'delete'
    })
  }

  //獲取數據詳情
  view(id) {
    return request({
      url: this.baseUrl + '/view/' + id,
      method: 'get'
    })
  }
}

在實際使用時,僅需定義如userApiService,代碼如下:

import {ApiService} from './apiService'

export const UserApiService = new ApiService('/user');

在實際使用頁面中,引用UserApiService ,就可以調用list、create、update、delete、view等方法了。當然,實際使用中會有自己的特殊需求,如提交等請求,需要特殊的url拼接。但是,總的來說前后端一定遵循公司內部規范,用這樣的寫法可以達到較少的代碼量實現較高的復用性。
最后,希望大家有更好的實現方案可以在評論中告知,互相進步學習。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。