wrk入门(2):发送post请求
1 引言
wrk的命令行参数只能发送类似于get、delete这种不在请求体中带参数的http请求,如果要发送post这类请求,必须要写Lua脚本。由于wrk具有内置的LuaJIT(用于Lua的即时编译器),可以使用Lua脚本进行扩展。
也不必担心没学过Lua不会写脚本,Lua的可读性很强,类似于Python。通过下面简单的示例,完全可以模仿出一个更高级的脚本,况且官方也写了好几个模板供我们使用。
2 脚本结构
在写脚本之前,先研究一下脚本结构,该结构也反映了wrk的内部逻辑,有助于我们更好的理解和编写脚本。如下图:
图示为wrk的执行流程,分为以下几个阶段:
1. 解析IP地址。
2. 设置线程。
3. 执行压力测试,也被称为运行阶段。
4. 完成测试。
上图只是一个单线程的图示。如果是多线程,流程图会变成这样:
此外,running(运行阶段)还可以分为三个步骤:init(初始化),request(请求)和response(响应)。
总结一下:wrk一次运行过程有1.resolve IP阶段;2. setUp阶段;3. running阶段(分为init、request、reponse);4.done阶段; 在上述的几个阶段中,都有对应的变量或方法提供调用。
3 不同阶段的方法和变量
这个小节就是介绍一下各个阶段对应的方法和一个wrk全局表,大致过一遍眼熟一下就行,配合后面的脚本示例看简直效果拔群。
wrk全局表,存着一些变量供后面的方法调用:
wrk.format方法:返回一个HTTP请求字符串,该字符串是传递的参数与wrk表中的值的合并。
wrk.lookup方法:返回一个表,其中包含主机和服务对的所有已知地址。这对应于POSIX getaddrinfo()函数。
wrk.connect方法:如果可以连接到请求地址,则返回true,否则返回false。该地址必须是wrk.lookup方法返回的地址。
以下全局变量是可选的,并且如果定义必须是函数,也对应着上面流程图中的各个阶段,下面将一个个介绍:
Setup阶段:
设置阶段是ip地址已经被成功解析并且线程初始化完毕但是还未启动的阶段,用于将数据传递给线程。每个线程调用一次setup()并接收代表该线程的userdata对象。
只能通过get()/ set()方法设置或获取线程运行时需要的全局变量,变量值可以是布尔值,nil,数字和字符串值或表的值。
thread:stop()只能在线程运阶段调用。
Running阶段:
运行阶段从调用init()方法开始,之后循环调用request()和response()方法。
init()每个线程初始化时调用。可以接受命令行参数,但是为了和wrk的命令行参数做区分,参数名以“--”开头。比如:
delay()返回延迟发送下一个请求的毫秒数。
request()需要为每个请求返回HTTP对象。在此函数中,我们可以修改method,headers,path,和 body。可以使用wrk.format()辅助函数来生成请求对象。比如:
response()在响应返回时调用。需要status(http响应状态),headers(http响应头),body(http响应体)三个参数,解析响应头和响应体非常消耗计算机资源,因此,如果调用init()方法之后全局变量response是nil,wrk将不会解析响应头和响应体。
Done阶段:
当所有请求都已经完成并且请求结果已经被统计时调用。
done()函数接收一个包含结果数据的表(表是lua内置数据类型),以及两个统计对象:每个请求的延迟时间(以微秒为单位)、每个线程的请求速率(以每秒请求数为单位)。Done函数内,可以使用以下属性:
4 Post请求示例
首先,在wrk1(博主本地虚拟机)上创建脚本文件夹和文件
添加以下内容到post.lua:
这个脚本非常简单,仅仅修改了全局wrk对象属性和重载了response()方法,response()只是打印了一下响应体内容。使用带有wrk的Lua脚本只需将文件路径附加到-s参数后面即可:
运行结果如下,可以看见已经登录成功并且返回了用户token:
上面实现了post请求,但是还有提升效率的方法,比如每次测试都要输入一遍命令未免有点繁琐,所以可以考虑写一个简单的shell脚本来更快捷的进行测试。
创建shell文件并输入命令代码,如下:
运行结果:
未完待续........
__EOF__

本文链接:https://www.cnblogs.com/zhangtu/p/14350625.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!