0

我正在研究用于服务器的 JavascriptXMLHttpRequest代码POST

我的代码如下所示(我从 google chrome 中的书签运行它):

 var a = sometext; 
 var b = someOtherText; 
 var msg = "a=" + encodeURIComponent(a) + "&b=" + encodeURIComponent(b);
 var server = new XMLHttpRequest();
 server.open("POST", "http://localhost:3333", true);
 server.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
 server.send(msg);

我正在使用 netcat 在我的计算机(Windows 7)的端口 3333 上监听。我第一次运行代码时,它运行良好,运行 netcat 的命令提示符显示POST请求、所有标头以及已发送数据的正确值 ( msg)。但是,当我再次运行脚本(在任何打开的网页上)时,我不再在命令提示符中看到任何新信息,我认为这意味着后面的POST命令失败(尽管当我在 Chrome 中查看 JavaScript 控制台时没有错误消息)。如果我重新启动 netcat 侦听器并重新运行脚本,第一次运行将再次正常运行,后续运行将无济于事。

关于为什么失败的任何想法?

编辑: 我做了更多的事情,结果发现与 localhost 的连接似乎没有被关闭(或者以某种方式被保留给server对象)。如果我关闭在其上运行脚本的选项卡,则会释放所持有的所有资源,并且脚本会再次运行。

有没有办法告诉 XMLHttpRequest 在完成后立即关闭?我尝试添加一个标题来做到这一点('Connection: close'),但事实证明这是不允许的。我还尝试将请求更改为同步并server.abort()随后调用(我什至找不到很好的文档来说明该函数的确切作用),但这没有帮助。我不知道如何指定我想使用 HTTP/1.0 而不是 1.1 进行连接,这似乎可能会有所帮助。

有任何想法吗?

4

1 回答 1

2

你说关闭netcat并重新启动它可以工作。也许您还没有设置 netcat 在第一个 POST 断开连接后重新打开侦听器。

根据这个netcat 备忘单,你可以-L在 windows 上使用。

-L:听得更仔细(仅支持 Windows 版本的 Netcat)。此选项使 Netcat 成为持久侦听器,在客户端断开连接后再次开始侦听

如果您想关闭连接(它不会自动关闭,直到浏览器超时),请尝试使用有效的 HTTP response 进行响应,也许是最小的 Full-Response"HTTP/1.0 200 OK\r\n\r\n")

使用 HTTP/1.0 响应 HTTP/1.1 请求应该可以工作,因为假定浏览器(客户端)实现了旧协议(它们被设计为向后兼容)。您也可以使用 HTTP/1.1 响应进行响应,但假定连接是持久的(即,不会立即关闭)。

除非另有说明,客户端应该假设服务器将保持持久连接,即使在服务器错误响应之后。

编辑:犯了一个错误并使用了最小的请求,而不是响应。响应实际上可能更难实现为持久侦听器,因为服务器可能必须关闭(TCP)连接。也许重新创建 netcat “最小 HTTP 侦听器”的脚本(不使用-L,而是循环重新打开连接)可能会更好?下一步是启动一个实际的 HTTP 服务器来提供虚拟响应 - 这不是一个坏主意,因为它可以让您有机会测试一些格式良好的响应内容。

于 2012-09-07T01:40:45.180 回答