从 JMeter HTTPSampler 中删除 Content-Type 标头

问题描述 投票:0回答:2

我有一个针对 Web 应用程序的 JMeter (2.12 r1636949) 测试计划。线程组中的一个有问题的步骤是应用程序中远程 URI 的 HTTP 采样器,该采样器需要不带

Content-Type
标头的 HTTP POST,否则会失败并出现 HTTP 500 错误。更改 Web 应用程序不是一种选择 - 使用 Fiddler 检查流量表明浏览器有能力执行此操作。

如何抑制从 JMeter HTTPSampler 发送 HTTP 标头

Content-Type

我尝试过的:

  • 将 HTTP 标头管理器添加到采样器,并将
    Content-Type
    设置为空白(并设置为“REMOVEME”)
  • 使用以下行添加 BeanShell 预处理器:
    sampler.getHeaderManager().removeHeaderNamed("Content-Type");
  • 设置 HTTPSampler“浏览器兼容标头”复选框,因为根据 其文档,这可以抑制
    Content-Type
    ,但显然 如果设置了“使用 multipart/form-data for POST”。我无法设置它,因为 webapp URI(chiba XForms
    ...Flux/exec/Flux.fireAction
    路径)也不接受 multipart。该应用程序似乎严格要求换行符分隔的正文数据,但没有内容类型。

上述情况都不会导致 JMeter 成功调用远程资源,或者就此而言,避免发送

Content-Type
。我将在“查看结果树”中看到的内容与 Fiddler 中记录的应用程序流量进行了比较,我所看到的不同之处是缺少
Content-Type

来自 Fiddler 的原始请求示例,我正在尝试在 JMeter 线程组中重新创建:

POST http://hostname/AppName/Flux/exec/Flux.fireAction HTTP/1.1
Accept: */*
Accept-Language: en-us
Referer: http://...referer url...
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/6.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; InfoPath.3; MS-RTC LM 8)
Host: hostname
Content-Length: 143
DNT: 1
Connection: Keep-Alive
Pragma: no-cache
Cookie: JSESSIONID=0000N1QLLDQCQycbKzkeaYFfCr3:18ujjmvjf

callCount=1
c0-scriptName=Flux
c0-methodName=fireAction
c0-id=9983_1420240552716
c0-param0=string:C187
c0-param1=string:1420240546765
xml=true

更新:

我能够通过一些 JMeter hack 成功调用服务器端 URL。通过遵循 2.12 source(我将采样器设置为 HttpClient 4 确保)并仔细检查 HTTP Sampler docs(特别是用于发送文件的

MIME-Type
注释),我将采样器切换到 Parameters 选项卡并移动以前的正文数据内容现在作为single 文件引用为文本文件,并使用no 参数名称和内容类型设置为
text/plain
进行发送。但是,正文内容需要是动态的,因此静态文件不行 - 我需要引用几个线程组变量。我目前正在研究如何读取/写入文件(也许作为预处理器)以线程安全的方式设置此内容,但这似乎是一个巨大的黑客攻击。我认为这可能是一个值得的补丁,允许没有内容类型的正文数据,特别是考虑到默认情况下不确定的
TODO
comment

jmeter
2个回答
0
投票

我通过在 HTTP Sampler 之前添加一个 BeanShell Sampler 来解决这个问题,它返回动态文本(使用

vars.get(...)
)作为其“响应”。在该采样器中,我使用了“保存对文件的响应”侦听器,使用每个虚拟用户文件名的函数,将文件名存储为变量。在 HTTP Sampler 中,我在
File Path
字段中使用了此变量,其中
Parameter Name
为空,
text/plain
MIME-Type.

下面是 BeanShell 脚本(如果这对任何人有帮助的话)以及解决方法的屏幕截图。

//script for prepping Flux.fireAction request
sb = new StringBuilder();
NL = System.getProperty("line.separator");
sb.append("callCount=1").append(NL);
sb.append("c0-scriptName=Flux").append(NL);
sb.append("c0-methodName=fireAction").append(NL);
sb.append("c0-id=2728_1420218928279").append(NL);
sb.append("c0-param0=string:").append(vars.get("chibaIdFromRetrieveButton")).append(NL);
sb.append("c0-param1=string:").append(vars.get("chibaSessionKey")).append(NL);
sb.append("xml=true");
return sb.toString();

bean shell sampler

enter image description here

enter image description here


0
投票

我找到了解决问题的简单方法。解决方法是将“客户端实现”从 HttpClient4 切换到 Java。

Java 实现似乎没有为空的

Content-Type
PUT
请求设置
POST
标头。

您可以在“高级”部分切换 HTTP 请求所使用的实现:

© www.soinside.com 2019 - 2024. All rights reserved.