Skip to content

十一.Mock 数据

前言

前后端同时开发的时候,后端接口数据没有出来,前端可以 mock 假数据,模拟开发,无需等待后的开发完成

  • 接口规范(成功,失败,状态码,安全) 和后端约定

  • Postman 一款非常流行的 API 调试工具,通过工具可以更好地测试接口。安装后相关功能展示如下

1. 本地请求

1.1 mock数据

在 public 下建立文件,/mock/user/login.json

json
{
  "status": 0,
  "data": {
    "xxx": 123
  },
  "msg": "success"
}

1.2 mock请求

App.vue:

js
//本地加载请求静态json文件的形式
this.$axios.get("/mock/user/login.json").then((res) => {
  this.res = res
})

这种方式简单方便,但是缺点很明显,mock数据写死了,每次请求都是相同的内容,无法应对复杂的场景

2. 第三方平台

2.1 mock数据

在第三方平台上写好相关接口和数据

2.2 mock请求

app.vue

js
//使用mock 网站做模拟接口,注意解决跨域问题(可以降级浏览器解决)
this.$axios.get("/user/login").then((res) => {
  this.res = res
})

main.js:

js
axios.defaults.baseURL = 'mock 网站生成项目 mock 数据地址' //用未来实际地址替换
...
axios.get('/user/login').then( res => {})

3. webpack 方式

3.1 mock数据

在 public 下建立文件,/mock/user/login.json

json
{
  "status": 0,
  "data": {
    "xxx": 123
  },
  "msg": "success"
}

/mock/http.js

js
module.export = function http(app) {
  app.get("/mock/user/login.json", (req, res) => {
    if(xxx){
      ....
      res.json({ data: "" })
    }
  })
}

vue.config.js

js
const httpRequest = require('./mock/http')
...
devServer:{
  before(app) { 
    httpRequest(app) // 调用 mock 函数,由于webpack可以读写文件,可以对/mock/user/login.json进行读写操作,用户提交的post请求,可以保存数据
  }
}
...

2.2 mock请求

App.vue:

js
//本地加载请求静态json文件的形式
this.$axios.get("/mock/user/login.json").then((res) => {
  this.res = res
})

4.第三方接口

4.1 聚合数据

聚合数据(https://www.juhe.cn/docs)是国内领先的基础数据服务商, 以自有数据为基础,各种便捷服务整合以及第三方数据接入,为互联网开发全行业提供标准化 API 技术支撑服务的 DaaS 平台。

  • 案例(历史上的今天)

::: demo

vue
<template>
  <div>
    <p>今天日期: {{ value }}</p>
    <button class="btn" @click="getHistoryData">点击查看</button>
    <ul class="content">
      <li v-for="(item, index) in list" :key="index" :list="list">
        <p style="color:#409eff;">{{ item.title }}</p>
      </li>
    </ul>
  </div>
</template>
<script>
export default {
  data() {
    return {
      value: new Date().toLocaleString(),
      list: [
        {
          day: "1\/1",
          date: "-45年1月1日",
          title: "罗马共和国开始使用儒略历",
          e_id: "1",
        },
        {
          day: "1\/1",
          date: "404年1月1日",
          title: "东晋将领桓玄正式称帝,国号楚",
          e_id: "2",
        },
        {
          day: "1\/1",
          date: "860年1月1日",
          title: "西法兰克国王厄德一世诞生",
          e_id: "3",
        },
      ],
    }
  },
  methods: {
    // 注意:接口存在跨域,需要后端先拿到数据然后传给前端
    getHistoryData() {
      let date = this.value.toLocaleString().split(" ")[0].split("/"),
        key = "cd32de53098100d56ae1b7a25306ddd3"
      console.log(date)
      this.list = []
      fetch(
        `https://v.juhe.cn/todayOnhistory/queryEvent.php?key=${key}&date=${date[1]}/${date[2]}`,
        {
          method: "GET",
        }
      ).then(
        (response) => {
          if (!response.error_code) {
            response.result.map((e) => {
              this.list.push({
                title: e.title,
                desc: e.des,
                src: e.pic,
              })
            })
          }
        },
        (error) => {
          //处理错误
        }
      )
    },
  },
}
</script>

:::

  • 案例(ip 地址查询)

::: demo

vue
<template>
  <div>
    ip:<input v-model="value" />
    <button class="btn" @click="getIpData">点击查看</button>
    <p>
      地址:{{ res.Country }}-{{ res.Province }}-{{ res.City }}-{{
        res.District
      }}
      类型:{{ res.Isp }}
    </p>
  </div>
</template>
<script>
export default {
  data() {
    return {
      value: "120.235.95.64",
      res: {
        Country: "中国",
        Province: "广东",
        City: "佛山",
        District: "三水区",
        Isp: "移动",
      },
    }
  },
  methods: {
    // 注意:接口存在跨域,需要后端先拿到数据然后传给前端
    getIpData() {
      let key = "d0ad7563a875b7459410d4da2c5b678f"
      this.list = []
      fetch(`https://apis.juhe.cn/ip/ipNewV3?key=${key}&ip=${this.value}`, {
        method: "GET",
      }).then(
        (response) => {
          if (!response.error_code) {
            this.res = response.result
          }
        },
        (error) => {
          //处理错误
        }
      )
    },
  },
}
</script>
<style>
  .btn{
background-color:#409eff;
font-size:16px;
  }
  .content{
max-height:100px;
overflow-y:auto
  }
</style>

:::

  • 案例(今日国内油价查询)

::: demo

vue
<template>
  <div>
    <button class="btn" @click="getIpData">点击查看</button>
    <ul class="content">
      <li v-for="(item, index) in list" :key="index" :list="list">
        <p style="color:#409eff;">{{ item.city }}:{{ item.b0 }}元</p>
      </li>
    </ul>
  </div>
</template>
<script>
export default {
  data() {
    return {
      list: [
        {
          city: "河北",
          b90: "-",
          b93: "",
          b97: "",
          b0: "8.15",
          "92h": "8.46",
          "95h": "8.94",
          "98h": "9.76",
          "0h": "8.15",
        },
        {
          city: "天津",
          b90: "-",
          b93: "",
          b97: "",
          b0: "8.15",
          "92h": "8.46",
          "95h": "8.94",
          "98h": "0.00",
          "0h": "8.15",
        },
        {
          city: "山西",
          b90: "-",
          b93: "",
          b97: "",
          b0: "8.22",
          "92h": "8.40",
          "95h": "9.07",
          "98h": "9.77",
          "0h": "8.22",
        },
      ],
    }
  },
  methods: {
    // 注意:接口存在跨域,需要后端先拿到数据然后传给前端
    getIpData() {
      let key = "22044931eb3973d36300331491b0546f"
      this.list = []
      fetch(`https://apis.juhe.cn/cnoil/oil_city?key=${key}`, {
        method: "GET",
      }).then(
        (response) => {
          if (!response.error_code) {
            response.result.map((e) => {
              this.list.push({
                title: e.title,
                desc: e.des,
                src: e.pic,
              })
            })
          }
        },
        (error) => {
          //处理错误
        }
      )
    },
  },
}
</script>

:::

4.2 其他第三方接口

除了整合型的第三方接口聚合数据外,其他比较实用的第三方接口还有:

总结

通过对 mock 数据的了解,可以在以后项目开发中与后端并行开发项目,实现快速迭代需求的目的