Javascript XMLHttpRequest——只有第一个POST请求有效
我正在编写Javascript代码,它使用Javascript XMLHttpRequest——只有第一个POST请求有效,javascript,ajax,post,xmlhttprequest,Javascript,Ajax,Post,Xmlhttprequest,我正在编写Javascript代码,它使用XMLHttpRequest将POST发送到服务器 我的代码如下所示(我是从google chrome中的bookmarklet运行的): 我正在使用netcat在计算机(windows 7)的端口3333上侦听。第一次运行代码时,它工作正常,运行netcat的命令提示符显示POST请求、所有标题以及发送数据的正确值(msg)。但是,当我再次运行脚本(在任何打开的网页上)时,我在命令提示符中不再看到任何新信息,我认为这意味着后面的POST命令失败(尽管当
XMLHttpRequest
将POST
发送到服务器
我的代码如下所示(我是从google chrome中的bookmarklet运行的):
我正在使用netcat在计算机(windows 7)的端口3333上侦听。第一次运行代码时,它工作正常,运行netcat的命令提示符显示POST
请求、所有标题以及发送数据的正确值(msg
)。但是,当我再次运行脚本(在任何打开的网页上)时,我在命令提示符中不再看到任何新信息,我认为这意味着后面的POST
命令失败(尽管当我在Chrome中查看JavaScript控制台时,没有错误消息)。如果我重新启动netcat侦听器并重新运行脚本,第一次运行将再次正常工作,后续运行将不起任何作用
你知道为什么这个失败了吗
编辑:
我做了更多的胡闹,结果显示到localhost的连接似乎没有关闭(或者是为服务器
对象保留的)。如果我关闭运行脚本的选项卡,它将释放所有资源,脚本将再次工作
有没有办法告诉XMLHttpRequest在完成后立即关闭?我尝试添加一个标题来实现这一点('Connection:close'
),但结果是不允许这样做。我还尝试将请求更改为synchronous,并在之后调用server.abort()
(我甚至找不到很好的文档来说明该函数的具体功能),但没有任何帮助。我不知道如何指定我希望使用HTTP/1.0而不是1.1进行连接,这似乎会有所帮助
有什么想法吗?你说关闭netcat并重新启动它可以工作。可能您还没有设置netcat在断开第一篇文章后重新打开侦听器 根据这一点,您可以在windows上使用
-L
-L
:加强监听(仅在Windows版本的Netcat上支持)。此选项使Netcat成为一个持久侦听器,在客户端断开连接后再次开始侦听
如果要关闭连接(可能在浏览器超时之前,连接不会自动关闭),请尝试响应
使用HTTP/1.0响应HTTP/1.1请求应该可以工作,因为浏览器(客户端)被假定为实现较旧的协议(它们是向后兼容的)。您也可以使用HTTP/1.1响应,但是(即,)
除非另有说明,否则客户端应假定服务器将保持持久连接,即使在服务器做出错误响应之后也是如此
编辑:出错并使用最小请求,而不是响应。由于服务器可能必须关闭(TCP)连接,因此响应实际上可能更难作为持久侦听器实现。也许一个重新创建netcat的脚本(不使用
-L
,而是循环以重新打开连接)可以更好地工作?下一步是启动一个实际的HTTP服务器,该服务器提供虚拟响应——这不是一个坏主意,因为它将为测试一些格式良好的内容响应提供机会。我已经在使用-L(我正在使用“nc-L-p3333-vv”启动netcat)。此外,它几乎让人感觉连接从未关闭,因为命令提示符中的光标位于信息的末尾,而不是新行或任何内容上。@scae:尝试使用(有效的)HTTP响应使浏览器关闭连接。更新答案。谢谢!我创建了一个简单的服务器来响应HTTP请求,从而使连接能够正常关闭。
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);