首页 > 解决方案 > 发送 2 个 http 并发请求

问题描述

我需要测试一个应用程序的 web-api。测试用例是如果 2 个模拟请求同时到达 web 应用程序的 2 个节点,它会返回 erorr。所以我需要在 Web 应用程序的两个单独节点上同时发送 2 个请求。我知道如何发送 1 个请求以及如何轮流发送请求。这是我提出的请求示例:

var XMLHttpRequest = require("xmlhttprequest").XMLHttpRequest;
var xhr = new XMLHttpRequest();
var url = "url";
                xhr.open("POST", url, true);
                xhr.setRequestHeader("Content-Type", "application/json");
                xhr.onreadystatechange = function () {
                    if (xhr.readyState === 4 && xhr.status === 200) {
                        var json = JSON.parse(xhr.responseText);
                        console.log(json.result);
                    }
                };
                var data = JSON.stringify();
                xhr.send(data);

标签: node.js

解决方案


首先,这主要是我的意见,我会使用fetch API来调用你想要拉到你的 web 应用程序的资源。

我认为它需要的样板文件比 XMLHttpRequest 少。

另一方面,我不清楚您是否想检查您的网络应用程序是否正在向同一资源发出两个请求,或者是否想知道如何知道和处理后端获得的情况克隆请求。

在第一种情况下,您可以使用RxJs 之类的东西来避免在收到响应之前发出请求。但也许它对您的项目来说是一个非常大的依赖项。

另一种方法可能是禁用用户输入(例如发出请求的按钮),直到您得到响应。

但是,如果您的问题是关于如何在后端应用程序中知道来自同一个客户端的重复请求,那将取决于您的后端架构。比如,如果你有一个负载均衡器和许多后端服务,或者如果你只有一个 nodejs 后端面向公共互联网,等等。

我建议您以某种方式保留客户端数据(内存、数据库或其他东西),例如 IP 或会话 ID,或者对知道谁在进行 API 调用有用的东西;然后检查是否已经有对同一资源的持续请求,以便您做出相关响应。调用完成后,您可以将其从持久层中删除。

也许你期待一些代码片段,但我希望这对你有用。

评论后编辑:

我有 host1.webapp/api/methodX 和 host2.webapp/api/methodX。只需我必须同时发送 2 个请求(1 个用于 host1,1 个用于 host2)。我不需要等待 host1 的响应然后向 host2 发送请求,我需要将它们一起发送到不同的主机。而且我不在乎响应时间/请求处理时间/等。

就像我使用 curl 它看起来像: curl request1 & request2

在这种情况下,这取决于您要测试的行为。您不能使用相同的 XMLHttpRequest 对象进行两次 AJAX 调用。如果我是你,我会提出两个请求,也许将它们包装在一个 Promise 中,然后使用Promise.allSettled()方法。然后检查返回值上发生了什么。另一种(但更复杂的方法)应该是有一个拦截所有 http 流量的服务工作者,在那里您可以查看 API 调用是否按照您的意愿进行。


推荐阅读