Javascript XMLHttpRequest - 只有第一个POST请求有效

时间:2012-09-07 01:37:09

标签: javascript ajax post xmlhttprequest

我正在处理使用XMLHttpRequestPOST到服务器的Javascript代码。

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

 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命令失败(尽管我在查看JavaScript控制台时) Chrome没有错误消息)。如果我重新启动netcat侦听器并重新运行该脚本,则第一次运行将再次正常运行,后续运行将不执行任何操作。

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

修改 我已经做了一些麻烦,事实证明,与localhost的连接似乎没有被关闭(或者以某种方式被保留给server对象)。如果我关闭我在其上运行脚本的选项卡,则释放所有正在保存的资源并且脚本再次起作用。

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

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

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

根据此netcat cheat sheet,您可以在Windows上使用-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服务器 - 这不是一个坏主意,因为它将提供测试一些结构良好的内容响应的机会。