我提取了一个API键,但是JMeter不喜欢提取的正则表达式中的特殊字符。
下面是一个示例
我使用正则表达式提取器从上一页提取数据。提取的值为:TEST|1TWO3-TEST
错误信息
稍后使用此值时,我收到以下消息:
java.net.URISyntaxException: Illegal character in query at index 5: (URL+Regex)
at java.net.URI$Parser.fail(Unknown Source)
at java.net.URI$Parser.checkChars(Unknown Source)
at java.net.URI$Parser.parseHierarchical(Unknown Source)
at java.net.URI$Parser.parse(Unknown Source)
at java.net.URI.<init>(Unknown Source)
at java.net.URL.toURI(Unknown Source)
at org.apache.jmeter.protocol.http.sampler.HTTPHC4Impl.sample(HTTPHC4Impl.java:286)
at org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy.sample(HTTPSamplerProxy.java:74)
at org.apache.jmeter.protocol.http.sampler.HTTPSamplerBase.sample(HTTPSamplerBase.java:1146)
at org.apache.jmeter.protocol.http.sampler.HTTPSamplerBase.sample(HTTPSamplerBase.java:1135)
at org.apache.jmeter.threads.JMeterThread.process_sampler(JMeterThread.java:434)
at org.apache.jmeter.threads.JMeterThread.run(JMeterThread.java:261)
at java.lang.Thread.run(Unknown Source)
硬编码值
当对值进行硬编码时,它工作正常:TEST|1TWO3-TEST
关于如何通过正则表达式提取器让正则表达式看起来像我的硬编码值的任何建议?
您需要对参数进行url编码。
在HTTP请求中,确保选中“编码?”在参数表中:
如果参数位于路径中,则可以将其移动到 GET 请求的表中。
如果您最终需要编码,然后在提取器后使用JSR 223后处理器,检查缓存脚本并添加是否您的regexp提取器创建了varName例如:
import java.net.URLEncoder;
String value = URLEncoder.encode(vars["varName"], "UTF-8");
vars.put("ENCODE_VALUE", value);
然后,您可以通过 ${ENCODE_VALUE} 使用该变量
您的错误不在正则表达式中,而是在如何使用数据方面的后置词。使用正则表达式提取值后,请确保对数据进行如下编码:
String q = "TEST|1TWO3-TEST";
String url = URLEncoder.encode(q, "UTF-8");
现在,您可以使用< code>url进行任何操作。我假设您已经将< code>TEST|1TWO3-TEST提取到一个变量中。
测试
// Output: TEST%7C1TWO3-TEST
只需使用 urlEncode() 函数包装来自正则表达式提取器的变量,如下所示:
${__urlencode(${foo})}
演示:
查看How to Use JMeter Functions系列文章,了解有关在JMeter测试中使用函数的更多信息。
JMeter插件项目中也有一些有用的插件。