我正在处理使用XMLHttpRequest
到POST
到服务器的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进行连接,这看起来可能有所帮助。
有什么想法吗?
答案 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服务器 - 这不是一个坏主意,因为它将提供测试一些结构良好的内容响应的机会。