【问题标题】:Why Browser can issue XHR POST request while JMeter and Curl cant为什么浏览器可以发出 XHR POST 请求而 JMeter 和 Curl 不能
【发布时间】:2018-03-02 04:29:08
【问题描述】:

调查网络资源的行为我发现有一个 POST 请求(如 Web Inspector 中所述)以 XHR (AJAX) 形式发出,带有一些参数和请求标头。其中有一个 X-Requested-With: XMLHttpRequest 表示请求是 AJAX。

当我尝试使用 JMeter 或 Curl 发出相同的请求时,我收到一条错误消息,告诉您以下内容(提供所有必要的标头):

不支持请求方法“POST”

我有我感兴趣的应用和服务的来源,其定义如下:

@Controller
@RequestMapping(value = "/myrestservice")
public class MyRestServiceController {
// some code goes here

    @RequestMapping(value = "/get", method = RequestMethod.POST, produces = "application/json")
    @ResponseBody
    public Map<String, DataDTO> getRestServiceResponse(@RequestParam("list") final List<String> itemsList, final Model model)

所以它必须接受 POST 请求。它在运行时确实,但它不适用于我尝试手动提出这样的请求。

知道为什么会发生这种差异吗?

这是从查看结果树截取的请求: POST https:${address-goes-here}/productstock/get/

POST 数据: CSRFToken=720fe025-d511-4a5e-ab17-d1ea8e0b0aa3&productList=productList%3D000000000010000545%2C000000000010000553%2C000000000010012169

Cookie 数据: JSESSIONID=60409DB1AFD720283100BCA212CD42DE.app11; megapolisstorefrontRememberMe=cGV0cjE0NzhAbWFpbC5ydToxNTIwMjQzMjExMzc5Ojk2Z> TkzN2FlNzY5MDk5NmY4ZDk5N2JhMTQ5MmEzYmI5; > 加速器SecureGUID=ca22a2f520a00f5cc3efa3acb6599a5f0e081c85

请求标头:连接:保持活动接受:应用程序/json, 文本/javascript
X-Requested-With:XMLHttpRequest 内容类型: 应用程序/x-www-form-urlencoded; charset=UTF-8 来源: ${地址到这里}
推荐人: ${address-goes-here}/%D0%9A%D0%B0%D1%82%D0%B0%D0%BB%D0%BE%D0%B3/%D0%9D%D0%B0%D0%BF %D0%B8%D1%82%D0%BA%D0%B8/%D0%AD%D0%BD%D0%B5%D1%80%D0%B3%D0%B5%D1%82%D0%B8% D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B5-%D0%BD%D0%B0%D0%BF%D0%B8%D1%82%D0%BA%D0 %B8/c/2006
内容长度:147
主机:${address-goes-here}
用户代理: Apache-HttpClient/4.5.3 (Java/1.8.0_112)

【问题讨论】:

  • 我猜你必须把正确的内容类型标题Content-Type: application/json
  • 你能展示你的工作(在网络检查器中)而不是在 JMeter 请求中工作吗?
  • 好吧,正如我所写 - 所有必要的标题都在那里,包括“Accept: application/json”和“Content-Type: application/x-www-form-urlencoded; charset=UTF-8”
  • 你能显示JMeter的截图吗(Ctrl+G)。这可能是标题变量中的拼写错误或误解

标签: spring post jmeter xmlhttprequest


【解决方案1】:
  1. 确保将HTTP Cookie Manager 添加到您的测试计划中
  2. 确保执行CSRFToken 动态参数的关联。查看How to Load Test CSRF-Protected Web Sites 文章了解更多详情。

我的期望是您尝试直接执行请求,但是您需要登录(拥有有效的 cookie 和 CSRF 令牌)。如果您有登录序列,请使用View Results Tree 侦听器检查响应详细信息 - 很可能您的测试仅命中登录页面并且它不支持 POST 请求类型。

【讨论】:

  • 嗯,我的测试计划中确实有 HTTP Cookie 管理器,在它的最根本处,所以任何其他 HTTP 样本都“知道”它。 CSRFToken 也被仔细提取。而且,对于页面 - 测试肯定会遇到专用页面,而不是错误登录。测试计划的结构非常复杂,唯一不起作用的就是这个请求,它由应用程序完美完成(我可以在网络检查器中看到它),但我无法完成(JMeter) ...无论如何,感谢您的回复。
【解决方案2】:

所以,关键在于发送给服务的 csrftoken 错误。

只要我提供了正确的,请求就成功了。

【讨论】:

    猜你喜欢
    • 2020-09-16
    • 2016-08-21
    • 2016-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    • 2015-08-06
    • 2016-01-11
    相关资源
    最近更新 更多