axios 使用javascript 类封装

axios 使用javascript 类封装

创建request.js

创建axios实例,配置响应成功,失败,拦截器。在main.js中调用。使用axios。后面在service就可以直接调用。

import axios from 'axios'
import { MessageBox, Message } from 'element-ui'
import store from '@/store'
import { getToken } from '@/utils/auth'

// create an axios instance
const service = axios.create({
  baseURL: process.env.VUE_APP_BASE_API, // url = base url + request url
  // withCredentials: true, // send cookies when cross-domain requests
  timeout: 5000 // request timeout
})

// request interceptor
service.interceptors.request.use(
  config => {
    // do something before request is sent

    if (store.getters.token) {
      // let each request carry token
      // ['X-Token'] is a custom headers key
      // please modify it according to the actual situation
      config.headers['X-Token'] = getToken()
    }
    return config
  },
  error => {
    // do something with request error
    console.log(error) // for debug
    return Promise.reject(error)
  }
)

// response interceptor
service.interceptors.response.use(
  /**
   * If you want to get http information such as headers or status
   * Please return  response => response
  */

  /**
   * Determine the request status by custom code
   * Here is just an example
   * You can also judge the status by HTTP Status Code
   */
  response => {
    const res = response.data

    // if the custom code is not 20000, it is judged as an error.
    if (res.code !== 20000) {
      Message({
        message: res.message || 'Error',
        type: 'error',
        duration: 5 * 1000
      })

      // 50008: Illegal token; 50012: Other clients logged in; 50014: Token expired;
      if (res.code === 50008 || res.code === 50012 || res.code === 50014) {
        // to re-login
        MessageBox.confirm('You have been logged out, you can cancel to stay on this page, or log in again', 'Confirm logout', {
          confirmButtonText: 'Re-Login',
          cancelButtonText: 'Cancel',
          type: 'warning'
        }).then(() => {
          store.dispatch('user/resetToken').then(() => {
            location.reload()
          })
        })
      }
      return Promise.reject(new Error(res.message || 'Error'))
    } else {
      return res
    }
  },
  error => {
    console.log('err' + error) // for debug
    Message({
      message: error.message,
      type: 'error',
      duration: 5 * 1000
    })
    return Promise.reject(error)
  }
)

export default service

base.service.js 文件

这个文件主要用来配置所有请求基本方法,postgetpatchdeleteput

还可以应用一定的工具类对数据进行为空的一个处理。

import axios from 'axios';
import { objCleanEmpty, objValueTrim } from '@/utils';

export default class BaseService {
  // 提供get请求方法
  static async get(url, params = {}, clearEmptyParams = true) {
    params = clearEmptyParams ? objCleanEmpty(objValueTrim(params)) : params;
    return axios.request({
      method: 'GET',
      url,
      params,
    });
  }

  // 提供post请求
  static async post(url, postData, clearEmptyData = true) {
    postData = clearEmptyData ? objCleanEmpty(objValueTrim(postData)) : objValueTrim(postData);
    return axios.post(url, postData);
  }

  // 提供patch请求
  static async patch(url, postData = {}, clearEmptyData = true) {
    postData = clearEmptyData ? objCleanEmpty(objValueTrim(postData)) : objValueTrim(postData);
    return axios.patch(url, objValueTrim(postData ?? {}));
  }

  // 提供put方法
  static async put(url, postData = {}, clearEmptyData = true) {
    postData = clearEmptyData ? objCleanEmpty(objValueTrim(postData)) : objValueTrim(postData);
    return axios.put(url, postData);
  }

  // 提供delete请求
  static async delete(url, postData = []) {
    return axios.delete(`${url}`, { body: postData });
  }
}

具体实际请求模块文件

login.service.js为例子:

import BaseService from './../base.service';

export class LoginService extends BaseService {
  static async loginApi(postData) {
    return BaseService.post('/admin/login', postData);
  }
}

具体实际调用

这里就能体现使用类对象来封装的好处了,可以直接引入一个类即可,调用类具体的方法。

import { LoginService } from '@/services';//引入服务模块


//使用
LoginService.loginApi({
  username,
  password,
})
  .then((data) => {
    //响应数据对应的操作
  })
  .catch((err) => {
    // 请求失败对应的操作
  });
<think>好的,用户想了解Axios使用方法以及如何进行封装。首先,我需要回忆Axios的基本概念和常用功能。Axios是一个基于Promise的HTTP客户端,用于浏览器和Node.js,支持请求拦截、响应拦截、自动转换JSON数据等特性。用户可能希望了解如何安装、基本使用,以及如何封装以提升代码复用性。 接下来,我应该整理安装步骤。Axios可以通过npm或yarn安装,用户可能需要示例代码来展示如何引入和使用。然后,基本使用部分需要涵盖GET、POST请求,以及处理响应和错误的方式。这部分需要简明扼要,避免信息过载。 然后是封装部分。用户可能希望在自己的项目中统一处理请求,比如添加拦截器来处理全局的loading状态、错误提示、token验证等。需要分步骤说明如何创建实例、添加拦截器,并提供一个封装后的示例,方便用户直接使用。同时,引用提供的参考资料中的示例,如request.ts的二次封装,以及如何在Vue或React项目中引入封装后的实例。 还需要考虑文件上传的封装,这可能是一个常见的需求,用户提到的引用4中提到了上传文件的封装,应该包含这部分内容。此外,用户可能对如何结合SignalR感兴趣,但根据引用5,可能只需要简要提及,或者专注于核心的Axios封装。 要确保回答结构清晰,分步骤讲解,每个部分都有代码示例。同时,检查是否有遗漏的细节,比如错误处理中的具体状态码处理,或者如何取消请求等高级功能,但根据用户问题,可能不需要深入这些细节,保持基础即可。 最后,生成相关问题,需要围绕Axios的进阶使用、拦截器的具体应用、封装的最佳实践,以及与其他技术的整合,比如文件上传或WebSocket。确保问题覆盖用户可能进一步探索的方向。</think>### Axios使用教程及封装示例 #### 一、Axios基本使用 1. **安装Axios** ```bash npm install axios --save # 或使用 yarn add axios ``` 2. **发送请求示例** ```javascript // GET请求 axios.get('/api/user', { params: { id: 1 } }) .then(response => console.log(response.data)) .catch(error => console.error(error)); // POST请求 axios.post('/api/login', { username: 'admin', password: '123456' }) .then(response => console.log(response.data)); ``` 3. **全局配置** ```javascript axios.defaults.baseURL = 'https://api.example.com'; axios.defaults.headers.common['Authorization'] = 'Bearer token123'; ``` #### 二、Axios封装步骤(以Vue项目为例) 1. **创建封装文件`request.js`** ```javascript import axios from 'axios'; const instance = axios.create({ baseURL: 'https://api.example.com', timeout: 10000, }); // 请求拦截器 instance.interceptors.request.use(config => { config.headers.Authorization = localStorage.getItem('token'); return config; }, error => Promise.reject(error)); // 响应拦截器 instance.interceptors.response.use(response => { return response.data; // 直接返回核心数据 }, error => { if (error.response.status === 401) { alert('登录过期,请重新登录'); window.location.href = '/login'; } return Promise.reject(error); }); export default instance; ``` 2. **在组件中使用封装实例** ```javascript import request from './request.js'; // GET请求 request.get('/user', { params: { id: 1 } }); // POST请求 request.post('/login', { username: 'admin', password: '123456' }); ``` #### 三、文件上传封装示例 ```javascript export const uploadFile = (file) => { const formData = new FormData(); formData.append('file', file); return instance.post('/upload', formData, { headers: { 'Content-Type': 'multipart/form-data' } }); }; ``` #### 四、最佳实践 1. 通过`axios.create()`创建不同业务域的独立实例[^3] 2. 拦截器中实现统一错误处理(如401跳转登录) 3. 封装文件上传等特殊请求型[^4] 4. 支持TypeScript型定义(引用示例中的`request.ts`)[^1]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

万伏小太阳

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值