接口配置

为什么

在使用了redux或者dva项目中,我们经常会写类似下面的service层的函数,使代码结构更清晰,但是很容易看出,我们会写很多相似的代码,在antd-admin@5.0中,使用了更加简洁的配置方式实现了相同的功能。

  1. export async function login(data) {
  2. return request({
  3. url: '/api/v1/user/login',
  4. method: 'post',
  5. data,
  6. })
  7. }

配置和使用

src/services/api.js文件中,你会看到如下配置对象,对象的键用于调用时的函数名称,对象的值为请求的url,默认请求方式为GET,如果是其他请求方式对象的值的格式则为'method url'

  1. export default {
  2. ...
  3. queryUser: '/user/:id',
  4. queryUserList: '/users',
  5. updateUser: 'Patch /user/:id',
  6. createUser: 'POST /user/:id',
  7. removeUser: 'DELETE /user/:id',
  8. removeUserList: 'POST /users/delete',
  9. ...
  10. }

在其他文件中使用

  1. import { queryUser } from 'api'
  2. // 一般文件中
  3. ...
  4. queryUser(option).then(data => console.log(data))
  5. ...
  6. // model文件中
  7. ...
  8. yield call(queryUser, option)
  9. ...

实现方式

参考src/services/index.js文件,对api配置进行遍历,每个属性都返回对应的封装后的request函数。

  1. import request from 'utils/request'
  2. import { apiPrefix } from 'utils/config'
  3. import api from './api'
  4. const gen = params => {
  5. let url = apiPrefix + params
  6. let method = 'GET'
  7. const paramsArray = params.split(' ')
  8. if (paramsArray.length === 2) {
  9. method = paramsArray[0]
  10. url = apiPrefix + paramsArray[1]
  11. }
  12. return function(data) {
  13. return request({
  14. url,
  15. data,
  16. method,
  17. })
  18. }
  19. }
  20. const APIFunction = {}
  21. for (const key in api) {
  22. APIFunction[key] = gen(api[key])
  23. }
  24. module.exports = APIFunction