为什么浏览器可以在JMeter和Curl发出时发出XHR POST请求

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么浏览器可以在JMeter和Curl发出时发出XHR POST请求相关的知识,希望对你有一定的参考价值。

调查Web资源的行为我发现有一个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请求。并且它在运行时出现,但它不适合我尝试手动发出这样的请求。

任何想法为什么会出现这种差异?JMeter screenshot web inspector headerweb inspector requestweb inspector response

这是从查看结果树中截取的请求: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; > acceleratorSecureGUID = ca22a2f520a00f5cc3efa3acb6599a5f0e081c85

请求标题:连接:保持活动接受:application / json,text / javascript X-Requested-With:XMLHttpRequest Content-Type:application / x-www-form-urlencoded; charset = UTF-8原产地:$ {address-goes-here} 参考文献:$ {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} User-Agent:Apache-HttpClient / 4.5.3(Java / 1.8.0_112)

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

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

另一答案

所以,整点都是错误的csrftoken发送到服务。

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

以上是关于为什么浏览器可以在JMeter和Curl发出时发出XHR POST请求的主要内容,如果未能解决你的问题,请参考以下文章

在 JMeter 中发出的请求和响应可以在 Charles Proxy 中看到吗?

使用CURL发出多个请求时无法保存会话

Jmeter 文件上传场景 - 使用正文发出 PUT

Https 请求返回 403

Jmeter八大可执行元件的执行顺序

在节点js中使用-u参数在CURL请求中发出GET请求