我正在编写 Javascript 代码,该代码使用 XMLHttpRequest
来 POST
到服务器。
我的代码如下所示(我从 google chrome 中的书签运行它):
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
请求、所有 header 以及发送数据的正确值 (msg
) >)。但是,当我再次运行脚本(在任何打开的网页上)时,我在命令提示符中不再看到任何新信息,我认为这意味着后面的 POST 命令失败了(尽管当我查看Chrome 中的 JavaScript 控制台没有错误消息)。如果我重新启动 netcat 监听器并重新运行脚本,第一次运行将再次正常工作,后续运行将不会执行任何操作。
关于为什么会失败有什么想法吗?
编辑:
我做了一些更乱的事情,结果发现与本地主机的连接似乎没有被关闭(或者以某种方式为 server
对象保留)。如果我关闭运行脚本的选项卡,则会释放所占用的所有资源,并且脚本会再次运行。
有什么方法可以告诉 XMLHttpRequest 在完成后立即关闭吗?我尝试添加一个 header 来执行此操作('Connection: close'
),但事实证明这是不允许的。我还尝试将请求更改为同步,然后调用 server.abort()
(我找不到很好的文档来说明该函数到底是做什么的),但这没有帮助。我不知道如何指定我想使用 HTTP/1.0 而不是 1.1 进行连接,这似乎可能有帮助。
有什么想法吗?
最佳答案
你说关闭netcat并重新启动它就可以了。也许您还没有设置 netcat 在第一个 POST 断开连接后重新打开监听器。
根据这个netcat cheat sheet ,您可以在 Windows 上使用 -L
。
-L
: Listen harder (supported only on Windows version of Netcat). This option makes Netcat a persistent listener which starts listening again after a client disconnects
如果您想关闭连接(它不会自动关闭,直到浏览器超时为止),请尝试使用 a valid HTTP response 进行响应,也许the minimal Full-Response "HTTP/1.0 200 OK\r\n\r\n")
.
使用 HTTP/1.0 响应 HTTP/1.1 请求应该可以工作,因为浏览器(客户端)被假定实现旧协议(protocol)(它们被设计为向后兼容)。您也可以使用 HTTP/1.1 响应进行响应,但是 connections are assumed to be persistent (即 not closed right away )。
unless otherwise indicated, the client SHOULD assume that the server will maintain a persistent connection, even after error responses from the server.
编辑:犯了一个错误,使用了最小的请求,而不是响应。响应实际上可能更难实现为持久监听器,因为服务器可能必须关闭 (TCP) 连接。也许是一个重新创建 netcat "minimal HTTP listener" 的脚本(不使用 -L
,而是循环重新打开连接)可能会更好吗?下一步是启动一个提供虚拟响应的实际 HTTP 服务器 - 这不是一个坏主意,因为它将提供测试一些格式良好的内容响应的机会。
关于Javascript XMLHttpRequest——只有第一个 POST 请求有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12310649/