ProxyPin onResponse 钩子 篡改服务器返回数据
典型使用场景
场景一:修改 JSON 响应字段
把服务器返回的某个字段改成你想要的值,测试 App 的显示逻辑:
function onResponse(context, response) {
// 只处理 JSON 响应
if (response.headers['Content-Type'] &&
response.headers['Content-Type'].includes('application/json')) {
try {
let data = JSON.parse(response.body);
// 修改特定字段
if (data.data && data.data.user) {
data.data.user.vip = true; // 强制 VIP
data.data.user.balance = 999999;
}
response.body = JSON.stringify(data);
} catch (e) {
context.log('JSON 解析失败: ' + e.message);
}
}
return response;
}
场景二:注入 CORS 头(Web 应用本地调试)
本地开发 Web 应用经常遇到跨域问题:
function onResponse(context, response) {
response.headers['Access-Control-Allow-Origin'] = '*';
response.headers['Access-Control-Allow-Methods'] = 'GET,POST,PUT,DELETE';
response.headers['Access-Control-Allow-Headers'] = 'Content-Type,Authorization';
return response;
}
场景三:模拟慢网络延迟
测试 App 在弱网环境下的表现:
function onResponse(context, response) {
// 对图片和大文件不加延迟
let contentType = response.headers['Content-Type'] || '';
if (contentType.includes('image') || parseInt(response.headers['Content-Length']) > 100000) {
return response;
}
// 给 API 响应加 2 秒延迟
if (response.url.includes('/api/')) {
context.sleep(2000);
}
return response;
}
场景四:模拟错误响应
测试 App 的错误处理逻辑:
function onResponse(context, response) {
// 把成功响应改成失败
if (response.statusCode === 200 && response.url.includes('/api/payment')) {
response.statusCode = 500;
response.body = JSON.stringify({
code: 500,
msg: '模拟服务器内部错误'
});
}
return response;
}
场景五:删除生产密钥
安全测试中,把响应里真实的生产密钥替换掉再展示:
function onResponse(context, response) {
if (typeof response.body === 'string') {
// 把 Stripe 等生产密钥替换成测试值
response.body = response.body.replace(
/pk_live_[a-zA-Z0-9]+/g,
'pk_test_replaced_by_proxypin'
);
}
return response;
}
Body 类型注意
response.body 可能是字符串(JSON、HTML)也可能是二进制(图片、文件)。处理前先判断:
typeof response.body === 'string'→ 可以直接操作- 二进制类型 → 尝试 base64 或十六进制处理,或跳过
onRequest + onResponse 配合
最强大的用法是两个钩子配合:
function onRequest(context, request) {
// 记住请求的参数
context.storage['last-param'] = request.query?.type || request.body?.type;
return request;
}
function onResponse(context, response) {
// 根据请求参数修改响应
let param = context.storage['last-param'];
if (param === 'premium') {
// premium 用户返回更多数据
let data = JSON.parse(response.body);
data.data.extra = '高级功能解锁';
response.body = JSON.stringify(data);
}
return response;
}