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

news2024/11/15 21:24:25

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

作为一个前端,在实现项目功能的时候,需要在前端写一个静态的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.coloradmin.cn/o/447612.html

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

相关文章

pytest中的钩子函数:pytest_addoption(parser)

# python3 # Time : 2023/4/21 9:05 # Author : Jike_Ma # FileName: conftest.pyimport pytesthosts {"dev": "http://dev.com.cn","prod": "http://prod.com.cn","test": "http://test.com.cn" }# 注册一个…

使用WSL在Windows上安装Ubuntu

1. 清理环境 查看当前的wsl 状态&#xff0c;wsl --list 可以列出当前系统中已安装的子系统。 选择需要清理的系统&#xff0c;然后用 wsl --unregister <DistributionName> 即可完成卸载。 将 wsl 默认版本设置为 2&#xff1a; wsl --set-default-version 2 可以通…

taobao.item.carturl.get( 加购URL获取 )

&#xffe5;开放平台免费API可选用户授权 获取加购URL&#xff0c;支持添加商品到购物车 公共参数 请求地址: 公共请求参数: 公共响应参数: 点击获取key和secret 请求参数 请求示例 响应示例 异常示例

matlab笔记总结(4)

https://www.bilibili.com/video/BV1MA4y1d7so/?spm_id_from333.788&vd_source3ef6540f8473c7367625a53b7b77fd66 司守奎老师在B站的讲解视频 https://matlabacademy.mathworks.com/cn/details/matlab-onramp/gettingstarted MATLAB官方的入门之旅&#xff08;英文&…

ChatGPT探索系列之六:思考ChatGPT的未来发展趋势和挑战

文章目录 前言一、未来发展趋势1. ChatGPT重塑数据分析之道2. ChatGPT颠覆企业运用人工智能和机器学习的途径3. ChatGPT颠覆自动化商业流程4. ChatGPT引领企业决策迈向新纪元 二、ChatGPT掀开未来充满机遇和挑战的新篇章总结 前言 ChatGPT发展到目前&#xff0c;其实网上已经有…

如何用Python搭建HTTP服务器,并实现远程访问和下载?

Python是编程语言中的热门语言&#xff0c;具有语法简单、语句清晰的特点。如果你不擅长编程&#xff0c;学习Python是一个不错的选择&#xff0c;初学者在学习阶段可以较为轻松地理解编程对象和思维方法。对于小白用户来说,它具有强大且丰富的库,封装后可以轻松调用,因此也更受…

数学建模第一天:数学建模工具课之MATLAB的入门

目录 一、MATLAB的简介 二、Matlab基础知识 1. 变量 ①命名规则 ②特殊变量名 2、数学符号与函数调用 ①符号 ②数学函数 ③自定义函数 三、数组与矩阵 1、数组 ①创建数组 ②访问数组元素 ③数组运算 2、矩阵 ①定义 ②特殊矩阵 ③矩阵运算 四、控制流 …

pyecharts从入门到精通-地图专题GEO-世界地图和中国城市地图

文章目录 参考安装与查看pyecharts地图实现-Geo完成Geo地理坐标系实现。案例演示拓展-pyecharts中GEO源码 参考 官方文档:https://pyecharts.org/#/zh-cn/quickstart Python使用Pyecharts画Geo地图&#xff0c;如何显示具体地点名称 pyecharts世界地图用&#xff1a;国家中英文…

即使运行高优先级线程,低优先线程也能运行

仅仅因为一个线程具有较高的优先级&#xff0c;并不意味着其他低优先级的线程就不会得到机会运行。 这怎么理解&#xff1f; 有时候&#xff0c;我看到人们编写多线程代码&#xff0c;将一个线程的优先级置于另一个线程之上&#xff0c;他们认为这将防止优先级较低的线程干扰…

Qt编写网络摄像头推流(4路1080P主码流只占用0.2%CPU/极低延时极速响应)

一、前言说明 将从网络摄像头拉流过来的视频流重新推流出去&#xff0c;是目前一个很常规的做法&#xff0c;尤其是推流到流媒体服务中心&#xff0c;这样流媒体服务中心就把散落在各个区域的监控摄像头集中起来统一管理&#xff0c;同时提供对外一致的访问接口。很多时候不仅…

微信小程序开发的基础学习

回顾上篇内容 1、小程序核心理念&#xff1a; 在小程序里面&#xff0c;会把每一个标签看作一个矩阵&#xff0c;该矩阵的宽高会平行x轴、y轴 那么我们只需要知道该矩阵一个左上角的坐标&#xff0c;即可确定该矩阵的位置 2、题外话&#x1f9d0; &#xff08;1&#xff09…

字符串总结

一、最长公共前缀 1.方法一&#xff1a;横向扫描 class Solution { public:string longestCommonPrefix(vector<string>& strs) {if (!strs.size()) {return "";}string prefix strs[0];int count strs.size();for (int i 1; i < count; i) {prefix…

通信行业的企业如何与Synaptics建立EDI连接?

Synaptics 是一家全球领先的移动计算、通信和娱乐设备人机界面交互开发解决方案设计制造公司。该公司为大部份主要电脑及笔记本电脑公司提供触摸板&#xff0c;其中包括了华硕、宏碁、戴尔、惠普、索尼、东芝、Gateway、国际商业机器、联想集团与三星电子等。 Synaptics 推荐其…

【C++】模版初阶

现在我们学习C模版的基本知识&#xff0c;为以后学习STL打下一个坚实的基础 目录 一、泛型编程 二、模版 2.1 函数模版 2.1.1 函数模版的概念 2.1.2 函数模板的使用 2.1.3 函数模板的原理 2.1.4 函数模板的实例化 2.1.5 模板参数的匹配原则 2.2 类模版 2.2.1 类模版…

【查找】二叉排序树(BST)

有序序列查找可以用二分查找&#xff0c;但其插入删除需要移动数据&#xff0c;较为复杂&#xff1b;若不想多的移动&#xff0c;可以弄成无序序列&#xff0c;但这样就不能用二分查找。 为了不影响数据顺序&#xff0c;可以使用二叉排序树&#xff0c; 概念&#xff1a; 二…

11、STM32H7 MPU Cache

篇前小问题 在使用stm32H750的FMC时&#xff0c;出现一些奇怪的问题&#xff0c;写A时序时时&#xff0c;总是写1次的代码了出现了写四次的时序&#xff0c;所以找了很久&#xff0c;才找到问题出在了MPU上&#xff0c;使用FMC时&#xff0c;必须开启MPU&#xff0c;不然会出现…

QML图形动画基础之

图形动画基础 颜色&#xff08;color&#xff09;渐变&#xff08;Gradient&#xff09;系统调色面板(SystemPalette) 图片边界动画&#xff08;BorderImage&#xff09;动态图片&#xff08;AnimatedImage&#xff09;缩放&#xff0c;旋转和平移变换Transform实现高级变换 颜…

CLion开发工具 | 01 - 认识外观界面

专栏介绍 一、创建/打开项目 二、外观和界面 1. 文件编辑区 CLion的自动提示功能如下&#xff1a; CLion的参数提示功能如下&#xff1a; CLion的形参名称显示功能&#xff1a; 2. 项目文件浏览区 3. 工具栏 3.1. 一键编译运行 CLion内置了MinGW&#xff0c;点击运行可以…

卷积神经网络推理特征图可视化查看,附录imagenet类别和编号对应查询表。通过观察法进行深度学习可解释研究

CNN模型虽然在图像处理上表现出非常良好的性能和准确性&#xff0c;但一直以来都被认为是一个黑盒模型&#xff0c;人们无法了解里面的工作机制。 针对这个问题&#xff0c;研究人员除了从理论层面去寻找解释外&#xff0c;也提出了一些可视化的方法直观地理解CNN的内部机理&am…

atl创建avtive

activex无窗口问题 控件在编码过程中要检查m_hWnd是否存在&#xff0c;不然vs可能会出现绘制错乱和崩溃 atl窗体通过CComControlBase的内部变量控制&#xff0c;窗体属性&#xff0c;包括onsize事件对应的m_bRecomposeOnResize变量控制窗体变化事件响应。 可插入的控件 授权…