ProxyPin 中文文档 下载 App

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)也可能是二进制(图片、文件)。处理前先判断:

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;
}