自动发送请求并保存响应

Posted

技术标签:

【中文标题】自动发送请求并保存响应【英文标题】:Automate sending a request and saving the response 【发布时间】:2018-04-02 07:59:32 【问题描述】:

有一个我想点击并保存响应的 URL。 URL id 每次都需要递增并保存响应。例如 -

首次获取请求 - http://google.com/getdata/?Id=1

第一反应 - 一个

第二个请求 - http://google.com/getdata/?Id=2

第二个响应 - 两个

等等……

我想每次都增加 id 来点击请求并保存响应

我尝试过使用提琴手,但无法弄清楚如何增加 id 并保存响应。

附: - 我必须获得大约 6,00,000 次点击

【问题讨论】:

您打算使用哪种脚本语言? 您能详细说明您希望如何保存回复吗? 【参考方案1】:

既然提到了“Postman”标签,我可以帮助您了解如何在 Postman 中实现它。 Postman 有一个很好的使用“变量”的特性。

您可以使用环境变量或全局变量。

在他们的文档中了解更多信息: https://www.getpostman.com/docs/v6/postman/environments_and_globals/variables

您可以使用全局变量(例如“counter”)并将其设置为 1 / 任何您想要的起点。 然后你可以像这样修改你的请求: http://google.com/getdata/?Id=iteration

现在,在请求的 Tests 脚本中,您可以编写以下脚本

let i = parseInt(pm.globals.get('iteration')) + 1; pm.globals.set('iteration', i);

此外,要访问响应,您可以在 Test 脚本中使用以下命令: console.log(pm.response); // Use pm.response as per your needs

将请求保存在集合中。 现在加载 Postman's Runner 并选择集合。 现在您可以将迭代计数设置为 6,00,000 并点击运行!

请记住,大量迭代会导致性能下降。

【讨论】:

我收到一个错误,“该请求没有任何测试” 这不是错误。跑步者表明你没有设置任何测试。但是,如果您在请求中编写了 console.log,那么 1)。启动 Postman 控制台(查看 > Postman 控制台)2)。现在使用 runner 运行集合。您会在控制台中看到您的回复。 问题是它显示 iteration 为未解决的变量,变量未在当前环境中定义 哦,您是否设置了一个环境,然后在其中放置了一个变量“迭代”?当您使用跑步者时,您需要从下拉列表中选择“环境” - 它就在左侧迭代框的上方。【参考方案2】:

在JMeter中你需要点击,Ctrl+0和Ctrl+1来创建,线程组和HTTP Request

在线程组中将您需要的点击数放入Number of Threads (users)

在 HTTP 请求中放入 Server Name or IP www.google.com 和 Path /getdata/?Id=$__threadNum

__threadNum 将创建从线程 1 到命中数越来越多的数字。

对于少量点击或调试,您可以添加View Results Tree,通过在测试计划/线程组级别单击 Ctrl+9 来查看请求/响应。

要保存响应,请使用后处理器,尤其是通过单击 Ctrl+2 在 HTTP 请求下方添加 Regular Expression Extractor。

允许用户使用 Perl 类型的正则表达式从服务器响应中提取值。作为后处理器,该元素将在其范围内的每个 Sample 请求之后执行,应用正则表达式,提取请求的值,生成模板字符串,并将结果存储到给定的变量名中。

需要注意的是load testing你需要使用非GUI模式,这意味着使用命令行调用jmeter作为jmeter -n -t myTest.jmx

您将使用命令行模式(称为非 GUI 模式)来运行它以进行负载测试。 不要使用 GUI 模式运行负载测试!

要将所有响应保存到一个文件,请参阅save response data,或者如果您想为每个线程/用户保存文件,您可以添加Save Responses to a file

【讨论】:

感谢您的回复。我无法理解保存响应的过程。能否请您详细说明。 @Karma5 添加了有关保存回复的更多详细信息【参考方案3】:

提琴手:

打开脚本编辑器(Control + r)然后在 OnBeforeResponse

中添加以下代码
 static function OnBeforeResponse(oSession: Session) 
        if(oSession.oRequest["X-SAVE-ME"] != "")
        
            oSession.SaveResponseBody("C:\\tempfiddler\\" + oSession.SuggestedFilename);
        

    

转到“作曲家”标签并在 URL 中包含带有任何值的标题 X-SAVE-ME,将您的 ID 替换为 #(就像这样:http://google.com/getdata/?Id=#) fiddler 现在会在执行前询问 ID 的开始和结束值;

【讨论】:

【参考方案4】:

请在下面找到您的场景的快照。

Scenario_Testplan

首先,转到用户属性并输入“sample_variables = ID, Response_File_Name”或您为变量选择的任何名称。重启jmeter。 创建以下计划:-

    CSV 数据集配置具有增量值和响应文件名 HTTP 请求将使用 $ID 将响应保存到文件将使用 $Response_File_Name

希望这会有所帮助。

【讨论】:

【参考方案5】:

我会通过命令行执行此操作,使用带有 curl 到 URL 的 while 循环,将标准输出上的正文结果存储到文件中。它看起来像这样:

for i in 1..600000; do curl "http://google.com/getdata/?id=$i" > body-result-id-$i; done

我无法测试上面的行,因为我现在无法访问控制台,但我认为它应该可以工作。

【讨论】:

【参考方案6】:

在 Burp 中,您可以使用 Intruder 工具执行此操作。首先,在 Burp 中捕获一个示例请求。如果您不确定如何执行此操作,请参阅getting started 文档。

然后右键单击请求并选择“发送给入侵者”。

在 Intruder 中的 Positions 选项卡中,首先单击“Clear”,然后选择要更改的部分,然后单击“Add”

在 Payloads 选项卡中,将 Payload 类型选择为“Numbers”并配置范围。

点击“开始攻击”

更多信息,请咨询documentation。

【讨论】:

【参考方案7】:

另一个解决方案是您可以在 jmeter 中使用 Counter。你可以从下面的路径中找到 线程组 > configElement > 计数器。

    根据需要配置计数器。 为计数器提供参考名称 i。 在您的请求中使用变量

更多信息。

【讨论】:

以上是关于自动发送请求并保存响应的主要内容,如果未能解决你的问题,请参考以下文章

发送响应并继续执行脚本 - PHP [重复]

如何在 Zend_framework 中不呈现响应的情况下发送保存的请求

爬虫的基本理念

登录验证码的请求思路

HTTP协议入门

打印日志查看调接口时间