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

标签 javascript ajax post xmlhttprequest

我正在编写 Javascript 代码,该代码使用 XMLHttpRequestPOST 到服务器。

我的代码如下所示(我从 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/

相关文章:

post - 无法将表达式的类型 'NSData?' 转换为类型 'NSData?'

javascript - 如何克隆 ember 对象

javascript - 使用动态属性名称访问嵌套属性

javascript - 创建一个大字母 X

jquery - 使用nodejs express的ajax帖子的CSRF token 不匹配

javascript - 将 html 文件读取到 javascript 变量(Windows)

javascript - 从 ajax 返回的 html 提交表单

javascript - 在接受服务器请求之前等待种子数据

javascript - 在 iframe 中发布表单

c++ - 如何发送 POST 请求并接收 GET 响应