anyproxy-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

转自:https://www.cnblogs.com/yoyoketang/p/10873026.html

原文地址:https://www.cnblogs.com/dreamhighqiu/p/10990049.html

时间: 2024-10-10 15:58:16

anyproxy-rule模块实现接口mock功能的相关文章

使用electron开发一个h5的客户端应用创建http服务模拟后台接口mock

使用electron开发一个h5的客户端应用创建http服务模拟后端接口mock 在上一篇<electron快速开始>里讲述了如何快速的开始一个electron的应用程序,既然electron是可以直接使用node环境编写程序的,那么我们就可以有很多可以处理的事,比如我们可以做个可视化的前端构建工具,或者我们可以建一个后台的管理系统.基于这两天,我简单的做了一个模拟后端接口的http服务. 它可以完成如下功能: 它可以创建http本地服务 它可以模拟后端的多种请求方式,如get.post.pu

使用mockserver来进行http接口mock

转载自:https://blog.csdn.net/heymysweetheart/article/details/52227379:(注,这个不是很符合我的要求,它主要的作用是可以通过简单的代码就能filter对方的请求options,然后做出对应的响应:而我需要的是一个能够开启为http服务端来测试客户端发来的http请求的工具,然后顺便看到了这篇感觉以后可能也会用到) 前言 进行单元测试时,必须要mock掉第三方的依赖调用,而mockserver提供了足够的api来支持这种http的moc

Python全栈 正则表达式(re模块正则接口全方位详解)

re模块是Python的标准库模块 模块正则接口的整体模式 re.compile 返回regetx对象 finditer fullmatch match search 返回 match对象 match.属性|方法 re模块的使用: regex = re.compile(pattern,flags = 0) 功能 : 生成正则表达式对象 参数 : pattern     正则表达式 flags  功能标志位,丰富正则表达式的匹配 返回值: 返回一个正则表达式对象 re.findall(patter

stm32 DCMI接口CROP功能使用

最近使用stm32F407单片机通过摄像头采集图像进行处理,其中使用到DCMI接口CROP功能.但在网上找了很久,有用的资料不多,只能自己研究,特将自己的使用方法记录下来. 1.如何设置CROP. 定义: DCMI_CROPInitTypeDef DCMI_CROPInitStruct; 参数设置: DCMI_CROPInitStruct.DCMI_CaptureCount=Width;                         //capcnt DCMI_CROPInitStruct.D

Springmvc借助SimpleUrlHandlerMapping实现接口开关功能

一.接口开关功能 1.可配置化,依赖配置中心 2.接口访问权限可控 3.springmvc不会扫描到,即不会直接的将接口暴露出去 二.接口开关使用场景 和业务没什么关系,主要方便查询系统中的一些状态信息.比如系统的配置信息,中间件的状态信息.这就需要写一些特定的接口,不能对外直接暴露出去(即不能被springmvc扫描到,不能被swagger扫描到). 三.SimpleUrlHandlerMapping官方解释 SimpleUrlHandlerMapping实现HandlerMapping接口以

Python+request 分模块存放接口,多接口共用参数URL、headers的抽离,添加日志打印等《三》

主要介绍内容如下: 1.分模块存放接口 2.多接口共用参数URL.headers的抽离为配置文件 3.添加日志打印 4.一个py文件运行所有所测的接口 如上介绍内容的作用: 1.分模块存放接口:方便多人协作,对模块接口的分开存放,方便后期新增模块接口的录入,也方便接口出现报错后,定位模块 2.多接口共用参数URL.headers的抽离为配置文件: (1)URL:单独进行配置文件中的修改,主要是方便后期接口域名出现变化,方便更改,示例,本次URL前缀为:https://127.0.0.1,下次开发

RDIFramework.NET ━ .NET快速信息化系统开发框架 V3.2-&gt;新增模块管理界面导出功能(可按条件导出)

导出功能在很多应用场景中都需要,RDIFramework.NET V3.2版本在模块管理界面新增了导出功能,方便管理员对所有配置的模块进行管理. 一.Web版模块管理导出功能 Web版本的模块导出功能如下图所示: 单击导出按钮,在弹出的“导出Excel数据”窗口中,可以选择要导出的列,如下图所示: 单击确定按钮,即可把选中的列导出到Excel中,如下: 二.WinForm版模块管理导出功能. 在WinForm中需要导出数据,只需要调用我们的公共导出接口即可.所有导出的接口已经在BaseForm中

引用nodejs的url模块实现url路由功能

我们在本地创建服务器之后需要写不同的后缀名来访问同一个站点的不同页面,如果不实现路由功能.则每次访问localhost:3000 不论后面写什么  比如localhost:3000/index.localhost:3000/detail...最终都会访问同一个地址:而用url路由则可以实现访问不同的页面:在实现url路由功能之前,首先需要引入url模块:const url = require('url');  nodejs 为我们提供了url模块,并且提供了url模块的一些方法: 最终要的方法是

19、手把手教你Extjs5(十九)模块Grid的其他功能的设想

经过对自定义模块和Grid的设计和编码,现在已经能对一个有配置信息的模块来生成界面并进行一些简单的CURD操作.由于这是一个全解释性的前台的架构,因此你想到的任何新主意都可以放到所有的模块中. 比如对于“Grid列宽的自动适应”这个功能,我们可以在系统设置项里加入“列宽自适应模式”,下面有三个选项:1.不自动适应:2.首次加载数据时自动适应:3?每次加载数据都自动适应.因为列宽自动适应需要时间,如果字段很多,记录很多会比较慢,因此可以加入这个设置,使用户根据自己的喜好来设置.还可以对每种类型的字