0801ajax_mock-网络ajax请求1-react-仿低代码平台项目

0 vite配置proxy代理

vite.config.ts代码如下图所示:

import { defineConfig } from "vite";
import react from "@vitejs/plugin-react";// https://vite.dev/config/
export default defineConfig({plugins: [react()],server: {proxy: {"/api": {target: "http://localhost:3001",changeOrigin: true,},},},
});

1 搭建mock服务

1.1 mock作用

  • 工作中,经常前后端并行开发
  • 前后端商议好API格式,双方各自开发,前端使用mock服务模拟
  • 前后端开发完,在对接联调

1.2 技术选型

  • 使用mockjs,直接使用
  • 使用nodejs服务+ mockjs
  • 使用在线mock平台

1.3 mockjs

使用

  • 前端代码引入mockjs
  • 定义要模拟的路由、返回结果
  • mockjs劫持ajax请求,得到模拟的结果

演示

_mock/index.ts如下所示:

import Mock from "mockjs";Mock.mock("/api/test", "get", () => {return {errno: 0,data: {name: `张三 ${Date.now()}`,},};
});

Home.tsx中演示,如下:

...
useEffect(() => {// fetch("/api/test")//   .then((res) => res.json())//   .then((data) => console.log("fetch data: ", data));// mockjs 只能拦截XMLHttpRequest,不能拦截fetch请求// mockjs 内部使用XMLHttpRequest API axios.get("/api/test").then((res) => console.log("axios data ", res));}, []);...

效果如下图所示:

在这里插入图片描述

使用总结

  • 只能拦截XMLHttpRequest,不能拦截fetch请求,有局限
  • 要在生产环境注释掉,否则线上请求也被劫持
  • 结论:不建议在项目中直接使用mockjs

1.4 nodejs+mockjs

nodejs做服务端情况下使用mockjs

  • mockjs两大功能:劫持ajax+ 全面的Random能力
  • 把mockjs用户nodejs服务端,使用Random能力
1.4.1 mock模拟请求

第一步:初始化项目questionnaire-mock

npm init -y

第二步:安装不要依赖

npm add mockjs --save

第三步:创建两个mockjs文件,test.js和question.js

const Mock = require('mockjs')const Random = Mock.Randommodule.exports = [{url: '/api/test',method: 'get',response() {return {errno: 0,data: {name: Random.cname()}}}}
]
const Mock = require('mockjs')const Random = Mock.Randommodule.exports = [{url: '/api/question/:id',method: 'get',response() {return {errno: 0,data: {id: Random.id(),title: Random.ctitle()}}}}
]
1.4.2 koa框架开发web服务

第一步:安装依赖

npm install koa koa-router --save

第二步:koa配置使用路由

const Koa = require('koa')
const Router = require('koa-router')const mockList = require('./mock/index')const app = new Koa()
const router = new Router()// 注册mock路由
mockList.forEach(item => {const {url, method, response} = itemrouter[method](url, async ctx => {const res = response()ctx.body = res})
})app.use(router.routes())
// 应用监听3001端口
app.listen(3001)

第四步:配置启动脚本,启动服务

{"name": "questionnaire-mock","version": "1.0.0","main": "index.js","scripts": {"test": "echo \"Error: no test specified\" && exit 1","dev": "nodemon index.js"},"keywords": [],"author": "","license": "ISC","description": "","dependencies": {"koa": "^2.16.1","koa-router": "^13.0.1","mockjs": "^1.1.0"},"devDependencies": {"nodemon": "^3.1.9"}
}
npm run dev

启动成功,如下图所示:在这里插入图片描述

1.4.3 测试api请求

测试两个接口,如下图所示:

在这里插入图片描述

为了更真实模拟网络请求,我给异步请求接口添加请求时间(网络延迟),代码如下所示:

const Koa = require('koa')
const Router = require('koa-router')const mockList = require('./mock/index')const app = new Koa()
const router = new Router()async function getRes(fn) {return new Promise(resolve => {setTimeout(() => {const res = fn()resolve(res)}, 1000);})
}// 注册mock路由
mockList.forEach(item => {const {url, method, response} = itemrouter[method](url, async ctx => {const res = await getRes(response)ctx.body = res})
})app.use(router.routes())
// 应用监听3001端口
app.listen(3001)
1.4.4 模拟post请求,使用postman测试

question.js新增post接口,代码如下所示:

const Mock = require('mockjs')const Random = Mock.Randommodule.exports = [{url: '/api/question/:id',method: 'get',response() {return {errno: 0,data: {id: Random.id(),title: Random.ctitle()}}}},{url: '/api/question',method: 'post',response() {return {errno: 0,data: {id: Random.id()}}}},
]

postman测试改接口,如下图所示:

在这里插入图片描述

1.4.5 测试nodejs服务器api

启动questionnaire,查看Home.tsx接口请求:

import { FC, useEffect } from "react";
// import { FC } from "react";
import { useNavigate } from "react-router-dom";
import { Button, Typography } from "antd";
import axios from "axios";
import { MANAGE_INDEX_PATHNAME } from "../router";
import styles from "./Home.module.scss";// import "../_mock/index.ts";const { Title, Paragraph } = Typography;const Home: FC = () => {const nav = useNavigate();useEffect(() => {fetch("/api/test").then((res) => res.json()).then((data) => console.log("fetch data: ", data));// mockjs 只能拦截XMLHttpRequest,不能拦截fetch请求// mockjs 内部使用XMLHttpRequest API // axios.get("/api/test").then((res) => console.log("axios data ", res));}, []);// function clickHandler() {//   nav({//     pathname: LOGIN_PATHNAME,//     search: "a=20",//   });// }return (<div className={styles.container}><div className={styles.info}><Title>调查问卷 | 在线投票</Title><Paragraph>已累计创建问卷 100 份,发布问卷 90 份,收到问卷 980</Paragraph><Button type="primary" onClick={() => nav(MANAGE_INDEX_PATHNAME)}>开始使用</Button></div></div>);
};export default Home;

fetch接口如下图所示:

在这里插入图片描述

axios接口如下图所示:

在这里插入图片描述

1.5 mock平台

在线mock平台

  • Fast-mock Y-API Swagger
  • 可能不稳定、不维护,或者网恋不稳定
  • 可能存在敏感数据泄漏的风险

优点不耗费资源,成本低。生产强烈不建议使用在线mock平台,除非是个人测试无所谓。

1.6 小结

  • 直接在前端使用mockjs,不推荐
  • 使用nodejs+mockjs,推荐
  • 使用在线mock平台,不推荐

结语

❓QQ:806797785

⭐️仓库地址:https://gitee.com/gaogzhen

⭐️仓库地址:https://github.com/gaogzhen

[1]mock文档[CP/OL].

[2]koa官网[CP/OL].

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

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

相关文章

JVM笔记【一】java和Tomcat类加载机制

JVM笔记一java和Tomcat类加载机制 java和Tomcat类加载机制 Java类加载 * loadClass加载步骤类加载机制类加载器初始化过程双亲委派机制全盘负责委托机制类关系图自定义类加载器打破双亲委派机制 Tomcat类加载器 * 为了解决以上问题&#xff0c;tomcat是如何实现类加载机制的…

IP编址(来自YESLAB新网工的笔记)

上层协议类型 概念&#xff1a;通常指的是位于网络层&#xff08;如 IP 层&#xff09;以上的协议类型&#xff0c;这些协议在数据传输时需要由网络层&#xff08;或更低层&#xff09;协议承载。以 IP 协议为例&#xff0c;IP 报文头部中的 协议字段&#xff08;Protocol Fie…

SpringBoot学习(过滤器Filter。拦截器Interceptor。全局异常捕获处理器GlobalExceptionHandler)(详细使用教程)

目录 一、过滤器Filter。 1.1定义与规范。 1.2工作原理与范围。 1.3使用场景。 1.4 SpringBoot实现过滤器。&#xff08;Filter配置2种方式&#xff09; <1>注解配置(WebFilter、Order、ServletComponentScan)。 创建过滤器类。 启用 Servlet 组件扫描。 <2>配置类…

c++题目_P1443 马的遍历

P1443 马的遍历 # P1443 马的遍历 ## 题目描述 有一个 $n \times m$ 的棋盘&#xff0c;在某个点 $(x, y)$ 上有一个马&#xff0c;要求你计算出马到达棋盘上任意一个点最少要走几步。 ## 输入格式 输入只有一行四个整数&#xff0c;分别为 $n, m, x, y$。 ## 输出格式 …

清华《数据挖掘算法与应用》K-means聚类算法

使用k均值聚类算法对表4.1中的数据进行聚类。代码参考P281。 创建一个名为 testSet.txt 的文本文件&#xff0c;将以下内容复制粘贴进去保存即可&#xff1a; 0 0 1 2 3 1 8 8 9 10 10 7 表4.1 # -*- coding: utf-8 -*- """ Created on Thu Apr 17 16:59:58 …

HarmonyOS-ArkUI V2工具类:AppStorageV2:应用全局UI状态存储

AppStorageV2是一个能够跨界面存储数据,管理数据的类。开发者可以使用AppStorageV2来存储全局UI状态变量数据。它提供的是应用级的全局共享能力,开发者可以通过connect绑定同一个key,进行跨ability数据共享。 概述 AppStorageV2是一个单例,创建时间是应用UI启动时。其目的…

打靶日记 zico2: 1

一、探测靶机IP&#xff08;进行信息收集&#xff09; 主机发现 arp-scan -lnmap -sS -sV -T5 -p- 192.168.10.20 -A二、进行目录枚举 发现dbadmin目录下有个test_db.php 进入后发现是一个登录界面&#xff0c;尝试弱口令&#xff0c;结果是admin&#xff0c;一试就出 得到加…

使用Java基于Geotools的SLD文件编程式创建与磁盘生成实战

前言 在地理信息系统&#xff08;GIS&#xff09;领域&#xff0c;地图的可视化呈现至关重要&#xff0c;而样式定义语言&#xff08;SLD&#xff09;文件为地图元素的样式配置提供了强大的支持。SLD 能够精确地定义地图图层中各类要素&#xff08;如点、线、面、文本等&#x…

kubernetes》》k8s》》Service

Kubernetes 中的 Service 是用于暴露应用服务的核心抽象&#xff0c;为 Pod 提供稳定的访问入口、负载均衡和服务发现机制。Service在Kubernetes中代表了一组Pod的逻辑集合&#xff0c;通过创建一个Service&#xff0c;可以为一组具有相同功能的容器应用提供一个统一的入口地址…

【HDFS】EC重构过程中的校验功能:DecodingValidator

一、动机 DecodingValidator是在HDFS-15759中引入的一个用于校验EC数据重构正确性的组件。 先说下引入DecodingValidator的动机,据很多已知的ISSUE(如HDFS-14768, HDFS-15186, HDFS-15240,这些目前都已经fix了)反馈, EC在重构的时候可能会有各种各样的问题,导致数据错误…

现代c++获取linux系统架构

现代c获取linux系统架构 前言一、使用命令获取系统架构二、使用c代码获取系统架构三、验证四、总结 前言 本文介绍一种使用c获取linux系统架构的方法。 一、使用命令获取系统架构 linux系统中可以使用arch或者uname -m命令来获取当前系统架构&#xff0c;如下图所示 archuna…

didFinishLaunching 与「主线程首次 idle」, 哪个是更优的启动结束时间点 ?

结论先行 在这两个候选时间点里—— application:didFinishLaunchingWithOptions: 执行结束主线程第一次进入 idle&#xff08;RunLoop kCFRunLoopBeforeWaiting&#xff09; 若你只能二选一&#xff0c;以「主线程首次 idle」作为 启动结束 更合理。它比 didFinishLaunchin…

Vue3 + TypeScript中defineEmits 类型定义解析

TypeScript 中 Vue 3 的 defineEmits 函数的类型定义&#xff0c;用于声明组件可以触发的事件。以下是分步解释&#xff1a; 1. 泛型定义 ts <"closeDialog" | "getApplySampleAndItemX"> 作用&#xff1a;定义允许的事件名称集合&#xff0c;即组…

树莓派超全系列教程文档--(34)树莓派配置GPIO

配置GPIO GPIO控制gpio 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 GPIO控制 gpio 通过 gpio 指令&#xff0c;可以在启动时将 GPIO 引脚设置为特定模式和值&#xff0c;而以前需要自定义 dt-blob.bin 文件。每一行都对一组引脚应用相同的设…

AladdinEdu(H卡GPU算力平台)使用教程: 1)注册与开通流程 2)插件使用流程

一、注册与开通流程 首先进入AladdinEdu官网&#xff1a;AladdinEdu-同学们用得起的H卡算力平台-高效做AI就上Aladdin 完成注册&#xff0c;并进行学生认证&#xff1a;学生认证账户&#xff0c;认证期间享受教育优惠价。 登录官网进入控制台 二、插件使用流程 VScode中…

精益数据分析(6/126):深入理解精益分析的核心要点

精益数据分析&#xff08;6/126&#xff09;&#xff1a;深入理解精益分析的核心要点 在创业和数据驱动的时代浪潮中&#xff0c;我们都在不断探索如何更好地利用数据推动业务发展。我希望通过和大家分享对《精益数据分析》的学习心得&#xff0c;一起在这个充满挑战和机遇的领…

2.深入剖析 Rust+Axum 类型安全路由系统

摘要 详细解读 RustAxum 路由系统的关键设计原理&#xff0c;涵盖基于 Rust 类型系统的路由匹配机制、动态路径参数与正则表达式验证以及嵌套路由与模块化组织等多种特性。 一、引言 在现代 Web 开发中&#xff0c;路由系统是构建 Web 应用的核心组件之一&#xff0c;它负责…

运筹学之模拟退火

目录 一、历史二、精髓思想三、案例与代码实现 一、历史 问&#xff1a;谁在什么时候提出模拟退火&#xff1f;答&#xff1a;模拟退火算法&#xff08;Simulated Annealing&#xff0c;SA&#xff09;是由斯图尔特柯尔斯基&#xff08;Scott Kirkpatrick&#xff09; 等人在 …

android测试依赖

Android 项目中常用的测试相关库 1. androidx.arch.core:core-testing:2.2.0 作用&#xff1a; 提供与 Android Architecture Components&#xff08;如 LiveData、ViewModel&#xff09;相关的测试工具。主要用于测试基于 LiveData 的异步操作。 常见功能&#xff1a; 即时…

stack,queue和priority_queue

1. stack 1.1 stack 的介绍 栈是一种容器适配器&#xff0c;专门设计用于LIFO环境&#xff08;后进先出&#xff09;&#xff0c;其中元素仅从容器的一端插入和提取。 容器适配器&#xff0c;也就是使用特定容器类的封装对象作为其底层容器&#xff0c;提供一组特定的成员函…