【问题标题】:Javascript XMLHttpRequest -- only the first POST request worksJavascript XMLHttpRequest——只有第一个 POST 请求有效
【发布时间】:2012-09-07 13:04:26
【问题描述】:

我正在处理使用XMLHttpRequestPOST 到服务器的Javascript 代码。

我的代码如下所示(我从 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 请求、所有标头以及发送数据的正确值 (msg)。但是,当我再次运行脚本(在任何打开的网页上)时,我不再在命令提示符中看到任何新信息,我认为这意味着后面的 POST 命令失败(尽管当我在 Chrome 中查看 JavaScript 控制台时)没有错误消息)。如果我重新启动 netcat 侦听器并重新运行脚本,第一次运行将再次正常运行,后续运行将无济于事。

关于为什么失败的任何想法?

编辑: 我做了更多的事情,结果发现与 localhost 的连接似乎没有被关闭(或者以某种方式为server 对象保留)。如果我关闭在其上运行脚本的选项卡,则会释放所持有的所有资源,并且脚本会再次运行。

有没有办法告诉 XMLHttpRequest 在完成后立即关闭?我尝试添加一个标题来做到这一点('Connection: close'),但事实证明这是不允许的。我还尝试将请求更改为同步并在之后调用server.abort()(我什至找不到很好的文档来说明该函数的确切作用),但这没有帮助。我不知道如何指定我想使用 HTTP/1.0 而不是 1.1 进行连接,这似乎可能会有所帮助。

有什么想法吗?

【问题讨论】:

    标签: javascript ajax post xmlhttprequest


    【解决方案1】:

    您说关闭 netcat 并重新启动它可以工作。也许您还没有设置 netcat 在第一个 POST 断开后重新打开侦听器。

    根据这个netcat cheat sheet,你可以在windows上使用-L

    -L:听得更仔细(仅支持 Windows 版本的 Netcat)。此选项使 Netcat 成为持久监听器,在客户端断开连接后再次开始监听

    如果您想关闭连接(它不会自动关闭,直到浏览器超时),请尝试使用a valid HTTP responsethe 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 服务器 - 这不是一个坏主意,因为它可以让您有机会使用内容测试一些格式正确的响应。

    【讨论】:

    • 我已经在使用-L(我正在使用“nc -L -p 3333 -vv”来启动netcat)。此外,感觉更像是连接永远不会关闭,因为命令提示符中的光标最终位于信息的末尾,而不是在新行或其他任何地方。
    • @scae:尝试让浏览器关闭连接并使用(有效的)HTTP 响应。更新了答案。
    • 谢谢!我创建了一个简单的服务器来响应 HTTP 请求,并使连接能够正确关闭。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-11
    • 1970-01-01
    • 2018-10-27
    • 2014-08-05
    • 2017-09-10
    • 1970-01-01
    • 2019-07-23
    相关资源
    最近更新 更多