Vue 项目 API 接口封装2

简介: Vue 项目 API 接口封装2

六、API 接口封装

最后一步,对于 API 接口封装,我们使用面向对象的方式组织数据。

6.1 文件结构划分

在 src 目录下新建 api 目录,然后根据后端 API 接口文档划分模块:

src/api // api interface files
  |_ user // 用户模块
    |_ index.js
  |_ goods // 货物模块
    |_ index.js
  |_ carts // 购物车模块
    |_ index.js
  |_ index.js

6.2 按模块编写

货物模块为例,路径为:src/api/goods/index.js

import axios from '@/utils/request' // axios 实例引入(第五节封装的)
const goods = {
    // 1. 获取所有货物信息
    getGoods: () => axios({
      url: '/api/product1/v1/goods',
      method: 'get'
    }),
    // 2. 获取某条货物信息
    getGoodsById: (id) => axios({
      url: `/api/product1/v1/goods/${id}`,
      method: 'get'
    }),
    // 3. 新增一条货物信息
    addGoods: (data) => axios({
      url: '/api/product1/v1/goods',
      method: 'post',
      data
    }),
    // 4. 删除某条货物信息
    deleteGoodsById: (id) => axios({
      url: `/api/product1/v1/goods/${id}`,
      method: 'delete'
    }),
    // 5. 更新某条货物信息
    // put 与 patch 的区别:put 所有字段均要传递;patch 可选字段传递,不用全部传
    updateGoodsById: (id, data) => axios({
      url: `/api/product1/v1/goods/${id}`,
      method: 'put',
      data
    }),
    // 6. 下载货物报表
    downloadGoodsReport: (data) => axios({
      url: `/api/product1/v1/goods/report`,
      method: 'post',
      data,
      responseType: 'blob' // browser only: 'blob'
    }),
    // 7. 上传货物报表
    uploadGoodsReport: (data) => axios({
      url: `/api/product1/v1/goods/up_report`,
      method: 'post',
      data,
      headers:{"Content-Type": "multipart/form-data"}
    })
}
export default goods

以上,展示了常用的请求形式,包括:GET, POST, PUT/PATCH, DELETE

补充几点:

  • url = base url + request url,其中 base url 就是在 5.1 节中,axios 实例上的 baseURL: process.env.VUE_APP_BASE_URL
  • 第五条更新数据,用了 PUT,其实还有一个类似的 PATCH,他们的区别在上面已经给了注释。PUT 和 PATCH 的区别:stackoverflow.com/questions/2…
  • 发送 POST 请求使用 data ,而发送 GET 请求时,可能需要带上 url 参数,这时候就要用到 params 了。
    举个请求购物车分页数据的例子:http://xxx.yyy.zzz:3000/api/product1/v1/carts?page=1&size=-1
// src/api/carts/index.js
import axios from '@/utils/request'
const carts = {
    // ...
    // 获取购物车信息
    getCarts: (params) => axios({
        url: '/api/product1/v1/carts',
        method: 'get',
        params
    })
}
export default carts

有时候我们还会看到,在发送 POST 请求时,有人会使用 qs ,它的作用是序列化 JSON 格式数据为 urlencoded 格式的字符串。

原因是后端语言处理 JSON 格式的数据比较麻烦,例如 Go 语言的 Gin 框架,传递给它 {Country: Brasil, City: Belo Horizonte} ,为了安全起见,需要开发人员据此单独做结构体,而传递 'Country=Brasil&City=Belo Horizonte' 这样的字符串则更为合适。

这里改写一下货物模块中的第三个 POST 请求,记得首先要引入 qs 模块:

import axios from '@/utils/request'
+ import qs from 'qs' 
const goods = {
    // ...
    // 3. 新增一条货物信息
    addGoods: (data) => axios({
        url: '/api/product1/v1/goods',
        method: 'post',
        data: qs.stringify(data)
    }),
    // ...
}
export default goods
  • 关于urlencoded可以查看以下三篇参考:
  • axios-http.com/docs/urlenc…
  • stackoverflow.com/questions/4…
  • developer.mozilla.org/zh-CN/docs/…

6.3 导出 API 对象

当写完各个模块的 api 请求接口后,就需要导出了。回到第二节的构思,我们想要通过 this.$api.moduleName.methodName(…args) 的形式调用方法发起请求。

进入 src/api/index.js

import user from './user'
import goods from './goods'
import carts from './carts'
// ...
class API {
    constructor () {
        this.user = user
        this.goods = goods
        this.carts = carts
        // ...
    }
}
// 导出使用
export default new API()

6.4 小试牛刀

将 API 实例导出之后,将它挂载到 Vue 原型上,就能正常使用了。

// src/main.js
import API from './api'
Vue.prototype.$api = API
// Test.vue
<template>
    <button @click="handleData">test request</button>
</template>
<script>
export default {
    name: 'Test',
    data () {
        return {
            tableData: []
        }
    },
    methods: {
        fetchData () {
            return this.$api.goods.getGoods()
        },
        async handleData () {
            try {
                const response = await this.fetchData()
                // ...
            } catch (e) {
                console.error(e)
            }
        }
    }
}
</script>

6.5 冗余问题的解决

以上,其实还有一个问题尚未解决,就是每一个请求 api 的 url 里的 /api/product1/v1 都是重复的,这个容易,把它分离出去变成一个模块,自定义 url 前缀。

src/api/url_prefixes.js

function generatePrefix ({productName, version} = {productName: 'product1', version: 'v1'}) {
    return `/api/${productName}/${version}`
}
export const v1 = generatePrefix() // '/api/product1/v1'
export const v2 = generatePrefix({version: 'v2'}) // '/api/product1/v2'
export const p2v2 = generatePrefix({productName: 'product2', version: 'v2'}) // '/api/product2/v2'

从上面可以看到,除了接口版本可能会发生变化,产品名称也是有可能发生变化的,我们也用变量控制。之后,在各模块的 api 文件中就可以用使用变量来控制 url 前缀部分了。

例如改写货物模块的 api url 前缀:

import axios from '@/utils/request' // axios 实例引入(第五节封装的)
import { v1 } from '../**url_prefixes**.js' // 引入前缀:**'/api/product1/v1'**
const goods = {
    // 1. 获取所有货物信息
    getGoods: () => axios({
      url: `${v1}/v1/goods`,
      method: 'get'
    }),
    // 2. 获取某条货物信息
    getGoodsById: (id) => axios({
      url: `${v1}/goods/${id}`,
      method: 'get'
    }),
    // 3. 新增一条货物信息
    addGoods: (data) => axios({
      url: `${v1}/v1/goods`,
      method: 'post',
      data
    }),
    // ...
}
export default goods

至此,三个关键问题都已经得到了解决:

  • 永久性变量冗余
  • 高强度心智负担
  • 模块过于扁平化


七、总结

请求的 API 封装到此就结束了,除了以上这种面向对象的设计以外,还有其他的方式。最后,整理一下封装的整体流程:

  1. 请求 API 结构设计,this.$api.moduleName.methodName(…args)
  2. 脚手架模式与环境变量设置
  3. Axios 封装(包括实例配置和拦截器),导出实例
  4. 请求 API 编写及导出,注意分模块编写
  5. 将 API 挂载到 Vue 实例,正常使用

文章里,我添加了很多参考链接,如有疑惑可以看一看,看完如果仍然有疑惑,那就找人讨论吧,之后这一块内容你应该就可以掌握了。



目录
相关文章
|
2天前
|
人工智能 JavaScript 安全
【01】Java+若依+vue.js技术栈实现钱包积分管理系统项目-商业级电玩城积分系统商业项目实战-需求改为思维导图-设计数据库-确定基础架构和设计-优雅草卓伊凡商业项目实战
【01】Java+若依+vue.js技术栈实现钱包积分管理系统项目-商业级电玩城积分系统商业项目实战-需求改为思维导图-设计数据库-确定基础架构和设计-优雅草卓伊凡商业项目实战
38 13
【01】Java+若依+vue.js技术栈实现钱包积分管理系统项目-商业级电玩城积分系统商业项目实战-需求改为思维导图-设计数据库-确定基础架构和设计-优雅草卓伊凡商业项目实战
|
1天前
|
JSON 监控 API
唯品会商品详情接口(唯品会 API 系列)
唯品会商品详情接口助力电商发展,提供商品名称、价格、规格等详细信息,支持HTTP GET/POST请求,响应为JSON格式。开发者可通过API Key和商品ID获取数据,应用于电商数据分析、竞品调研、应用开发及价格监控,提升业务效率与竞争力。示例代码展示Python调用方法,方便快捷。
|
1天前
|
监控 JavaScript 前端开发
ry-vue-flowable-xg:震撼来袭!这款基于 Vue 和 Flowable 的企业级工程项目管理项目,你绝不能错过
基于 Vue 和 Flowable 的企业级工程项目管理平台,免费开源且高度定制化。它覆盖投标管理、进度控制、财务核算等全流程需求,提供流程设计、部署、监控和任务管理等功能,适用于企业办公、生产制造、金融服务等多个场景,助力企业提升效率与竞争力。
34 12
|
2天前
|
JSON API 数据格式
微店商品列表接口(微店 API 系列)
微店商品列表接口是微店API系列的一部分,帮助开发者获取店铺中的商品信息。首先需注册微店开发者账号并完成实名认证,选择合适的开发工具如PyCharm或VS Code,并确保熟悉HTTP协议和JSON格式。该接口支持GET/POST请求,主要参数包括店铺ID、页码、每页数量和商品状态等。响应数据为JSON格式,包含商品详细信息及状态码。Python示例代码展示了如何调用此接口。应用场景包括商品管理系统集成、数据分析、多平台数据同步及商品展示推广。
|
11天前
|
搜索推荐 数据挖掘 API
微店商品详情接口(微店API系列)
微店商品详情接口是微店API的重要组成部分,帮助开发者和商家获取商品的详细信息(如标题、价格、库存等),并将其集成到应用程序或数据分析系统中。该接口支持HTTP GET/POST请求,返回JSON/XML格式数据,需通过AppKey和AppSecret进行身份验证和签名加密。应用场景包括商品信息同步、数据分析与市场调研、个性化推荐系统等,助力商业决策和业务拓展。
37 13
|
13天前
|
供应链 数据挖掘 API
1688app 商品详情接口系列(1688API)
1688作为国内知名批发采购平台,提供了一系列商品详情接口(API),助力企业和开发者获取商品基础、价格、库存及供应商信息。通过Python示例代码展示如何调用这些接口,应用场景涵盖采购决策辅助、数据分析与市场调研、电商平台整合及供应链管理系统的优化,为企业和采购商提供有力的数据支持,提升业务效率和竞争力。
60 15
|
20天前
|
JSON 搜索推荐 API
京东店铺所有商品接口系列(京东 API)
本文介绍如何使用Python调用京东API获取店铺商品信息。前期需搭建Python环境,安装`requests`库并熟悉`json`库的使用。接口采用POST请求,参数包括`app_key`、`method`、`timestamp`、`v`、`sign`和业务参数`360buy_param_json`。通过示例代码展示如何生成签名并发送请求。应用场景涵盖店铺管理、竞品分析、数据统计及商品推荐系统,帮助商家优化运营和提升竞争力。
65 23
|
12天前
|
JSON 数据挖掘 开发者
1688 商品评论接口系列(1688API)
1688商品评论接口助力电商数据分析与优化。通过该接口,开发者可获取指定商品的评论数据(如昵称、内容、评分等),支持情感分析和质量反馈收集。接口采用HTTP GET/POST请求,返回JSON格式数据。Python示例代码展示如何调用接口并处理响应。应用场景包括商家产品优化、客户服务提升、市场调研及电商平台数据分析。
|
12天前
|
供应链 数据挖掘 BI
1688 买家订单,订单物流,订单回传接口系列(1688 寻源通 API)
1688作为国内领先的批发采购平台,提供了买家订单、订单物流及订单回传三大API接口,助力企业实现订单管理、物流跟踪和信息反馈的自动化。通过这些接口,企业可以获取订单详情、物流状态,并将处理结果回传至平台,提升运营效率。Python示例代码展示了如何使用这些接口进行数据交互,适用于电商内部管理、物流跟踪及数据分析等场景。
|
19天前
|
JSON 缓存 API
解析电商商品详情API接口系列,json数据示例参考
电商商品详情API接口是电商平台的重要组成部分,提供了商品的详细信息,支持用户进行商品浏览和购买决策。通过合理的API设计和优化,可以提升系统性能和用户体验。希望本文的解析和示例能够为开发者提供参考,帮助构建高效、可靠的电商系统。
35 12