前后端接口参数详解与 Mock 配置指南【大模型总结】

news2025/4/8 9:36:38

前后端接口参数详解与 Mock 配置指南


一、前端请求参数类型及 Mock 处理

1.1 URL 路径参数 (Path Parameters)

场景示例

GET /api/users/{userId}/orders/{orderId}

Mock.js 处理

Mock.mock(/\/api\/users\/(\d+)\/orders\/(\d+)/, 'get', (options) => {
  const userId = options.url.match(/\/users\/(\d+)/)[1];
  const orderId = options.url.match(/\/orders\/(\d+)/)[1];
  return {
    userId,
    orderId,
    totalPrice: Mock.Random.float(100, 1000, 2)
  };
});

MSW 动态匹配

rest.get('/api/users/:userId/orders/:orderId', (req, res, ctx) => {
  const { userId, orderId } = req.params;
  return res(
    ctx.json({ 
      userId: Number(userId),
      orderId: Number(orderId),
      status: 'processed'
    })
  );
});

1.2 查询参数 (Query Parameters)

场景示例

GET /api/products?category=electronics&page=2&sort=price_desc

Mock.js 响应逻辑

Mock.mock(/\/api\/products/, 'get', (options) => {
  const query = new URLSearchParams(options.url.split('?')[1]);
  return {
    page: query.get('page') || 1,
    data: Mock.mock({
      'list|10': [{
        id: '@id',
        name: '@ctitle',
        'price|100-5000': 1,
        category: query.get('category') || 'all'
      }]
    })
  };
});

WireMock 精确匹配

stubFor(get(urlPathEqualTo("/api/products"))
    .withQueryParam("category", equalTo("electronics"))
    .withQueryParam("page", equalTo("2"))
    .willReturn(aResponse()
        .withHeader("Content-Type", "application/json")
        .withBodyFile("products/electronics_page2.json")));

1.3 请求体参数 (Body Parameters)

场景示例

POST /api/login
Content-Type: application/json

{
  "username": "admin",
  "password": "P@ssw0rd"
}

MSW 处理逻辑

rest.post('/api/login', async (req, res, ctx) => {
  const { username, password } = await req.json();
  if (password.length < 8) {
    return res(
      ctx.status(400),
      ctx.json({ error: "密码长度不足8位" })
    );
  }
  return res(
    ctx.json({
      token: Buffer.from(username).toString('base64'),
      expiresIn: 3600
    })
  );
});

WireMock JSON 匹配

stubFor(post(urlEqualTo("/api/login"))
    .withRequestBody(matchingJsonPath("$.username"))
    .withRequestBody(matchingJsonPath("$.password"))
    .willReturn(aResponse()
        .withStatus(200)
        .withBody("{\"token\": \"{{randomValue length=32 type='ALPHANUMERIC'}}\"}")));

二、后端接口参数 Mock 策略

2.1 Spring Boot MockMvc 参数验证

路径参数测试

@Test
void testGetUserById() throws Exception {
  mockMvc.perform(get("/users/{id}", 123))
         .andExpect(status().isOk())
         .andExpect(jsonPath("$.id").value(123));
}

请求体验证测试

@Test
void testCreateProduct() throws Exception {
  String jsonBody = "{ \"name\":\"iPhone\", \"price\":6999 }";
  
  mockMvc.perform(post("/products")
         .contentType(MediaType.APPLICATION_JSON)
         .content(jsonBody))
         .andExpect(status().isCreated())
         .andExpect(jsonPath("$.sku").exists());
}

2.2 Mockito 参数匹配技巧

基础参数匹配

// 任意字符串参数
when(userDao.findByUsername(anyString()))
   .thenReturn(new User("default"));

// 特定类型匹配
when(orderService.calculateTotal(any(Order.class)))
   .thenReturn(100.0);

自定义参数验证

ArgumentCaptor<Product> productCaptor = ArgumentCaptor.forClass(Product.class);
verify(productRepository).save(productCaptor.capture());

Product savedProduct = productCaptor.getValue();
assertThat(savedProduct.getPrice()).isBetween(100, 10000);

三、高级参数处理场景

3.1 文件上传参数

Multipart 请求 Mock

// Spring Boot 测试示例
@Test
void testUploadAvatar() throws Exception {
  MockMultipartFile file = new MockMultipartFile(
      "file", 
      "avatar.png", 
      "image/png", 
      "<<png data>>".getBytes()
  );

  mockMvc.perform(multipart("/upload")
         .file(file)
         .param("userId", "123"))
         .andExpect(status().isOk());
}

3.2 OAuth2 认证头处理

WireMock 带鉴权头的模拟

stubFor(get(urlPathEqualTo("/api/protected"))
    .withHeader("Authorization", containing("Bearer "))
    .willReturn(aResponse()
        .withStatus(200)
        .withBody("{\"secretData\":\"TOP_SECRET\"}"));

Mockito 模拟安全上下文

@Mock
private JwtDecoder jwtDecoder;

@Test
void testSecuredEndpoint() {
  Jwt jwt = Jwt.withTokenValue("token")
              .header("alg", "HS256")
              .claim("sub", "user123")
              .build();
  
  when(jwtDecoder.decode(anyString())).thenReturn(jwt);
  
  // 执行需要认证的测试逻辑
}

四、参数异常模拟

4.1 无效参数响应

Mock.js 模拟参数错误

Mock.mock(/\/api\/search/, 'get', (options) => {
  const keyword = options.url.split('keyword=')[1];
  if (!keyword || keyword.length < 2) {
    return { 
      code: 400, 
      error: "关键词长度需大于2个字符" 
    };
  }
  // 正常返回逻辑...
});

4.2 类型转换错误

WireMock 错误响应模板

stubFor(get(urlPathEqualTo("/api/items"))
    .withQueryParam("page", matching("[0-9]+"))
    .willReturn(aResponse()
        .withStatus(400)
        .withBody("{\"error\":\"页码必须是数字\"}")));

五、参数调试技巧

5.1 请求日志记录

WireMock 请求捕获

WireMock.startRecording("http://real-api.com");
List<LoggedRequest> requests = findAll(getRequestedFor(urlPathEqualTo("/api/data")));
System.out.println("捕获请求数量:" + requests.size());

5.2 动态参数生成

Mock.js 智能数据生成

Mock.mock('/api/report', {
  'data|30': [{
    date: "@date('yyyy-MM-dd')",
    'sales|500-2000': 1,
    region: "@region",
    product: "@pick(['手机','电脑','配件'])"
  }]
});

六、参数文档规范建议

6.1 OpenAPI 示例片段

/api/users/{id}:
  get:
    parameters:
      - name: id
        in: path
        required: true
        schema:
          type: integer
          minimum: 1
    responses:
      200:
        content:
          application/json:
            schema:
              type: object
              properties:
                id: 
                  type: integer
                name: 
                  type: string

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

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

相关文章

瓦片数据合并方法

影像数据 假如有两份影像数据 1.全球底层影像0-5级别如下&#xff1a; 2.局部高清影像数据级别9-14如下&#xff1a; 合并方法 将9-14文件夹复制到全球底层0-5的目录下 如下&#xff1a; 然后合并xml文件 使得Tileset设置到最高级&#xff08;包含所有级别&#xff09;&…

第16届蓝桥杯单片机模拟试题Ⅰ

试题 代码 sys.h #ifndef __SYS_H__ #define __SYS_H__#include <STC15F2K60S2.H> //onewire.c float getT(); //sys.c extern unsigned char UI; extern bit touch_mode; extern float jiaozhun; extern float canshu; extern float temper; void init74hc138(unsigned…

mac 卸载流氓软件安全助手

之前个人电脑在公司使用过一段时间&#xff0c;为了使用网线联网安装了公司指定的 联软上网助手&#xff0c;谁知安装容易卸载难&#xff0c;后来找运维来卸载&#xff0c;输入管理员密码后&#xff0c;也无反应&#xff0c;最后不了了之了&#xff0c;这个毒瘤软件长期在后台驻…

⭐算法OJ⭐滑动窗口最大值【双端队列(deque)】Sliding Window Maximum

文章目录 双端队列(deque)详解基本特性常用操作1. 构造和初始化2. 元素访问3. 修改操作4. 容量操作 性能特点时间复杂度&#xff1a;空间复杂度&#xff1a; 滑动窗口最大值题目描述方法思路解决代码 双端队列(deque)详解 双端队列(deque&#xff0c;全称double-ended queue)是…

沧州铁狮子

又名“镇海吼”&#xff0c;是中国现存年代最久、形体最大的铸铁狮子&#xff0c;具有深厚的历史文化底蕴和独特的艺术价值。以下是关于沧州铁狮子的详细介绍&#xff1a; 历史背景 • 铸造年代&#xff1a;沧州铁狮子铸造于后周广顺三年&#xff08;953年&#xff09;&#…

Python•判断循环

ʕ⸝⸝⸝˙Ⱉ˙ʔ ♡ 判断🍰常用的判断符号(比较运算符)andor括号notin 和 not inif-elif-else循环🍭计数循环 forrange()函数简易倒计时enumerate()函数zip()函数遍历列表遍历元组遍历字符串遍历字典条件循环 while提前跳转 continue跳出循环 break能量站😚判断🍰 …

【力扣hot100题】(060)分割回文串

每次需要判断回文串&#xff0c;这点比之前几题回溯题目复杂一些。 还有我怎么又多写了循环…… class Solution { public:vector<vector<string>> result;string s;bool palindromic(string s){for(int i0;i<s.size()/2;i) if(s[i]!s[s.size()-1-i]) return …

C++---day7

#include <iostream> #include <cstring> #include <cstdlib> #include <unistd.h> #include <sstream> #include <vector> #include <memory>using namespace std;class Stu { private:public:};// 自定义 vector 类&#xff0c;重…

SvelteKit 最新中文文档教程(17)—— 仅服务端模块和快照

前言 Svelte&#xff0c;一个语法简洁、入门容易&#xff0c;面向未来的前端框架。 从 Svelte 诞生之初&#xff0c;就备受开发者的喜爱&#xff0c;根据统计&#xff0c;从 2019 年到 2024 年&#xff0c;连续 6 年一直是开发者最感兴趣的前端框架 No.1&#xff1a; Svelte …

flink 增量快照同步文件引用关系和恢复分析

文章目录 文件引用分析相关代码分析从state 恢复&#xff0c;以rocksdb为例不修改并行度修改并行度keyGroupRange过程问题 文件引用分析 每次生成的checkpoint 里都会有所有文件的引用信息 问题&#xff0c;引用分析里如何把f1,f2去掉了&#xff0c;可以参考下面的代码&#…

c++概念—内存管理

文章目录 c内存管理c/c的内存区域划分回顾c语言动态内存管理c动态内存管理new和delete的使用new和delete的底层逻辑operator new函数和operator delete函数new和delete的实现操作方式不匹配的情况定位new new/delete和malloc/free的区别 c内存管理 在以往学习c语言的过程中&…

无人机双频技术及底层应用分析!

一、双频技术的核心要点 1. 频段特性互补 2.4GHz&#xff1a;穿透力强、传输距离远&#xff08;可达5公里以上&#xff09;&#xff0c;适合复杂环境&#xff08;如城市、建筑物密集区&#xff09;&#xff0c;但易受Wi-Fi、蓝牙等设备的干扰。 5.8GHz&#xff1a;带宽更…

【电视软件】小飞电视v2.7.0 TV版-清爽无广告秒换台【永久更新】

软件介绍 小飞电视是一款电视端的直播软件&#xff0c;无需二次付费和登录&#xff0c;资源丰富&#xff0c;高清流畅。具备开机自启、推送功能、自定义直播源、个性化设置及节目预告等实用功能&#xff0c;为用户带来良好的观看体验。基于mytv开源项目二改&#xff0c;涵盖央…

Valgrind——内存调试和性能分析工具

文章目录 一、Valgrind 介绍二、Valgrind 功能和使用1. 主要功能2. 基本用法2.1 常用选项2.2 内存泄漏检测2.3 详细报告2.4 性能分析2.5 多线程错误检测 三、在 Ubuntu 上安装 Valgrind四、示例1. 检测内存泄漏2. 使用未初始化的内存3. 内存读写越界4. 综合错误 五、工具集1. M…

学习MySQL第七天

夕阳无限好 只是近黄昏 一、子查询 1.1 定义 将一个查询语句嵌套到另一个查询语句内部的查询 我们通过具体示例来进行演示&#xff0c;这一篇博客更侧重于通过具体的小问题来引导大家独立思考&#xff0c;然后熟悉子查询相关的知识点 1.2 问题1 谁的工资比Tom高 方…

Spring启示录、概述、入门程序以及Spring对IoC的实现

一、Spring启示录 阅读以下代码&#xff1a; dao package org.example1.dao;/*** 持久层* className UserDao* since 1.0**/ public interface UserDao {/*** 根据id删除用户信息*/void deleteById(); } package org.example1.dao.impl;import org.example1.dao.UserDao;/**…

电机的了解到调试全方面讲解

一、什么是电机 电机是一种将电能转换为机械能的装置,通常由定子、转子和电磁场组成。 当电流通过电机的绕组时,产生的磁场会与电机中的磁场相互作用,从而使电机产生旋转运动。电机广泛应用于各种机械设备和工业生产中,是现代社会不可或缺的重要设备之一。 常见的电机种…

笔试专题(七)

文章目录 乒乓球筐&#xff08;哈希&#xff09;题解代码 组队竞赛题解代码 删除相邻数字的最大分数&#xff08;线性dp&#xff09;题解代码 乒乓球筐&#xff08;哈希&#xff09; 题目链接 题解 1. 两个哈希表 先统计第一个字符串中的字符个数&#xff0c;再统计第二个字…

【嵌入式学习3】UDP发送端、接收端

目录 1、发送端 2、接收端 3、UDP广播 1、发送端 from socket import *udp_socket socket(AF_INET,SOCK_DGRAM) udp_socket.bind(("127.0.0.1",3333))data_str "UDP发送端数据" data_bytes data_str.encode("utf-8") udp_socket.sendto(d…

Linux 系统 SVN 源码安装与配置全流程指南

Linux系统SVN源码安装与配置全流程指南 一、环境准备 系统要求 CentOS 7及以上版本需安装GCC编译工具链 依赖项 APR/APR-UTIL&#xff08;Apache可移植运行库&#xff09;SQLite&#xff08;嵌入式数据库&#xff09;zlib&#xff08;数据压缩库&#xff09; 二、下载及安装…