【问题标题】:JMeter Alter HTTP Headers During TestJMeter 在测试期间更改 HTTP 标头
【发布时间】:2014-08-23 22:20:18
【问题描述】:

我正在尝试使用 JMeter 测试 HTTP 服务。 HTTP 服务需要通过简单的不记名令牌机制进行身份验证。我正在尝试如下进行:

  1. POST 身份验证请求
  2. 将令牌存储为变量
  3. 将授权 HTTP 标头设置为存储变量
  4. 请求受保护的资源
  5. 评估性能

到目前为止,我已经能够发布请求、获取令牌、使用正则表达式提取它、将其保存到变量中,并断言该变量已正确设置。

问题在于将变量放入 HTTP 标头。在“标题管理器”中,值设置如下:

不幸的是,当发出下一个请求时,它们的授权标头具有值“Bearer”。在互联网上搜索让我相信标题是configured before the thread starts,这可以解释“承载者”

我的采样/分组/嵌套如下:

由于授权标头格式错误,所有测试都通过以获得受限资源,但失败并返回 400。

我觉得我错过了一些非常明显的东西,和/或以错误的方式解决这个问题。

【问题讨论】:

    标签: http-headers jmeter


    【解决方案1】:

    您可以使用Beanshell PreProcessor 动态构造您的授权标头,如下所示:

    1. 添加 empty HTTP 标头管理器作为需要授权的请求的子项

    2. 使用以下代码将 Beanshell PreProcessor 添加为同一请求的子项:

      import org.apache.jmeter.protocol.http.control.Header;
      
      sampler.getHeaderManager().add(new Header("Authorization","Bearer " + vars.get("BEARER")));
      

    这将使用BEARER 变量构造完全动态的标头。

    • samplerHTTPSamplerProxy 类的简写,它可以访问父 Sampler 实例
    • varsJMeterVariables 类的实例,它允许对当前上下文(通常是当前线程组)范围内可用的所有 JMeter 变量进行读/写访问

    请参阅How to use BeanShell: JMeter's favorite built-in component 指南,了解有关 Beanshell 脚本和某种 Beanshell 食谱的更多详细信息。

    【讨论】:

    • 如果这存在于循环中,您可能还需要在添加之前删除以防止重复:sampler.getHeaderManager().removeHeaderNamed("Authorization");
    • 这对我仍然不起作用。我可以使用这种机制添加其他标头,但我仍然无法添加授权标头。使用 JMeter 3.0。
    • 好的,我现在开始工作了。我错了。使用 wireshark 查看请求表明正在设置标头,即使 UI 没有显示。
    • 作为记录,HTTP标头管理器不需要为空(如答案中强调的那样)。请求应该只是一个 HTTP 标头管理器,可以是空的,也可以用值填充。
    • 当我添加要删除的语句时,它甚至没有设置标题。示例代码:sampler.getHeaderManager().removeHeaderNamed("Authorization"); sampler.getHeaderManager().add(new Header("Authorization","Bearer " + vars.get("BEARER"))); 任何人都可以建议我,我在这里做错了什么?
    【解决方案2】:

    在 Beanshell 预处理器中使用下面的代码

    导入 org.apache.jmeter.protocol.http.control.Header; sampler.getHeaderManager().remove(0);

    更多详情请参考:-

    https://jmeterblogb.blogspot.in/2016/10/add-empty-header-in-jmeter-sample.html

    【讨论】:

      【解决方案3】:

      查看此论坛帖子:http://www.jmeter-archive.org/Variables-in-HTTP-headers-td4579331.html

      您需要将登录名移到控制器下。就我而言,我使用了 Only Once 控制器。然后在控制器之后,您可以添加 HTTP 标头管理器,其授权标头为“Bearer ${BEARER}”,它将读取您的变量。这比其他答案更好,因为这样您就不需要在每个请求下复制 BeanShell PreProcessor。我的树看起来像这样:

      【讨论】:

      • 这对我有用。但是,我怎样才能只登录一次并在多个线程之间共享令牌而无需再次执行登录请求。
      猜你喜欢
      • 2011-06-13
      • 1970-01-01
      • 2017-05-31
      • 1970-01-01
      • 2014-12-10
      • 1970-01-01
      • 2020-03-16
      • 2016-11-19
      • 2014-02-17
      相关资源
      最近更新 更多