Skip to content

第二章:Api请求

介绍

API请求是连接前端UI和后端服务的关键部分,对于构建一个高效、可维护的管理系统至关重要,当前框架选择的是Axios库进行封装。封装库文件位于:src/utils/request.js

如何写自己的API接口

系统中,目前封装的api请求都在 src/api 目录下,当然api请求的目录不是固定的,使用的时候,可以写在任意目录,只需在文件中采取以下引用即可

javascript
import {request }from '@/utils/request.js'

我们来看一个案例:

javascript
import {request }from '@/utils/request.js'

export default {
  /**
   * 获取公告列表
   * @returns
   */
  getNoticeList(params = {}) {
    return request({
      url: '/core/system/notice',
      method: 'get',
      params
    })
  },

  /**
   * 保存网络图片
   * @returns
   */
  saveNetWorkImage(data = {}) {
    return request({
      url: '/core/system/saveNetworkImage',
      method: 'post',
      data
    })
  },

}

params 和 data 的区别

后端代码需要通过 $request->get 方式获取的,需要使用上面params的方式

后端代码需要通过 $request->post 方式获取的,需要使用上面案例中data的方式

在页面中如何调用

由于封装的 apipromise 类型,我们可以通过同步或者异步的方式进行调用

  • 同步方式调用(同步表示该接口请求完了之后,才会继续运行后面的代码):
javascript
// 引用api
import api from '@/api/index'

// 同步方法调用,外部必须用 async 标识
const getData = async (id) => {
  // 调用的时候 在方法前面用 await 标识
  const resp = await api.readData({ id })
  if (resp.code === 200) {
    Message.success(resp.message)
  }
}
  • 异步方式调用(异步表示当前接口请求的过程中,后续代码也会继续执行,不会阻塞):
javascript
// 引用api
import api from '@/api/index'

// 异步调用方式
const getData = (id) => {
  // 调用的时候 在方法后面通过  then catch  finally 等形式进行处理
  api.readData({ id }).then((resp) => {
    if (resp.code === 200) {
        Message.success(resp.message)
    }
  })
}

如何在header中加入自己的业务字段

src/utils/request.js 文件中,找到以下代码,在headers位置进行修改:

javascript
/**
 * @description 创建请求方法
 * @param service
 * @param externalService
 */
function createRequest(service, externalService) {
  return function (config) {
    const env = import.meta.env
    const token = tool.local.get(env.VITE_APP_TOKEN_PREFIX)
    const setting = tool.local.get('setting')
    const configDefault = {
      headers: Object.assign(
        {
          'Authori-zation': token,
          'Accept-Language': setting?.language || 'zh_CN',
          'Content-Type': get(
            config,
            'headers.Content-Type',
            'application/json;charset=UTF-8'
          )
        },
        config.headers
      ),

      timeout: 10000,
      data: {}
    }

    ......

  }
}

如何根据返回code的不同,增加自己的业务处理

src/utils/request.js 文件中,找到以下代码,在响应拦截器位置进行修改:

javascript
// HTTP response 拦截器
  service.interceptors.response.use(
    (response) => {
      if (
        (response.headers['content-disposition'] ||
          !/^application\/json/.test(response.headers['content-type'])) &&
        response.status === 200
      ) {
        return response
      } else if (response.data.size) {
        response.data.code = 500
        response.data.message = '服务器内部错误'
        response.data.success = false
      } else if (response.data.code && response.data.code !== 200) {
        // 后台为401进行跳转登录
        if (response.data.code === 401) {
          throttle(() => {
            Message.error({
              content: response.data.message || response.data.msg
            })
            tool.local.clear()
            router.push({ name: 'login' })
          })()
        } else {
          // 非401则弹出错误信息,可以自行增加判断业务
          Message.error({
            content: response.data.message || response.data.msg
          })
        }
      }
      return response.data
    },

基于 MIT 许可发布.