这个教程的数据,均来自 https://pvp.qq.com/
在 umi 项目中并没有规定一定要使用某种 http 请求方式,我们可以根据实际项目,选择自己最熟悉和服务端交互最优的 http 请求方式,一般项目中我们比较常用的就是 fetch 和 axios ,这两者的优缺点比较,可以查阅其他资料,但是无论你选择哪一种,在你需要更换成另一种时,只需要修改几行代码,因为它们在使用上,只有一点点参数结构的差异。
preset-react 中内置了 plugin-request 插件,这里我们直接使用。
新建 src/app.ts
umi的运行时配置,都在 src/app.ts 中,我们在这里配置 umi-request 的配置。
export const request = {
prefix: 'https://pvp.qq.com',
};
这里我们配置了所有请求的 prefix
在 model 中发起请求
src/models/hero.ts
import { Effect, Reducer, Subscription,request } from 'umi';
...
*fetch({ type, payload }, { put, call, select }) {
const data = yield request('/web201605/js/herolist.json');
const localData = [
{
ename: 105,
cname: '廉颇',
title: '正义爆轰',
new_type: 0,
hero_type: 3,
skin_name: '正义爆轰|地狱岩魂',
},
{
ename: 106,
cname: '小乔',
title: '恋之微风',
new_type: 0,
hero_type: 2,
skin_name: '恋之微风|万圣前夜|天鹅之梦|纯白花嫁|缤纷独角兽',
},
];
yield put({
type: 'save',
payload: {
heros: data||localData,
},
});
},
这里我们直接请求了王者荣耀官方的接口地址
这时候我们发现页面中并没有取得数据,在我们的代码逻辑中,就算取不到网络数据,也会使用本地数据。这时候我们打开控制台,查看一下网络请求情况。
- step1 首先我们查看了网络请求情况,正确响应200
- step2 查看console,发现打印了一个错误
这个错误在web开发中,特别是前期接口调试的时候,是比较常见的错误,它说明了请求存在跨域访问情况。因为请求发生了错误,所以我们的代码直接就挂了。这里我们可以先处理代码挂掉的问题。
捕获异常
src/app.ts
+ import { ResponseError } from 'umi-request';
export const request = {
prefix: '',
+ errorHandler: (error: ResponseError) => {
+ // 集中处理错误
+ console.log(error);
+ },
};
使用 catch 捕获请求异常。请求不到网络数据,使用了本地的数据。
到这里,我们已经正确发起了一个 http 请求,虽然他没有正确响应,页面中我们也没有取得网络上的数据,但是,它确实是发起了,如果请求的接口不存在跨域问题的话,那么这里就能取到数据了。