react中前端同学如何模拟使用后端接口操作数据?

为什么前端同学需要模拟后端数据

作为一个前端,在实现项目功能的时候,需要在前端写一个静态的json数据,进行测试。

项目中后端的接口往往是较晚才会出来,并且还要写接口文档,于是我们的前端的许多开发都要等到接口给我们才能进行开发。

为了方便前端代码自测,提高开发效率,可以模拟生成数据进行前后端数据联调。

而且有的时候,还需要涉及到全模拟请求以及请求回来的过程,实现动态增删改查。

这个时候就需要使用到web的API接口神器json-server。

json-server文档:https://www.npmjs.com/package/json-server

之前介绍过如何利用json-server搭建模拟后端服务器

json-server 是一个 Node 模块,运行 Express 服务器,你可以指定一个 json 文件作为 api 的数据源。
json-server 可> 以直接把一个json文件托管成一个具备全RESTful风格的API。

公众号:前端爱好者

有了它,前端同学终于可以硬气的干活了。。。

为什么选择json-server

之前是采用easy-mock,遗憾的是其只能使用 get 请求。

json server 作为工具

  • 足够简单,
  • 写少量数据,
  • 支持CORS和JSONP跨域请求,
  • 支持GET, POST, PUT, PATCH 和 DELETE 方法,
  • 更提供了一系列的查询方法,分页,排序等操作,简直强大

也不用等到后端开发同事接口写好了之后再去对接接口了。

只需要借助json-server这个神器可以完美模拟业务。

使用json-server进行增删改查操作

前期准备 – 封装fetch

Fetch API 提供了一个 JavaScript 接口,用于访问和操纵 HTTP 管道的一些具体部分,例如请求和响应。

它还提供了一个全局 fetch() 方法,该方法提供了一种简单,合理的方式来跨网络异步获取资源。

这种功能以前是使用 XMLHttpRequest 实现的。

前端老兵,公众号:前端爱好者

react开发利器 之 fetch请求封装

使用json-server进行增删改查操作

json-server 可以用于模拟请求 ----Restful风格

  • 查询 get params:{}
  • 增加 post data:{}
  • 删除 delete
  • 修改 put /patch data:{}

公共暴露API接口文件 – api.js

// api.js

import requestFun from "./fetchUtil"; //引入
import qs from "qs";

const { stringify } = qs;
const { post, get, deleteMethod,patch} = requestFun;

其中fetchUtil.js为封装的Fetch请求

查询 get params:{}

// api.js 
// 简单查询
export async function fetchGetRoles(id,params) { 
  return get(`http://localhost:8001/roles`, params);
}

// 联表查询
export async function fetchGetMenus(params) {
  return get(`http://localhost:8001/rights?_embed=children`, params);
}

组件中使用

import {  fetchGetRoles, fetchGetMenus} from "../../utils/api"; // 引入api文件

// 简单查询
const fetchGetRolesListHandle = async () => {
    const urseListData = await fetchGetRoles();
    serolesList(urseListData);
};
fetchGetRolesListHandle();

const fetchGetRolesListHandle = async () => {
    const menusListData = await fetchGetMenus(); 
};

增加 post data:{}

// api.js 
// post方式
export async function fetchAddUser(params) {
  return post(`http://localhost:8001/users`, params);
}

组件中使用

import {  fetchAddUser } from "../../utils/api"; // 引入api文件

// 调用接口
const data = await fetchAddUser({
    ...values, // 注意这里
    roleState: true,
    default: false,
}); 

删除 delete

// api.js 

// delete 方式 
export async function fetchDeleteRoles(id) { 
    return deleteMethod(`http://localhost:8001/roles/${id}`);
}

组件中使用

import {  deleteMethod } from "../../utils/api"; // 引入api文件

// 调用接口
const deleteRolesMethod = async (item) => { 
  const data = await fetchDeleteUser(item.id);
};

修改 put /patch data:{}

// api.js 
// patch
export async function fetchPatchUser(id,params) { 
  return patch(`http://localhost:8001/users/${id}`, params);
}

组件中使用

import {  fetchPatchUser } from "../../utils/api"; // 引入api文件

// 状态修改
const handelChange = async (item) => { 
  // 发送请求到后端
  await fetchPatchUser(item.id, { roleState: item.roleState });
};

全部代码

// api.js

import requestFun from "./fetchUtil"; //引入
import qs from "qs";

const { stringify } = qs;
const { post, get, deleteMethod,patch} = requestFun;


// 简单查询
export async function fetchGetRoles(id,params) { 
  return get(`http://localhost:8001/roles`, params);
}

// 联表查询
export async function fetchGetMenus(params) {
  return get(`http://localhost:8001/rights?_embed=children`, params);
}

// 复杂查询
export async function fetchGetAuditNewsList(params) { 
  return get(`http://localhost:8001/news?author=${params.author}&auditState_ne=${params.auditState}&publishState_lte=${params.publishState}&_expand=category`);
}

// post方式
export async function fetchAddUser(params) {
  return post(`http://localhost:8001/users`, params);
}

// delete 方式 
export async function fetchDeleteRoles(id) { 
    return deleteMethod(`http://localhost:8001/roles/${id}`);
}

// patch
export async function fetchPatchUser(id,params) { 
  return patch(`http://localhost:8001/users/${id}`, params);
}

其实,文件中http://localhost:8001完全可以使用代理转发,这里暂不赘述。

补充 put和patch的区别

put和patch都可以进行修改操作

区别

  • put 方式如果没有将所有属性都写完整 没写的属性会丢失
  • patch方式没修改的属性不写默认为之前的值

举例:

{id:1,name:"zs",age:18}

修改age=20

put:{id:1,age:20}
patch:{id:1,name:"zs",age:20} 

json-server 高级用法

Filter

使用.操作 对象属性值,比如访问更深层次的属性

GET /posts?title=json-server&author=typicode
GET /posts?id=1&id=2
GET /comments?author.name=typicode

Paginate

使用 _page 和可选的 _limit来对返回数据定制(不设置默认返回10条)。

在返回的Response Headers 中,有一个属性Link,里面会有first, prev, next and last links

GET /posts?_page=7
GET /posts?_page=7&_limit=20

10 items are returned by default

Sort

使用 _sort_order (默认是ascending)

GET /posts?_sort=views&_order=asc
GET /posts/1/comments?_sort=votes&_order=asc

对于多字段的排序, 可以这样

GET /posts?_sort=user,views&_order=desc,asc

Slice

使用 _start _end 或者 _limit (an X-Total-Count header is included in the response)

GET /posts?_start=20&_end=30
GET /posts/1/comments?_start=20&_end=30
GET /posts/1/comments?_start=20&_limit=10

Works exactly as Array.slice (i.e. _start is inclusive and _end exclusive)

Operators

使用 _gte_lte 选取一个范围

GET /posts?views_gte=10&views_lte=20

使用 _ne 排除一个值

GET /posts?id_ne=1

使用 _like 进行模糊查找 (支持正则表达式)

GET /posts?title_like=server

Full-text search (全文检索)

使用 q,在对象全部value中遍历查找包含指定值的数据

GET /posts?q=internet

Relationships (关系图谱)

获取包含下级资源的数据, 使用 _embed

GET /posts?_embed=comments
GET /posts/1?_embed=comments

获取包含上级资源的数据, 使用 _expand

GET /comments?_expand=post
GET /comments/1?_expand=post

To get or create nested resources (by default one level, add custom routes for more)

GET  /posts/1/comments
POST /posts/1/comments

Database

GET /db

Homepage

Returns default index file or serves ./public directory

GET /

json-server github地址 : https://github.com/typicode/json-server

参考文档

  • https://gitcode.net/mirrors/typicode/json-server
  • https://www.npmjs.com/package/json-server

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于ArcGIS Pro、R、INVEST等多技术融合下生态系统服务权衡与协同动态分析

生态系统服务是指生态系统所形成的用于维持人类赖以生存和发展的自然环境条件与效用,是人类直接或间接从生态系统中得到的各种惠益。联合国千年生态系统评估(Millennium ecosystem assessment,MA)提出生态系统服务包括供给、调节、…

[pgrx开发postgresql数据库扩展]4.基本计算函数的编写与性能对比

前言 再次声明: 并不是所有场景都需要(或者适合)用rust来写的,绝大部分操作数据库的功能和计算,用SQL就已经足够了! 本系列中,所有的案例,仅用于说明pgrx的能力,而并非…

Docker --- 简介、安装

一、什么是Docker 微服务虽然具备各种各样的优势,但服务的拆分通用给部署带来了很大的麻烦。 分布式系统中,依赖的组件非常多,不同组件之间部署时往往会产生一些冲突。 在数百上千台服务中重复部署,环境不一定一致,会…

基于Java+SpringBoot+vue学生学习平台详细设计实现

基于JavaSpringBootvue学生学习平台详细设计实现 博主介绍:5年java开发经验,专注Java开发、定制、远程、指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 Java项目精品实战案例《500套》 欢迎点赞 收藏 ⭐留言 文末获取源码联系方式 文章目…

用SQL语句操作Oracle数据库——数据更新

数据更新 数据库中的数据更新操作有3种:1)向表中添加若干行数据(增);2)删除表中的若干行数据(删);3)修改表中的数据(改)。对于这3种操作&#xf…

seleniumUI自动化登录失败案例重新尝试WhileTrue

一个用户每次登录失败,失败N次,无法进入下一url时,怎样会重新尝试N次重新登录呢 ? 我们可以使用wihile true判断,并使用currenturl判断,下面就介绍以下个人的方法 currenturlEGTconfigFile.driver.curren…

学系统集成项目管理工程师(中项)系列11b_沟通管理(下)

1. 沟通过程的有效性 1.1. 效果 1.1.1. 在适当的时间、适当的方式、信息被准确的发送给适当的沟通参与方(信息的接收方),并且能够被正确的理解,最终参与方能够正确的采取行动 1.2. 效率 1.2.1. 强调的是及时提供所需的信息 2…

深度学习 - 43.SeNET、Bilinear Interaction 实现特征交叉 By Keras

目录 一.引言 二.SENET Layer 1.简介 2.Keras 实现 2.1 Init Function 2.2 Build Function 2.3 Call Function 2.4 Test Main Function 2.5 完整代码 三.BiLinear Intercation Layer 1.简介 2.Keras 实现 2.1 Init Function 2.2 Build Function 2.3 Call Functi…

使用AI优化慢SQL,开发秒变DBA

“AI不会替代他们,但善用AI的人会” 慢 SQL 经常会让应用程序响应变慢,轻者影响用户体验,严重的时候可能会导致服务不可用。如果,每次遇到慢 SQL 都求助于 DBA,一方面效率很低,另一方面也会很没面子。所以…

聊聊如何通过APT+AST来实现AOP功能

前言 如果有使用过spring aop功能的小伙伴,应该都会知道spring aop主要是通过动态代理在运行时,对业务进行切面拦截操作。今天我们就来实现一下如何通过APTAST在编译期时实现AOP功能。不过在此之前先科普一下APT和AST相关内容 APT(注解处理…

openEuler-linux下部署zabbix-超级详细

一、准备工作 下载:zabbix包 地址:下载Zabbix 准备2台openEuler-linux虚拟机: linux-1:当服务器端 IP地址:192.168.100.100 修改hosts文件 [rootzbx ~]# vim /etc/hosts 192.168.100.100 zbx.xx.cn linux-2&…

[Java]JavaWeb开发中的MVC设计模式

一、有关Java Web与MVC设计模式 学习过基本Java Web开发的人都已经了解了如何编写基本的Servlet,如何编写jsp及如何更新浏览器中显示的内容。但是我们之前自己编写的应用一般存在无条理性,对于一个小型的网站这样的编写没有任何问题,但是一但…

ETL工具-pentaho企业实战部署

📢📢📢📣📣📣 哈喽!大家好,我是【IT邦德】,江湖人称jeames007,10余年DBA及大数据工作经验 一位上进心十足的【大数据领域博主】!😜&am…

TinyOS 配置教程

系列文章目录 TinyOS 系列文章【一】:TinyOS 配置教程 TinyOS 系列文章【二】:Tossim 教程 文章目录 系列文章目录前言1. 安装1.1. 实验环境1.2. TinyOS基础工作1.3. TinyOS 的配置1.4. 安装 java1.5. 安装编译器 2. 测试仿真程序总结 前言 本文主要用…

kafka集群搭建

1.本次搭建涉及3台centos7主机,防火墙与selinux服务均关闭 2.主机参数如下表所示 nameIPportserviceA10.1.60.1122128、2888、3888、9092kafka、zookeeperB10.1.60.1142128、2888、3888、9092kafka、zookeeperC10.1.60.1152128、2888、3888、9092kafka、zookeeper…

让人悲观的国内ChatGPT的未来

最近关于ChatGPT的火爆已经不是简单的AI圈的事了,它已经席卷了所有的IT、媒体圈子,甚至是不同领域不同行业的人,只要你还对于变化与AI有一定的了解,那我相信你一定能知道ChatGPT是什么了。ChatGPT在某种程度上已经是相当于AGI通用…

图论-匈牙利算法学习

本文讲述的是匈牙利算法,即图论中寻找最大匹配的算法。解决的问题是从二分图中找到尽量多的匹配。 原题-华为-HJ28 素数伴侣 描述 题目描述 若两个正整数的和为素数,则这两个正整数称之为“素数伴侣”,如2和5、6和13,它们能应用…

【已解决】SpringBoot 工程 war包服务部署与调用测试

1.开发环境:IDEA,JDK1.8 2.服务打包类型: war包 3.war包部署环境:Linux系统,tomcat服务器,端口号:8081 4.war包部署位置:tomcat-8081/webapps/temp.war 5.服务名为:t…

瑞吉外卖项目——瑞吉外卖

软件开发整体介绍 软件开发流程 需求分析:产品原型、需求规格说明书 设计:产品文档、UI界面设计、概要设计、详细设计、数据库设计 编码:项目代码、单元测试 测试:测试用例、测试报告 上线运维:软件环境安装、配置…

python-day6(补充四:私有属性与函数)

私有属性与函数 私有属性与函数的用途如何定义私有属性与函数如何访问私有属性与函数 私有属性与函数的用途 在面向对象的封装中,私有的属性与函数其根本目的是防止它们在类的外部被使用,python中主要通过命名来进行区分。 把可能使用到的东西封装起来…
最新文章