Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/378.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript XMLHttpRequest——只有第一个POST请求有效_Javascript_Ajax_Post_Xmlhttprequest - Fatal编程技术网

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

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命令失败(尽管当

我正在编写Javascript代码,它使用
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);