预想的问题
- 在实际项目开发中,我们经常会遇到和服务端同步开发的情况。
这时候我们就可以要求服务端先输出接口文档,前后端都根据接口文档输出。
在项目交付之前一段时间,再进行前后端连调。
- 在demo开发学习的过程中,我们也常常遇到需要静态数据的情况
- 公司网络限制了只能访问部分外网,是的,墙里墙,还是满多的
- 没有网络的情况,呵呵,想到咖啡店敲个代码,悠哉悠哉,没有公用Wi-Fi,接口都挂了,页面渲染不出来
umi 中使用 mock
在 umi 中使用 mock 还是蛮简单的,任何配置都不需要,只要在 ./mock/
文件夹下,新建 js 文件,然后按照规范编写文档,就可以使用 mock 功能了。
在page下,定义_mock.js也可以使用mock功能。如./src/pages/index/_mock.js
这里有一个最简单的实现:
mock/heros.ts
export default {
'/api/web201605/js/herolist.json': [
{
ename: 106,
cname: '小乔',
title: '恋之微风',
new_type: 0,
hero_type: 2,
skin_name: '恋之微风|万圣前夜|天鹅之梦|纯白花嫁|缤纷独角兽',
},
],
};
只要请求路径匹配,那么就会直接返回数组。我们先关闭 .umirc.js
中的 proxy 配置,先注释掉就好。
// "proxy": {
// "/api": {
// "target": "https://pvp.qq.com",
// "changeOrigin": true,
// "pathRewrite": { "^/api" : "" }
// }
// }
然后开启开发服务器
我们写在model里面的静态文件是有两个英雄的,使用proxy代理,从官方取得是有几十个英雄的,从mock里面取的是一个英雄的数据。
保存接口数据
我们把 https://pvp.qq.com/web201605/js/herolist.json
请求的数据,保存下来,作为我们的本地数据,存放到 ./mock/herolist.json
其实你可以放到任意的地方,放在这里面也不会被解析成mock服务,只是就近放在一起而已,因为这个数据很大,放到 ./mock/heros.js
里面的话会让文件变得很长,不利于我们看代码。
然后在 ./mock/heros.js
中引入herolist.json ,修改一下请求的返回值,这样我们的mock数据就和官方接口返回值保持一致啦。
import herolist from './herolist.json';
export default {
'/api/herolist.json': herolist
};
在开发过程中,服务端启用临时服务器,返回出参,可以通过这种不规范不推荐的方式保留下来。在服务器不可以的情况下,我们还可以进行前端的开发工作
还有一种比较常用的方式是需要取得请求携带的参数。
mock请求携带参数
比如我们需要取得单个英雄的数据,我们就需要在请求里面携带参数。
./mock/heros.ts
'POST /api/herodetails.json': (req, res) => {
const { ename } = req.body;
const hero = herolist.filter(item => item.ename === parseInt(ename, 10))[0];
res.send(hero);
},
定义了这个请求是 post 请求,并从请求参数中取出来 ename 对原数组做了过滤。
然后在 ./src/models/hero.ts 中修改请求。
const data = yield request('/api/herodetails.json', {
method: 'POST',
body: {
ename: 110,
},
});
请求携带了参数 body,但是,到后端取不到数据。
mock post 取不到参数
这里需要注意,我们需要为请求增加请求头,还有 body ,需要转成字符串。
最后我们发起的请求就是
const data = yield request('/api/herodetails.json', {
method: 'POST',
headers: {
Accept: 'application/json',
'Content-Type': 'application/json; charset=utf-8',
},
body: JSON.stringify({
ename: 110,
}),
});
这两种写法是比较简单常用的,更多的 mock 推荐用法,可以查阅 umi 官网 mock-data 。