【问题标题】:Apache Bench and POST dataApache Bench 和 POST 数据
【发布时间】:2011-04-10 15:02:03
【问题描述】:

我正在尝试使用 apache bench 在我的 rails 应用程序中加载测试创建操作,但 ab 似乎没有发送 POST 数据 - 尽管它确实正确提交了 POST 而不是 GET 请求。

这是我运行的命令:

ab -n 1 -p post -v 4 "http://oz01.zappos.net/registrations"

这是帖子文件的内容:

authenticity_token=M18KXwSOuIVbDPZOVQy5h8aSGoU159V9S5uV2lpsAI0

rails 日志显示一个 POST 请求通过,但没有显示任何正在发布的参数:

Started POST "/registrations" for 10.66.210.70 at Thu Sep 09 17:48:06 -0700 2010
  Processing by RegistrationsController#create as */*
Rendered registrations/new.html.erb within layouts/application (14.0ms)
Completed 200 OK in 24ms (Views: 14.6ms | ActiveRecord: 0.1ms)

而来自浏览器的 POST 请求会导致此日志条目:

Started POST "/registrations" for 192.168.66.20 at Thu Sep 09 17:49:47 -0700 2010
  Processing by RegistrationsController#create as HTML
  Parameters: {"submit"=>"true", "authenticity_token"=>"AfNG0UoTbJXnxke2725efhYAoi3ogddMC7Uqu5mAui0=", "utf8"=>"\342\234\223", "registration"=>{"city"=>"", "address"=>"", "name"=>"", "zip"=>"", "optin"=>"0", "state"=>"", "email"=>""}}
Rendered registrations/new.html.erb within layouts/application (13.7ms)
Completed 200 OK in 24ms (Views: 14.3ms | ActiveRecord: 0.1ms)

最后,这是 ab 为请求记录的内容:

---
POST /registrations HTTP/1.0
User-Agent: ApacheBench/2.0.40-dev
Host: oz01.zappos.net
Accept: */*
Content-length: 63
Content-type: text/plain


---

为什么不获取帖子数据?

如果“post”文件不存在,那么我会收到一条错误消息,说它找不到文件,所以我至少知道它正在找到文件...

【问题讨论】:

  • 我有一个几乎完全一样的问题,除了这次有一个 150k 的文件,ab 似乎只在我的脚本中吐出 80k 的文件,由于内容长度,该脚本坐在那里阻塞等待更多的 IO。你有好运吗?

标签: ruby-on-rails apachebench


【解决方案1】:

也许您需要 man ab 中所述的 -T 选项:-

ab -n 1 -p post -v 4 -T application/x-www-form-urlencoded "http://oz01.zappos.net/registrations"

我用 Django 进行了测试,似乎 Django 并不真正关心内容类型标题(无论我是否使用 -T,它都会显示 POSTed 内容)但 Rails 可能想要它。

【讨论】:

  • 我对@9​​87654322@ 也有类似的问题,即使使用-T 选项,我不认为就是这样。
  • 同样的问题,这在修复内容类型中的错字后对我有用。修正了答案。
  • 我将内容类型标头提供给 -T,这是我的问题 'Content-Type:application/json' 而不仅仅是 application/json
【解决方案2】:

老问题,但为了其他搜索 SO 的人,这就是我的工作方式。

确保您的帖子文件经过正确的 URL 编码,最后没有额外的非打印字符或任何内容。最没有错误的方法就是用代码创建它。我用一些 python 来创建我的:

>>> import urllib
>>> outfile = open('post.data', 'w')
>>> params = ({ 'auth_token': 'somelongstringthatendswithanequalssign=' })
>>> encoded = urllib.urlencode(params)
>>> outfile.write(encoded)
>>> outfile.close()

示例输出:

auth_token=somelongstringthatendswithanequalssign%3D

【讨论】:

  • 您缺少负载测试部分;)
  • 你是对的。当然,您仍然需要使用新的、正确编码的 post.data 文件实际运行 ab。仅生成 post.data 文件对测试您的网络服务器(或任何它......)几乎没有作用
  • 在 Python 3.8 中,我必须:from urllib.parse import urlencode 并调用:encoded = urlencode(params)
猜你喜欢
  • 2011-02-05
  • 2012-09-05
  • 1970-01-01
  • 1970-01-01
  • 2017-01-31
  • 2011-05-04
  • 2014-08-22
  • 2012-02-17
  • 1970-01-01
相关资源
最近更新 更多