让微信小程序也能发PATCH

项目背景

在 uni-app + TypeScript 开发微信小程序时,业务层大量使用了 RESTful 接口,其中更新操作用到了 PATCH

然而小程序底层仅支持 GET/POST/PUT/DELETE...,不支持直接写 method: 'PATCH'

改动所有接口为 PUT 不仅语义不纯,还可能因「全量覆盖」导致字段误删;在前端维护一份「POST 白名单」又分散且易遗漏。

最终选择在 NestJS 后端 引入 HTTP Method Override 机制:继续用 POST 出站,但带一个约定头,让服务端把方法还原成 PATCH对前端透明、对其他接口零影响


一、原理简介

HTTP Method Override(方法重写)是 事实标准 的变通方案:

客户端保持 POST 请求,同时在 查询参数 _method请求头 X-HTTP-Method-Override 里写入目标方法(PATCH/PUT/DELETE)。

服务端中间件在路由匹配前把 req.method 替换成目标值,后续框架逻辑完全无感知。


二、NestJS 实现步骤

Nest 底层即 Express,官方仓库 expressjs/method-override 可直接复用。

1. 安装依赖

bash 复制代码
npm i method-override

# 如果习惯 TS 可再装

npm i -D @types/method-override

2. 在 main.ts 注册(顺序很关键)

ts 复制代码
import { NestFactory } from '@nestjs/core';

import { NestExpressApplication } from '@nestjs/platform-express';

import * as methodOverride from 'method-override';

import { AppModule } from './app.module';

  


async function bootstrap() {

  const app = await NestFactory.create<NestExpressApplication>(AppModule);

  


  /* ========== 关键一行:方法重写 ========== */

  app.use(methodOverride('X-HTTP-Method-Override')); // 只读 header 方式

  


  /* 以下代码顺序不变 */

  app.setGlobalPrefix('api/v1');

  app.useGlobalPipes(...);

  app.useGlobalFilters(...);

  app.enableCors({

    allowedHeaders: 'Content-Type,Authorization,X-HTTP-Method-Override',

  });

  await app.listen(3000);

}

bootstrap();

3. 保持原有 PATCH 控制器

ts 复制代码
@Controller('users')

export class UserController {

  @Patch(':id')

  update(@Param('id') id: string, @Body() dto: UpdateUserDto) {

    return this.userService.update(+id, dto);

  }

}

三、uni-app 前端调用示例

继续使用 uni.request只改 header

ts 复制代码
// 封装在 utils/http.ts

function patch<T>(url: string, data?: any, options?: any) {

  return request<T>({

    url,

    method: 'POST',                     // ① 表面仍是 POST

    header: {

      'X-HTTP-Method-Override': 'PATCH', // ② 告诉后端"真实意图"

      ...options?.header,

    },

    data,

    ...options,

  });

}

  


/* 使用 */

patch('/api/v1/users/1', { email: 'new@example.com' })

 .then(res => console.log('更新成功', res))

网络实际发出:

bash 复制代码
POST /api/v1/users/1

X-HTTP-Method-Override: PATCH

Content-Type: application/json

  


{"email":"new@example.com"}

经过中间件后,Nest 内部 req.method === 'PATCH'精准进入 @Patch() 路由, Swagger 文档也能正常显示。


四、常见疑问

| 问题 | 解答 |

|---|---|

| 会影响其他正常接口吗? | 不会。只有带 X-HTTP-Method-Override 头的 POST 才会被改写,其余请求零感知。 |

| 是否幂等? | 中间件本身无业务逻辑,只改方法;接口幂等性由你自己的 @Patch 实现保证。 |

| 上线后想移除怎么办? | 小程序端与后端完全解耦;哪天小程序原生支持 PATCH,直接去掉中间件+header 即可,业务代码不动。 |


五、小结

  1. 微信小程序不支持 PATCH/PUT/DELETE → 用 Method-Override 是最低成本、最语义化的解法。

  2. NestJS 底层即 Express,一行 app.use(methodOverride('X-HTTP-Method-Override')) 即可全局生效。

  3. 前端继续发 POST只加头 ;后端原有 @Patch 零改动,其他接口零影响,日后可无缝回退。

借助该方法,成功稳定运行,真机、开发者工具、H5 三端同构,希望对你同样有帮助。

相关推荐
星辰徐哥2 小时前
Spring Boot 微服务架构设计与实现
spring boot·后端·微服务
星辰徐哥2 小时前
Spring Boot 数据导入导出与报表生成
spring boot·后端·ui
明夜之约2 小时前
Spring Boot 自动装配源码
java·spring boot·后端
Leaton Lee2 小时前
Spring Boot分层架构详解:从Controller到Service再到Mapper的完整流程
java·spring boot·后端·架构
Micro麦可乐2 小时前
Spring Boot 实战:从零设计一个短链系统(含完整代码与数据库设计)
数据库·spring boot·后端·哈希算法·雪花算法·短链系统
Jinkxs2 小时前
Resilience4j- 与 Spring Boot 快速集成:自动配置与基础注解使用
java·spring boot·后端
毕设源码_郑学姐2 小时前
计算机毕业设计springboot网络相册设计与实现 基于Spring Boot框架的在线相册管理系统开发与应用 Spring Boot驱动的网络影集设计与实践
spring boot·后端·课程设计
辣机小司2 小时前
【踩坑记录:Spring Boot 配置文件读取值不一致?警惕 YAML 的“八进制陷阱”与 SnakeYAML 版本之谜】
java·spring boot·后端·yaml·踩坑记录
码农阿豪2 小时前
从零到一:Spring Boot快速接入金仓数据库实战
数据库·spring boot·后端
追逐时光者2 小时前
一个基于 .NET 与 Avalonia 构建、面向 TrinityCore 的开源 WoW 数据库编辑器
后端·.net