2012-09-07 23 views
0

我正在研究使用XMLHttpRequestPOST到服务器的Javascript代码。Javascript XMLHttpRequest - 只有第一个POST请求工作

我的代码看起来像下面的(我在谷歌浏览器书签运行它):

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); 

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

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

编辑: 我已经做了一点乱搞,和它原来本地主机连接不似乎被关闭(或以某种方式被保留为server对象)。如果我关闭了我在其上运行该脚本的选项卡,则可以释放所有正在进行的资源并且脚本再次运行。

有没有什么办法可以告诉XMLHttpRequest一旦完成就关闭?我尝试添加一个标题来做到这一点('Connection: close'),但事实证明这是不允许的。之后,我也尝试将请求更改为同步并在之后调用server.abort()(我找不到出色的文档来说明该功能的功能),但它没有帮助。我无法弄清楚如何指定我想使用HTTP/1.0而不是1.1进行连接,这看起来可能有所帮助。

任何想法?

回答

2

你说关闭netcat并重新启动它的作品。也许你没有设置netcat在第一次POST断开后重新打开监听器。

根据此netcat cheat sheet,您可以在窗口上使用-L

-L:更难听(仅在Windows版本的Netcat上受支持)。这个选项使得Netcat的持久监听器,重新开始监听客户端断开

后,如果您想要关闭连接(它不会自动关闭,可能直到浏览器超时),尝试用a valid HTTP response响应,或许the minimal Full-Response "HTTP/1.0 200 OK\r\n\r\n")

HTTP/1.0对HTTP/1.1请求的响应应该起作用,因为浏览器(客户端)被假定为实现较旧的协议(它们被制成向后兼容)。您也可以用HTTP/1.1响应回应,但是connections are assumed to be persistent(即not closed right away)。

除非另有说明,否则客户端应该假定即使服务器发生错误响应后,服务器也将保持持久连接。

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

+0

我已经在使用-L(我正在使用“nc -L -p 3333 -vv”启动netcat)。而且,它几乎感觉到连接永远不会关闭,因为命令提示符中的光标在信息的末尾结束,而不是在新行或任何东西上。 – scaevity

+0

@scae:尝试使浏览器关闭与(有效)HTTP响应的连接。更新了答案。 –

+0

谢谢!我创建了一个简单的服务器来响应HTTP请求,并使连接正常关闭。 – scaevity