让微信小程序也能发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 三端同构,希望对你同样有帮助。

相关推荐
ltl5 小时前
Transformer 整体架构:一张图看懂
后端
ltl5 小时前
Decoder 详解:为什么它天生适合生成
后端
2601_958492555 小时前
Optimizing Engagement with Freehead Skate - HTML5 Game - Construct 3
前端·html·html5
ltl5 小时前
Encoder 详解:6 层堆叠到底在做什么
后端
程序员cxuan5 小时前
微信读书官方发了 skills,把我给秀麻了。
人工智能·后端·程序员
茉莉玫瑰花茶6 小时前
工作流的常见模式 [ 1 ]
java·服务器·前端
未若君雅裁6 小时前
Spring AOP、日志切面与声明式事务原理
java·后端·spring
zhangxingchao6 小时前
AI应用开发六:企业知识库
前端·人工智能·后端
山峰哥7 小时前
SQL慢查询调优实战:从全表扫描到索引覆盖的完整复盘
前端·数据库·sql·性能优化