前言

AnyProxy不仅仅可以抓包,还可以拦截请求并修改服务端响应,实现接口mock功能。

面试时候经常会问到第三方支付如何测试这种,如果对接的第三方没提供测试环境,那么就需要搭建一个mock服务器,模拟支付接口返回的各种情况。

rule模块

AnyProxy提供了二次开发的能力,你可以用js编写自己的规则模块(rule),来自定义网络请求的处理逻辑。

注意:引用规则前,请务必确保文件来源可靠,以免发生安全问题

  • 拦截并修改正在发送的请求

可修改内容包括请求头(request header),请求体(request body),甚至是请求的目标地址等

  • 拦截并修改服务端响应

可修改的内容包括http状态码(status code)、响应头(response header)、响应内容等

  • 拦截https请求,对内容做修改

本质是中间人攻击(man-in-the-middle attack),需要客户端提前信任AnyProxy生成的CA

开发示例

举个栗子: 需要编写一个规则模块,在 GET http://httpbin.org/user-agent 的返回值里加上测试信息,并延迟5秒返回

Step 1,编写规则如下, 保存为sample.js文件,可以放电脑任意位置

  1. // file: sample.js
  2. module.exports = {
  3. summary: 'a rule to hack response',
  4. *beforeSendResponse(requestDetail, responseDetail) {
  5. if (requestDetail.url === 'http://httpbin.org/user-agent') {
  6. const newResponse = responseDetail.response;
  7. newResponse.body += '- AnyProxy Hacked!';
  8. return new Promise((resolve, reject) => {
  9. setTimeout(() => { // delay
  10. resolve({ response: newResponse });
  11. }, 5000);
  12. });
  13. }
  14. },
  15. };

Step 2, 启动AnyProxy,加载规则

anyproxy -i --rule sample.js

当看到出现:Active rule is: a rule to hack response 那就是加载成功了

Step 3, 测试规则

用curl测试

curl http://httpbin.org/user-agent --proxy http://127.0.0.1:8001

也可以使用浏览器测试,配置浏览器http代理为 127.0.0.1:8001,访问 http://httpbin.org/user-agent, 经过代理服务器后,期望的返回如下

  1. {
  2. "user-agent": "curl/7.43.0"
  3. }
  4. - AnyProxy Hacked!

Step 4, 查看请求信息.浏览器访问http://127.0.0.1:8002 ,界面上能看到刚才的请求信息

处理流程

当http请求经过代理服务器时,具体处理过程是:

-收集请求所有请求参数,包括method, header, body等

  • AnyProxy调用规则模块beforeSendRequest方法,由模块做处理,返回新的请求参数,或返回响应内容
  • 如果beforeSendRequest返回了响应内容,则立即把此响应返回到客户端(而不再发送到真正的服务端),流程结束。
  • 根据请求参数,向服务端发出请求,接收服务端响应。
  • 调用规则模块beforeSendResponse方法,由模块对响应内容进行处理
  • 把响应信息返回给客户端

当代理服务器收到https请求时,AnyProxy可以替换证书,对请求做明文解析。

  • 调用规则模块beforeDealHttpsRequest方法,如果返回true,会明文解析这个请求,其他请求不处理
  • 被明文解析后的https请求,处理流程同http一致。未明文解析请求不会再进入规则模块做处理。

如何引用

如下几种方案都可以用来引用规则模块:

使用本地路径

anyproxy --rule ./rule.js

使用在线地址

anyproxy --rule https://sample.com/rule.js

使用npm包,AnyProxy使用require()加载本地规则,你可以在参数里传入一个本地的npm包路径,或是某个全局安装的npm包

anyproxy --rule ./myRulePkg/ #本地包 npm i -g myRulePkg && anyproxy --rule myRulePkg #全局包

rule接口文档

规则模块应该符合cmd规范,一个典型的规则模块代码结构如下。模块中所有方法都是可选的,只需实现业务感兴趣的部分即可。

  1. module.exports = {
  2. // 模块介绍
  3. summary: 'my customized rule for AnyProxy',
  4. // 发送请求前拦截处理
  5. *beforeSendRequest(requestDetail) { /* ... */ },
  6. // 发送响应前处理
  7. *beforeSendResponse(requestDetail, responseDetail) { /* ... */ },
  8. // 是否处理https请求
  9. *beforeDealHttpsRequest(requestDetail) { /* ... */ },
  10. // 请求出错的事件
  11. *onError(requestDetail, error) { /* ... */ },
  12. // https连接服务器出错
  13. *onConnectError(requestDetail, error) { /* ... */ }
  14. };

更多资料参考anyproxy 官方文档https://github.com/alibaba/anyproxy/blob/master/docs/cn/src_doc.md

anyproxy学习2-rule模块实现接口mock功能的更多相关文章

  1. anyproxy学习3-修改返回内容(beforeSendResponse)

    前言 fiddler可以抓包打断点后,修改返回的内容,便于模拟各种返回结果.anyproxy也可以通过写rule模块规则,模拟返回状态码.头部.body beforeSendResponse befo ...

  2. JavaSE学习总结(六)——接口、抽象类、内部类

    一.不需要实例化的原因 看一个示例: package com.zhangguo.chapter5.s1; /**动物园*/ public class Zoo { public static void ...

  3. Python3学习笔记25-logging模块

    logging模块,Python自带用来记录日志的模块. 因为工作需要用到关于日志的,最近一直都在看关于日志模块的东西,百度了很多文章,可惜都是看的让人一头雾水,最后运气不错,找到一篇很详细的文章.传 ...

  4. 使用mockserver来进行http接口mock

    转载自:https://blog.csdn.net/heymysweetheart/article/details/52227379:(注,这个不是很符合我的要求,它主要的作用是可以通过简单的代码就能 ...

  5. 火车头wordpress免费万能发布模块和接口

    火车头wordpress免费万能发布模块和接口实测可以用 http://www.ggfenxiang8.com/?p=263

  6. jQuery源代码学习之七—队列模块queue

    一.jQuery种的队列模块 jQuery的队列模块主要是为动画模块EFFECTS提供支持,(不过到现在为了支持动画队列的inprogress的出入队还是搞不太清楚),单独抽取出一个命名空间是为了使程 ...

  7. python 学习day5(模块)

    一.模块介绍 模块,用一砣代码实现了某个功能的代码集合. 类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和代码间的耦合.而对于一个复杂的功能来,可能 ...

  8. [TPYBoard-Micropython之会python就能做硬件 7] 学习使用蓝牙模块及舵机

    转载请注明:@小五义 http://www.cnblogs.com/xiaowuyi            欢迎加入讨论群 64770604 一.实验器材 1.TPYboard V102板  一块 2 ...

  9. 学习rollup.js模块文件打包

    学习rollup.js模块文件打包 一:rollup 是什么?Rollup 是一个 JavaScript 模块打包器,可以将小块代码编译成大块复杂的代码. webpack 和 Rollup 对比不同点 ...

随机推荐

  1. 【NPDP笔记】第二章 组合管理

    2.1 什么是产品组合 Product Portfolio 什么是组合管理,讲述的是完成正确的项目, 五大目标 财务稳健,财务目标 管道平衡,资源需求与可用资源之间的平衡 战略协同,与经营战略 组织战 ...

  2. salt远程实现go编译重启

    使用salt实现jenkins发版时,远程对go项目编译重启 1.go 版本1.12 使用go mod 2.设置go镜像 GOPROXY="https://goproxy.io" ...

  3. .net桌面程序或者控制台程序使用NLog时的注意事项

    Nuget添加NLog 添加nlog.config文件,并选择属性->始终复制 不选择始终复制,编译后nlog.config是没有的. 具体使用: private static readonly ...

  4. [转载]ROS开发环境之Qt Creator

    ROS开发环境之Qt Creator(http://my.phirobot.com/blog/2013-12-ros_ide_qtcreator.html) Created at: 2013-12-2 ...

  5. JVM Server与Client运行模式

    JVM Server模式与client模式启动,最主要的差别在于:-Server模式启动时,速度较慢,但是一旦运行起来后,性能将会有很大的提升.原因是: 当虚拟机运行在-client模式的时候,使用的 ...

  6. LeetCode 5198. 丑数 III(Java)容斥原理和二分查找

    题目链接:5198. 丑数 III 请你帮忙设计一个程序,用来找出第 n 个丑数. 丑数是可以被 a 或 b 或 c 整除的 正整数. 示例 1: 输入:n = 3, a = 2, b = 3, c ...

  7. jenkins+springboot+maven多模块部署

    一.jenkins的安装配置 1.去官网下载war包,这种方式比较简单方便 java -jar jenkins.war --httpPort=49001 2.首次运行有一个key放在服务器上需要你填入 ...

  8. matlab界面UI设计资料

    一个实现图像灰度处理并归类于某已知相似图片的程序 软件:matlab2017a 算法:HU检索图像算法.Zernike算法 资料: ①: matlab遍历文件夹下所有图片和遍历所有子文件夹下图片 - ...

  9. C# IEnumerable接口

    问: 集合很好用,而且非常简单,但是我不明白 为什么数组.ArrayList 和 Hasttable 这些集合都能用foreach直接遍历呢?我想自己定义一个集合类,应该怎么做呢? 回答:这个问题问的 ...

  10. ADO.net(内置类区别)随记

    Ado.net使用流程 SqlConnection->open->SqlCommand(sqlstring,conn)->(ExcuteNonQuery \ExecuteScalar ...