Jmeter的Http代理服务器抛出java.net.URISyntaxException: Illegal character in query at index错误

7

我正在尝试使用Jmeter记录我的Web客户端-服务器通信。在配置Jmeter和浏览器以记录应用程序后,当客户端向服务器发出POST请求时,会出现以下错误。有什么办法可以对正在记录的URL进行编码吗?

java.net.URISyntaxException: Illegal character in query at index 238: http://localhost:8080/updateBoxCorrectionInstantly?examKey=16-17-%3ECBSE-%3ETERM%20I-%3ESA1-%3EVI-%3EScience-%3EA&studentName=AMOGH%20YOGESH%20KALE&studentRollno=3&studentND=-1&sheetName=cb8e806b32e9d670698655e0d2da10e3_img001210.jpg&box={%22$center%22:%22(66.0,%202253.0)%22,%22$conf%22:%22H%22,%22$corrected%22:true,%22$isAdminCorrected%22:true,%22$correction%22:%22-%22,%22$isDrawn%22:false,%22coords%22:[36,2214,96,2292],%22isTitle%22:false,%22pos%22:%22-%22,%22pred%22:%22-%22,%22boxTypeId%22:0,%22score%22:1}
at java.net.URI$Parser.fail(URI.java:2829)
at java.net.URI$Parser.checkChars(URI.java:3002)
at java.net.URI$Parser.parseHierarchical(URI.java:3092)
at java.net.URI$Parser.parse(URI.java:3034)
at java.net.URI.<init>(URI.java:595)
at java.net.URL.toURI(URL.java:949)
at org.apache.jmeter.protocol.http.sampler.HTTPHC4Impl.sample(HTTPHC4Impl.java:232)
at org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy.sample(HTTPSamplerProxy.java:62)
at org.apache.jmeter.protocol.http.sampler.HTTPSamplerBase.sample(HTTPSamplerBase.java:1075)
at org.apache.jmeter.protocol.http.proxy.Proxy.run(Proxy.java:212)

这可能对你有帮助:http://meta.stackexchange.com/questions/79057/curly-brackets-in-urls - SpaceTrucker
这是在录制或回放期间发生的吗?你尝试使用http://jmeter.apache.org/usermanual/functions.html#__urlencode函数了吗? - Naveen Kumar R B
你的请求是否真的是“POST”?为什么在发送POST请求时要发送这么多URL参数?你不能使用formurlencoded请求属性将它们作为请求体的一部分发送吗? - Siddharth Tyagi
2个回答

2
具体来说,这个异常是关于你的URI中花括号的问题:
/updateBoxCorrectionInstantly?<...>_img001210.jpg&box={

花括号被认为是不安全的

其他字符也不安全,因为网关和其他传输代理有时会修改这些字符。这些字符是“{”,“}”,“|”,“\”,“^”,“~”,“[”,“]”和“`”。所有不安全的字符必须始终在URL中进行编码。

因此,您可以将所有实例的{替换为%7B,将所有实例的}替换为%7D。我的猜测是录制器没有对它们进行编码,因为花括号不是“特殊”的字符(它们只是“不安全的”),而URI解析器不喜欢它们。因此,您可以将其视为JMeter录制器中的错误。因此,最简单的解决方案是将路径设置为:

/updateBoxCorrectionInstantly?examKey=16-17-%3ECBSE-%3ETERM%20I-%3ESA1-%3EVI-%3EScience-%3EA&studentName=AMOGH%20YOGESH%20KALE&studentRollno=3&studentND=-1&sheetName=cb8e806b32e9d670698655e0d2da10e3_img001210.jpg&box=%7B%22$center%22:%22(66.0,%202253.0)%22,%22$conf%22:%22H%22,%22$corrected%22:true,%22$isAdminCorrected%22:true,%22$correction%22:%22-%22,%22$isDrawn%22:false,%22coords%22:[36,2214,96,2292],%22isTitle%22:false,%22pos%22:%22-%22,%22pred%22:%22-%22,%22boxTypeId%22:0,%22score%22:1%7D

然而,我认为更优雅的解决方案是将所有参数(过了?标记)保存在参数部分中,这样有几个优点:
  1. 它有一个选项可以自动编码它们
  2. 您可以清楚地看到您发送的哪些参数
  3. 当您需要时,您可以使用变量而不是静态值(您也可以在路径中使用,但需要进行大量繁琐且容易出错的配置)
这是我如何创建此请求的屏幕截图: enter image description here 因为方法设置为GET,所有参数都将成为URL的一部分,但它们将被正确编码,因此它是这样发送的: enter image description here

因此,解决方案可以是以下任何一个:
  1. 在应用程序中对URL进行编码
  2. 记录请求并在启动记录的序列之前重新格式化请求
- AbiSivam

0

尝试在每个{}前使用$。谢谢


1
虽然这段代码可能解决了问题,但是包括说明如何以及为什么解决问题将有助于提高您的帖子质量,并可能导致更多的赞。记住,你正在回答未来读者的问题,而不仅仅是现在提问的人。请[编辑]您的答案以添加说明并指出适用的限制和假设条件。 - Yunnosch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接