anyproxy学习2-rule模块实现接口mock功能

前言

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文件,可以放电脑任意位置

// file: sample.js module.exports = { summary: 'a rule to hack response', *beforeSendResponse(requestDetail, responseDetail) { if (requestDetail.url === 'http://httpbin.org/user-agent') { const newResponse = responseDetail.response; newResponse.body += '- AnyProxy Hacked!'; return new Promise((resolve, reject) => { setTimeout(() => { // delay resolve({ response: newResponse }); }, 5000); }); } }, };

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, 经过代理服务器后,期望的返回如下

{ "user-agent": "curl/7.43.0" } - 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规范,一个典型的规则模块代码结构如下。模块中所有方法都是可选的,只需实现业务感兴趣的部分即可。

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

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

(0)

相关推荐

  • vue 开发常用工具及配置四:推荐一个 mock 工具

    本文大约 1000 字. 在系统原型设计阶段,或后端接口不足备的情况下,如何验证模型信息的完整性?此时 mock 是一个不错的选择. 一般开发者可能倾向于直接写后端接口,哪怕只是返回假数据.之前作者也 ...

  • 如何优雅的进行接口管理

    在这前后端分离大行其道的今天,如何优雅的管理接口,对应提高工作效率非常重要.而接口又是由后端提供的,这个任务自然而然的又落在后台开发人员的身上.在这里提供三种常见的接口管理方案,这三种方案没有属谁最优 ...

  • 一行代码搞定Spring Boot反爬虫,防止接口盗刷!

    每日英文 Fate determines who enters your life, your actions decide who stays. 谁走进你的生命,是由命运决定:谁停留在你生命中,却是 ...

  • (1条消息) 交换机调用ACL时候的inbound和outbound该怎么用?

    我们知道,简单的ACL(访问控制列表)配置以后,通常在物理接口或者vlanif虚接口下调用,但是我们时常不明白,到底什么时候该用inbound,什么时候该用outbound,下面是我自己简单的理解. ...

  • anyproxy学习1-windows平台安装和抓手机app上https请求

    前言 做接口测试肯定离不开抓包,目前比较流行的抓包工具是fiddler和charles,相信并不陌生.这里介绍一个阿里公司研发的一个抓包神器,只需打开web页面,就能抓到手机app上的http和htt ...

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

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

  • anyproxy学习4-Linux(Centos)搭建anyproxy环境

    前言 anyproxy可以跨平台使用,前面第一篇是搭建在windows机器上,本篇讲如何在linux上搭建anyproxy环境,当然有mac的小伙伴也可以用mac去搭建一个环境. nodejs安装 a ...

  • httprunner学习1-环境与登录接口案例

    前言 HttpRunner 是一款面向 HTTP(S) 协议的通用测试框架,只需编写维护一份 YAML/JSON 脚本,即可实现自动化测试. 使用环境: python 3.6 httprunner 1 ...

  • httprunner 2.x学习1-环境与登录接口案例

    前言 由于之前写过一个 httprunner 系列是针对 1.5.8 版本写的教程, httprunner版本更新的还挺快的,最近已经到3.x版本了,看了下改动还是挺大的. 但是考虑到目前还是有很多公 ...

  • jmeter压测学习47-发soap请求测试webservice接口

    前言 jmeter3 的版本可以新建一个SOAP/XML-RPC Request 的请求,直接测试webservice的接口. jmeter5.1.1 版本已经去掉了自带的SOAP/XML-RPC R ...

  • python菜鸟教程学习11:模块

    如果你从 Python 解释器退出再进入,那么你定义的所有的方法和变量就都消失了.为此 Python 提供了一个办法,把这些定义存放在文件中,为一些脚本或者交互式的解释器实例使用,这个文件被称为模块. ...

  • Java学习笔记(四):理解接口 事件监听器

    一.接口 父类和子类比较,父类是一个比子类更抽象的类.这个抽象体现在两个方面:一是父类的属性和方法比子类的少:二是,子类的方法比父类的方法更加具体. 当父类非常抽象时,或者我们仅仅知道这个类的对象应该 ...

  • VueJS中使用前端虚拟接口Mock.js

    一.简介 Mock.js是一个基于NodeJS的用来模拟API的工具,可以方便让前端开发人员在开发过程中用来模拟API接口,方便与后端的联调工作,尤其方便在Vue项目中使用. 官网地址: http:/ ...