【发布时间】:2017-06-20 07:33:03
【问题描述】:
我正在使用 Jmeter 对 API 进行负载测试。请求的标头有一个身份验证请求,需要我对 url+Nonce+Unix 时间戳进行 Base64 处理,并使用密钥对结果值进行 SHA256 处理。 以上需要在header中与Nonce和timestamp一起传递。
对于上述场景,我应该创建自定义函数还是使用任何预处理器?
【问题讨论】:
-
我没有要求程序,我只是在问最好的方法是什么!
我正在使用 Jmeter 对 API 进行负载测试。请求的标头有一个身份验证请求,需要我对 url+Nonce+Unix 时间戳进行 Base64 处理,并使用密钥对结果值进行 SHA256 处理。 以上需要在header中与Nonce和timestamp一起传递。
对于上述场景,我应该创建自定义函数还是使用任何预处理器?
【问题讨论】:
您可以通过Beanshell PreProcessor 进行如下操作:
将以下代码放入预处理器的“脚本”区域:
import org.apache.commons.httpclient.auth.DigestScheme; // necessary imports
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.codec.digest.DigestUtils;
import org.apache.jmeter.protocol.http.control.Header;
String url = sampler.getUrl().toString(); // get URL
String nonce = DigestScheme.createCnonce(); // get nonce
long timestamp = System.currentTimeMillis() / 1000L;
String combined = url + nonce + timestamp; // put everything together
byte[] base64 = Base64.encodeBase64(combined.getBytes()); // encode as Base64
String headerValue = DigestUtils.sha256Hex(base64); // encode SHA256
sampler.getHeaderManager().add(new Header("headerName", headerValue)); // add generated header to request
sampler 这里是对父 HTTP Request Sampler 类的简写引用,我相信它是 HTTPSamplerProxy,因此它的方法用于获取 URL 并添加生成的标头值。 有关在 JMeter 测试中使用 Beanshell 脚本的更多信息,请参阅 How to use BeanShell: JMeter's favorite built-in component 指南。
【讨论】:
最好的办法是在 JavaScript 模式下使用 BSF 预处理器来执行客户端通常会执行的所有操作。您必须使用客户端 JS 并对其进行修改以使其在没有 FORM 数据的情况下工作。
您可以像客户端一样在 JS 中构建整个标头。 BSF Pre-Processor 允许您访问 jmeter 运行时变量,因此您可以创建一个新变量来存储 SHA256 哈希值,并在需要授权的示例的 HTTP 标头管理器中使用它。
-添加
【讨论】:
下载的eclipse。 写了一个自定义的 jmeter 包。 将其作为 .jar 从 eclipse 导出到 jmeter lib/ext 文件夹。 在 beanshell 采样器中调用包函数
感谢您的回答
【讨论】:
@dmitrit 的回答很有帮助,但我需要对代码进行一些调整才能使其正常工作。这是我所做的:
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.codec.digest.DigestUtils;
String apiKey = vars.get("ApiKey");
String apiSecret = vars.get("ApiSecret");
long timestamp = System.currentTimeMillis() / 1000L;
String combined = apiKey + apiSecret + timestamp;
String generatedSignature = DigestUtils.sha256Hex(combined);
vars.put("GeneratedSignature", generatedSignature);
注意主要区别是:
DigestUtils.sha256Hex 采用 String 而不是字节数组。我认为由于填充,首先转换为字节会破坏哈希。vars,以便以后可以在 Jmeter 中以通常的方式 (${GeneratedSignature}) 使用它。ApiKey 和 ApiSecret 在 Jmeter 用户定义变量元素中的其他位置定义。有了这个,我能够按照他们在here发布的身份验证说明使用 Mashery 进行以下工作。
【讨论】: