在Jmeter中从提取的正则表达式中更改特殊字符

时间:2017-05-03 13:53:26

标签: regex jmeter

我提取了一个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%7C1TWO3-TEST

有关如何通过正则表达式提取器使正则表达式看起来像我的硬编码值的任何建议吗?

4 个答案:

答案 0 :(得分:2)

您需要对参数进行url编码。

HTTP Request中,请确保选中“编码?”在参数表中:

enter image description here

如果参数在路径中,您可以在表中移动它以获取GET请求。

如果您最终需要编码,请在提取器后使用JSR 223后处理器,检查缓存脚本并添加,如果您的正则表达式提取器创建varName,例如:

 import java.net.URLEncoder;
 String value = URLEncoder.encode(vars["varName"], "UTF-8");  
 vars.put("ENCODE_VALUE", value);

然后,您可以通过 $ {ENCODE_VALUE}

使用变量

答案 1 :(得分:1)

您的错误不在正则表达式中,而是在您使用数据的方式之后。使用正则表达式提取值后,请确保对数据进行编码,如下所示:

String q = "TEST|1TWO3-TEST";
String url = URLEncoder.encode(q, "UTF-8");

现在您可以使用url进行任何操作。我假设您已将TEST|1TWO3-TEST提取到变量中。

Test

// Output: TEST%7C1TWO3-TEST

答案 2 :(得分:0)

使用urlEncode() function包装来自正则表达式提取器的变量,如:

${__urlencode(${foo})}

演示:

JMeter urlencode function

查看How to Use JMeter Functions文章系列,了解有关在JMeter测试中使用函数的更多信息。

通过JMeter Plugins project提供的有用信息很少。

答案 3 :(得分:0)

感谢您的回复,我做了以下工作。

String var1 = vars.get("var1"); 
String newVar1 = var1.replaceAll("\\|","%7C");
vars.put("var1", newVar1);

由于