zoukankan      html  css  js  c++  java
  • 【Vue】vue怎么做接口管理

    创建一个request.js用于封装axios,在 src/api/request,设置拦截器统一处理请求和相应。,然后在api文件夹中引入request.js后再使用封装后的方法进行请求。

    封装 axios:

    request.js

    import axios from 'axios'
    import {Message, Loading} from "element-ui"
    import {getToken} from "@/utils/auth"
    
    function Index({...config}) {
      // create an axios instance
      const service = axios.create({
        /*headers: {
          'Cache-Control': 'no-cache'
        },*/
        baseURL: config.baseURL || process.env.VUE_APP_BASE_API, // url = base url + request url
        // withCredentials: true, // send cookies when cross-domain requests
        timeout: 30000 // request timeout
      })
    
      // request interceptor
      service.interceptors.request.use(
        config => {
          return config
        },
        error => {
          return Promise.reject(error)
        }
      )
    
      // response interceptor
      service.interceptors.response.use(
        response => {
          return response
        },
        error => {
          const {request = {}} = error;
          const {status, response} = request;
    
          error.status = status
          try {
            error.res = JSON.parse(response)
          } catch (e) {
            console.warn(e)
          }
          return Promise.reject(error)
        }
      )
    
      /**
       * 发起请求
       * @param method 请求方法
       * @param url 请求地址
       * @param params 要发送的数据
       * @param config 配置
       * @param axiosConfig Axios配置项
       * @returns {Promise<never>|Promise<AxiosResponse<T>>}
       */
      const requestProcessor = (method, url, params, config, axiosConfig) => {
        const headers = {}
        const token = getToken().token
        if (token) {
          // let each request carry token
          headers['Authorization'] = 'JWT ' + token
        }
    
        if (config.formData) {
          const fd = new FormData();
          for (let key in params) {
            fd.append(key, params[key])
          }
          params = fd
        }
    
        switch (method.toUpperCase()) {
          case 'GET':
            return service.get(url, {
              params,
              headers,
              ...axiosConfig,
            })
          case 'POST':
            return service.post(url, params, {
              headers,
              ...axiosConfig,
            })
          case 'DELETE':
            return service.delete(url, {
              params,
              headers,
              ...axiosConfig,
            })
          case 'PUT':
            return service.put(url, params, {
              headers,
              ...axiosConfig,
            })
          default:
            return Promise.reject(new Error(`${method} 方法无效,请用正确的请求方法`))
        }
      }
    
      this.service = async ({method, url, params, config = {}, axiosConfig = {}}) => {
        const {isLoading = true, isToast = true} = config
    
        let loadingInstance
        isLoading && (loadingInstance = Loading.service({
          fullscreen: true,
          background: 'transparent',
          text: '加载中...'
        }))
    
        try {
          const response = await requestProcessor(method, url, params, config, axiosConfig)
          // 此处可以再次拦截
          return response.data
        } catch (error) {
          isToast && Message.error(error.message)
          throw error
        } finally {
          isLoading && loadingInstance.close()
        }
    
      }
    }
    
    export const {request} = new Index()
    export default Index

    接口 listing.js

    import Request from "@/api/request"
    
    const {service} = new Request()//前代码的this.service
    
    export default {
      userPostList({pageSize, page}) {
        return service({
          method: 'get',
          url: '/userpostlist/',
          params: {
            pageSize,
            page
          },
          config: {
            isLoading: false
          }
        })
      }
    }

    在 Vue 组件中使用:

    import listing from "@/api/listing"
    
    export default {
        mounted() {
          this.getList()
        },
        methods: {
          getList() {
            this.isLoading = true
    
            listing.userPostList({
              pageSize: this.pageSize,
              page: this.currentPage,
            }).then(data => {
              this.currentPage = parseInt(data.currentPage)
              this.total = data.total
              this.list = data.results
    
            }).finally(() => {
              this.isLoading = false
            })
          }
        }
    }

    转自:http://www.mianshigee.com/question/28887vwy

  • 相关阅读:
    wp7订餐客户端源码
    AOP技术术语
    urlpattern详解
    .net 访问IBM DB2 数据库
    入驻博客园
    hadoop视频
    阿里OneData构建数据指标体系
    大数据领域全景解析
    PyTorch中梯度为什么默认自动累加,在反向传播前要手动将梯度清零?
    Pytorch:Dataloader和Dataset以及搭建数据部分的步骤
  • 原文地址:https://www.cnblogs.com/vickylinj/p/14417441.html
Copyright © 2011-2022 走看看