要让微信小程序和Web应用共享同一套API接口,可以按照以下架构设计:
一、核心架构设计
1. 统一后端API服务
// 示例:Node.js + Express
const express = require('express');
const app = express();
// 统一的API接口
app.get('/api/products', (req, res) => {
// 业务逻辑
res.json({ data: products });
});
app.post('/api/orders', (req, res) => {
// 订单处理逻辑
res.json({ success: true });
});
2. API网关层(推荐)
客户端 → API网关 → 微服务
↓
统一认证、限流、日志
二、关键技术实现
1. 跨域处理(Web端需要)
// 后端CORS配置
app.use(cors({
origin: ['https://your-web-domain.com', 'https://your-other-domain.com'],
credentials: true
}));
2. 统一响应格式
{
"code": 200,
"message": "success",
"data": {...},
"timestamp": 1620000000
}
3. 认证方案
// JWT Token方案(两端通用)
// 小程序端:wx.login获取code,后端换token
// Web端:用户名密码登录获取token
// 中间件
const authMiddleware = (req, res, next) => {
const token = req.header('Authorization');
// 验证逻辑
next();
};
三、小程序与Web差异处理
1. 请求封装适配
// 小程序端封装
const wxRequest = (url, options) => {
return new Promise((resolve, reject) => {
wx.request({
url: `${API_BASE_URL}${url}`,
header: {
'Authorization': `Bearer ${token}`,
'Content-Type': 'application/json'
},
...options,
success: resolve,
fail: reject
});
});
};
// Web端封装(使用axios/fetch)
const webRequest = async (url, options) => {
const response = await fetch(`${API_BASE_URL}${url}`, {
headers: {
'Authorization': `Bearer ${token}`,
'Content-Type': 'application/json'
},
...options
});
return response.json();
};
2. 环境变量配置
// config.js - 多环境配置
const config = {
development: {
apiBase: 'http://localhost:3000/api'
},
production: {
apiBase: 'https://api.yourdomain.com/api'
}
};
// 根据环境选择
const API_BASE_URL = config[process.env.NODE_ENV].apiBase;
四、最佳实践建议
1. API版本管理
/api/v1/products
/api/v2/products
2. 错误处理统一
// 错误中间件
app.use((err, req, res, next) => {
const status = err.status || 500;
res.status(status).json({
code: status,
message: err.message || 'Internal Server Error',
data: null
});
});
3. 接口文档
- 使用Swagger/OpenAPI
- 保持文档与代码同步
4. 安全考虑
// 小程序安全域名配置
// 在微信公众平台配置request合法域名
// 防CSRF(Web端)
app.use(csurf());
// 请求频率限制
const rateLimit = require('express-rate-limit');
const limiter = rateLimit({
windowMs: 15 * 60 * 1000,
max: 100
});
app.use('/api/', limiter);
五、部署架构示例
[负载均衡]
↓
[API网关/反向XX] (Nginx)
↓
-------------------------------
↓ ↓ ↓
[认证服务] [业务服务1] [业务服务2]
↓
[数据库/缓存]
六、监控与维护
- 日志收集:统一日志格式
- 性能监控:API响应时间、错误率
- 报警机制:异常时及时通知
注意事项
- 小程序限制:注意微信小程序的网络请求限制(域名需备案、HTTPS等)
- 数据格式:确保返回数据在小程序和Web端都能正常解析
- 文件上传:两端的文件上传处理可能不同
- 会话管理:小程序使用wx.checkSession,Web使用Cookie/Session
通过这种设计,你可以实现一套API同时服务小程序和Web应用,只需在前端进行适当的适配封装即可。
CLOUD技术笔记