Ruby 如何在JMeter中对请求进行签名?

Ruby 如何在JMeter中对请求进行签名?,ruby,time,jmeter,performance-testing,Ruby,Time,Jmeter,Performance Testing,对于单个调用,我有这样一个ruby代码来生成API请求: api_key = 'some-key-here' shared_secret = 'very-secretive-secret' timestamp = Time.now.to_i.to_s sig = Digest::MD5.hexdigest( api_key+shared_secret+timestamp ) request_url = "#{production_point}/#{request}?apikey=#{api_

对于单个调用,我有这样一个ruby代码来生成API请求:

api_key = 'some-key-here'
shared_secret = 'very-secretive-secret'

timestamp = Time.now.to_i.to_s
sig = Digest::MD5.hexdigest( api_key+shared_secret+timestamp )

request_url = "#{production_point}/#{request}?apikey=#{api_key}&sig=#{sig}&format=json"
puts request_url
但生成的请求url将仅在相对较短的时间内工作,这取决于当前的时间戳

现在我需要做一些性能测试,在JMeter中,我曾经使用一个包含URL/请求/关键字列表的文件,我需要使用这些URL/请求/关键字来关闭服务器,但这些都是静态URL。现在我需要测试一个服务,它要求每个请求都以上面描述的方式签名,我不能只使用列表

我知道JMeter中有一个md5函数。但是我应该把api_密钥和共享_秘密放在哪里(秘密本身不是URL的一部分)

请有人教我如何为需要使用md5 ed签名(需要时间戳)对每个请求进行签名的服务设置JMeter测试?

您可以使用“Beanshell”测试元素之一,即在请求之前生成正确的签名值

  • 将Beanshell预处理器添加为执行该API调用的HTTP请求的子级
  • 将以下代码放入预处理器的“脚本”区域(它基本上相当于您的Ruby脚本)

  • 在需要时,将生成的签名值引用为
    ${sig}
    ,因为它已存储到

  • 演示:

    参考资料:

    • (又名
      vars

    Dmitry,请您展示一个屏幕截图,说明变量“sig”在HTTP请求中是如何引用的(=比BeanShell预处理器高一级)?我需要创建一个没有值的变量吗?或者HTTP请求自动从子级获取“sig”变量,并且它可以在URL中使用,而无需任何额外的努力?DigestUtils是否已弃用?这似乎不再有效了?
    import org.apache.commons.codec.digest.DigestUtils;
    
    String api_key = "some-key-here";
    String shared_secret = "very-secretive-secret";
    long timestamp = System.currentTimeMillis()/1000;
    
    String sig = DigestUtils.md5Hex(api_key + shared_secret + timestamp);
    
    vars.put("sig", sig);
    
    log.info("Signature: " + sig);