前端请求接口post_前端如何优雅地模拟接口请求?(给你的代码加点小意外)

083ca50e48d597adedc604aa615df51c.png

前言:

作为一名前端开发程序猿,每天都被产品经理催着开发,项目一启动,产品就过来了。嘘寒问暖:大胸弟,你啥时开始做啊?一般我们都会直接告诉TA,你先找接口解决数据问题。

而我们也会经常遇见“巧妇难为无米之炊”的难题,难道我们离开后端数据就不能生存啦?最近忙于某个项目,也遇到了这事,那我是怎么去解决的叻?容我娓娓道来。

所谓天才第一步,XXX啥裤。开个玩笑,我们肯定是需要先搞清楚我们想干啥。只有明确了目标,才能减少走弯路。 需求:

  • 模拟发送请求
  • 模拟数据回传
  • 本地开发实现

这三步中,模拟发送请求,这个目标对于我们前端来说,它并不重要,后端是比较看重你给什么参数,我好还你啥数据。

所以我们前端要做好模拟数据回传,这样才能更好的跟后端去约定字段,数据结构相关的。有了数据,我们才能更好的去实现功能开发。

目标分析

模拟数据回传,标准的接口组成,由两部分组成:

  • 数据结果
  • 请求状态

说到这里,我就忍不住的打开了浏览器调试模式。我正大光明的瞄了眼知乎的请求,比如这个接口:

https://www.zhihu.com/api/v4/creator/apply

a682da8fd04ebcc41e35c606442229aa.png

那我们到底本地怎么模拟数据了?

解决问题

到了最后一步,咱们猿类最关心的问题,你说你洋洋洒洒说了一大堆废话,你倒是上代码啊!(我等着ctrl+c, ctrl+v 讷。我不创造代码,我只是代码的搬运工。)

废话就不扯那个淡,首先最直接方法,固定写好。

const result = {creator_status: 1entrance_msg: ""level: 1notification: {apply_pass: 0}status: 2
}

有人说,这个我也会,我还会给他加个 setTimeout 函数,更加像:

setTimeout(() => {this.setState({...result,})
}, 2000)

嘿,突然发现自己是个天才,简直跟接口回调一毛一样。

喂,醒醒....咋能不能有点追求。

哦,是不是嫌数据少了,我再复制几次。

low, 咱能不能对自己要求高一点。

我们应该让数据更加可变,并且还可以模拟异步调用。所以,我们来改造一下。

首先用 js 实现一个概率函数,对,就是那个随机抽奖函数。网上随手找了一个:

random = (targetArr, probArr) => {let sum = 0,factor = 0,random = Math.random();for (let i in probArr) {sum += probArr[i];}random *= sum;for (let i in probArr) {factor += probArr[i];if (random <= factor) {return targetArr[i];}}return null;}

这个简单,不就是把这个随机函数加到数据上去就好啦。

low, 咱能不能再高级点,好歹也是前端高级猿类。

我们可以这样:(还可以刺激地加点错误数据,吃不吃鸡,意不意外,惊不惊喜。翻译翻译,啥叫惊喜,来,咱看一看。)

getResult = () => {return {creator_status: this.random([1, 2, 3, 4], [0.2, 0.2, 0.1, 0.5]),entrance_msg: this.random(['', void 0, '恭喜你中奖啦!', 'null'], [0.4, 0.1, 0.3, 0.2]),level: this.random([1,2], [0.5, 0.5]),notification: this.random([{apply_pass: this.random([0, 1], [0.2, 0.8])}, {}], [0.6, 0.4])}
}fetchData = (size) => {return new Promise((resolve, reject) => {const randTime = Math.random() * 2;const status = this.random([0, 1, 2], [0.2, 0.2, 0.6]);setTimeout(() => {if (status < 2) {reject({status,dataList: [],});} else {resolve({status,dataList: [...Array(size)].map(i => this.getResult()),});}}, randTime * 1000);});
}

这样就大功告成啦!完美收官,看看结果把:

fetchData(5).then(res => console.log(JSON.stringify(res, '', 4))).catch(e => console.warn(e))
// 输出结果
{"dataList": [{"creator_status": 3,"entrance_msg": "null","level": 1,"notification": {"apply_pass": 1}},{"creator_status": 4,"entrance_msg": "","level": 1,"notification": {}},{"creator_status": 1,"entrance_msg": "恭喜你中奖啦!","level": 1,"notification": {}},{"creator_status": 2,"entrance_msg": "null","level": 2,"notification": {}},{"creator_status": 4,"entrance_msg": "恭喜你中奖啦!","level": 2,"notification": {"apply_pass": 1}}],"status": 2
}

写在最后

一定要多跑几次哦。有可能结果是一样的,不要惊讶不要彷徨!多跑几次就会出现其他结果啦!

其实咱也不用这么大费周章,现成的数据模拟就有:EasyMock 等等。只是我只需要前期用用,而且是在内部使用,所以没必要去接入这个,自己就写点数据玩玩而已啦!

欢迎提问和指正错误,我会第一时间和您取得沟通,下期我们再会吧!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/373647.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

cron表达式详解

Cron表达式是一个字符串&#xff0c;字符串以5或6个空格隔开&#xff0c;分为6或7个域&#xff0c;每一个域代表一个含义&#xff0c;Cron有如下两种语法格式&#xff1a; Seconds Minutes Hours DayofMonth Month DayofWeek Year或 Seconds Minutes Hours DayofMonth Month …

将Ehcache添加到Openxava应用程序

介绍 本文介绍如何在Openxava应用程序上快速启用Ehcache&#xff0c;从而提高性能。 查看实体及其图时&#xff0c;将加载关系。 添加第二级缓存可加快关联元素的检索速度&#xff0c;因为已加载的元素是从缓存而不是数据库中检索的。 最终&#xff0c;该页面解释了分钟项目如…

java mongodb 返回所有field_JAVA高级之反射

更多精彩&#xff0c;请点击上方蓝字关注我们&#xff01;今天跟大家分享JAVA高级之反射的知识。一、什么是反射反射就是把Java类中的各个成分映射成一个个的Java对象。即在运行状态中&#xff0c;对于任意一个类&#xff0c;都能够知道这个类的所以属性和方法&#xff1b;对于…

Linux入门笔记——cal、date、free、clear、history、man、whatis、uname

1、cal 显示日历2、date 显示系统当前的日期和时间3、df查看磁盘剩余空间的数量&#xff0c;常用参数 -h &#xff08;human&#xff09;人性化显示内容4、free显示空闲内存的数量&#xff0c;常用参数 -h &#xff08;human&#xff09;人性化显示内容5、clear清除控制终端显示…

使用ASM 4处理Java类文件–第一部分:世界,您好!

什么是ASM &#xff1a;ASM是一个用于处理Java字节码的开源Java库。 因此&#xff0c;它具有与Apache BCEL相同的目的。 由于本文假定读者具有Java类文件格式的某些知识&#xff0c;因此建议在此处进行阅读。 那么它与BCEL有何不同&#xff1f; 首先&#xff0c;它允许使用事件…

(转)C#程序开发中经常遇到的10条实用的代码

原文地址&#xff1a;http://www.cnblogs.com/JamesLi2015/p/3147986.html 1 读取操作系统和CLR的版本 OperatingSystem os System.Environment.OSVersion; Console.WriteLine(“Platform: {0}”, os.Platform); Console.WriteLine(“Service Pack: {0}”, os.ServicePack); …

Ueditor的配置及使用

Ueditor官网&#xff1a;http://ueditor.baidu.com/website/ &#xff08;项目需要JSP版本&#xff1a;UTF-8版&#xff09; 1.配置 <script type"text/javascript" charset"utf-8">window.UEDITOR_HOME_URL "${ctx}/assets/plugins/uedi…

努比亚z17s刷原生安卓_电脑运行手机APP,不会没关系,我推荐你使用显卡服务器运行安卓模拟器...

很多人都想用电脑端运行手机APP&#xff0c;但是又不知道怎么操作。纵横170yun小编推荐大家使用显卡服务器&#xff0c;在显卡服务器上运行安卓模拟器。让你轻轻松松在电脑端运行手机APP&#xff0c;甚至还可以多开噢 。如果你的电脑没有显卡&#xff0c;也没有关系&#xff0c…

Linux入门笔记——系统目录结构

目录 评论 / 根目录&#xff0c;万物起源。 /bin 包含系统启动和运行所必须的二进制程序。 /boot 包含 Linux 内核&#xff0c;最初的 RAM 磁盘映像&#xff08;系统启动时&#xff0c;由驱动程序所需&#xff09;&#xff0c;和 启动加载程序。 有趣的文件&#xff1a; /boot/…

线程故事:关于健壮的线程池

我的主题系列的另一个博客。 这次是关于线程池&#xff0c;尤其是可靠的线程池设置。 在Java中&#xff0c;线程池由Java 5中引入的ThreadPoolExecutor类实现。该类的Javadoc组织得很好。 因此&#xff0c;我不遗余力地在此处进行概述。 基本上&#xff0c; ThreadPoolExecutor…

css缩写

颜色&#xff1a; 16进制的色彩值为六位数&#xff0c;如果每两位的值相同&#xff0c;可以缩写一半。 如&#xff1a;#000000#000&#xff1b; #223344#234&#xff1b; 盒子的尺寸&#xff1a; 如margin:value; 一个值表示所有边&#xff0c;两个值表示上下&#xff0c;左右&…

win10改成ubundu主题_如何将ubuntu引导win10,修改为win10引导ubuntu

、首先用LiveCD进入ubuntu2、打开终端&#xff0c;输入&#xff1a;fdisk -l 查看自己linux的分区情况&#xff0c;我的分了4个区&#xff0c;swap&#xff0c;boot&#xff0c;/&#xff0c;home&#xff0c;对应的分别是&#xff1a;/dev/sda9 swap/dev/sda10 boot/dev/sda11…

Linux入门笔记——文件操作命令1

pwd Print name of current working directory&#xff08;打印出当前工作目录名&#xff09; cd Change directory&#xff08;更改目录&#xff09;例子&#xff1a;cd 更改工作目录到你的家目录&#xff08;和cd ~命令的运行结果是等同的 &#xff09;cd - 更…

使用MJRefresh自定义下拉刷新,上拉加载动画

有时候我们需要自己设置下拉刷新,上拉加载动画的实现,这里主要是记录下使用MJRefresh自定义下拉刷新,上拉加载动画..... 下拉刷新我们只需要继承MJRefreshGifHeader即可: 实现代码如下: - (void)prepare{[super prepare];self.stateLabel.hidden NO;self.lastUpdatedTimeLabel…

2.mybatis入门实例 连接数据库进行查询

1.新建项目&#xff0c;添加mybatis和mysql的jar包 2.在mysql中新建表user[id,name,age] CREATE TABLE users (id int(11) NOT NULL auto_increment,NAME varchar(50) default NULL,age int(11) default NULL,PRIMARY KEY (id)) ENGINEInnoDB DEFAULT CHARSETutf8 3.新建User类…

使用JacpFX和JavaFX2构建富客户端

创建快速且可扩展的桌面客户端始终是一个挑战&#xff0c;特别是在处理大量数据和长时间运行的任务时。 尽管Eclipse RCP和Netbeans RCP是已建立的平台&#xff0c;但其想法是建立一个轻量级的框架来异步处理组件&#xff0c;类似于Web组件。 开发人员在线程主题上的工作应较少…

lob移表空间 oracle_Oracle数据库(1)Oracle体系结构概述(一)

Oracle数据库的体系结构主要包括&#xff1a;物理存储结构、逻辑存储结构、内存结构和实例进程结构。了解了Oracle的体系结构&#xff0c;就可以对Oracle数据库有一个整体认识&#xff0c;这样有利于后续Oracle的学习。下面我们分别来了解逻辑存储结构、物理存储结构、内存结构…

Linux入门笔记——文件操作命令2

cp Copy files and directories&#xff08;复制文件和目录&#xff09; cp 选项&#xff1a; 选项 意义 -a, --archive 复制文件和目录&#xff0c;以及它们的属性&#xff0c;包括所有权和权限。 通常&#xff0c;复本具有用户所操作文件的默认属性。 -i, --interactive 在…

java 对象的上转型对象(父类)

Example5_10.java class 类人猿 {void crySpeak(String s) {System.out.println(s); } } class People extends 类人猿 {void computer(int a,int b) { int ca*b;System.out.println(c); }void crySpeak(String s) {System.out.println("***"s"***"); }…

EnglishLeaning

今天看了些hadoop官方reference感觉自己词汇量和语法真是又回到解放前了。于是&#xff0c;痛下决心要好好学习英语。找到了一些学习的方法&#xff0c;自己记录下来&#xff0c;也和大家一起借鉴 努力目标&#xff1a; 掌握大量的计算机英语术语和缩略语&#xff1b;熟练掌握计…