在Chrome浏览器中$.post请求被取消。

4

我使用$.post调用一个php文件。从服务器返回json响应。当我直接在浏览器中打开服务器url时,它可以成功返回。但是从js中调用它却不起作用。

enter image description here

我调用的链接是这个(http://54.249.240.120/qcorner/login)。

<html>                                                                  
    <head>                                                                  
        <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
    </head>                                                                 
    <body>
        <input type="button" id="testID">
        <script type="text/javascript">                                         
            $(document).ready(function() {
                $("#testID").click(function() {
                    $.post('http://54.249.240.120/qcorner/login',function(result){
                        alert(result);
                    });
                });
            });
         </script>                                                               
     </body>                                                                 
 </html>

我也尝试在Firefox中进行操作。结果显示为200 OK,但没有响应。

为什么会出现这种情况呢?


我看不出任何原因导致给定的html/js出现这种情况。 - Kevin B
但是我已经向你展示了响应。:( - Abhishek Gupta
对我来说,响应是:{"head":{"status":206,"message":"仅收到0个字段,需要2个"},"body":""} - helion3
1
你要向URL提交什么数据? - Mr. Llama
@Kevin,我的服务器和客户端在两台不同的机器上。我正在客户端上作为一个本地文件打开客户端示例。所以我认为需要IP地址。 - Abhishek Gupta
显示剩余9条评论
5个回答

5
问题在于这是一个跨域请求,错误信息可以通过打开javascript控制台查看:
XMLHttpRequest不能加载http://54.249.240.120/qcorner/login。起源为null的访问不被Access-Control-Allow-Origin允许。
您需要确保设置了Access-Control-Allow-Origin头来允许此操作,否则Chrome将取消请求。

您可以在远程服务器上设置 Access-Control-Allow-Origin*,以允许跨域请求。* 将允许所有跨域流量,但如果您希望更安全,也可以将其设置为请求站点。 - danielrsmith
但是火狐浏览器呢?我刚在本地测试了一下,还是出现了同样的错误。为什么? - Abhishek Gupta
Firefox也应遵守同样的规则 - 这不是特定于浏览器的。我建议你阅读一下CORS相关的文档 - https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Access_control_CORS - danielrsmith

1
我猜测你遇到了跨域资源共享问题。我猜测你没有从http://54.249.240.120/访问此页面,因为Chrome在网络选项卡中明确显示它(如果是相同的域,则通常不会这样做)。
简而言之,您无法通过Javascript发布到另一个域名。如果您正在www.example.com上访问此内容,则浏览器不会将IP地址识别为相同的域名(即使域名已在该处解析)。如果您完全控制整个情况,最简单的方法就是将登录代码放在与您测试的代码相同的域上。在本地环境中,您可以使用您的[hosts文件,例如54.249.240.120 www.example.com将example.com(替换为您从测试页面访问的自己的域)重定向到IP地址。但是,这在公共互联网上不起作用。

如果您必须通过javascript向另一个域POST请求,您需要研究实现CORS标准。这里是一篇我找到的解释如何在PHP中实现它的文章。


但我认为这个问题只存在于Chrome或者FireFox中。 - Abhishek Gupta
Chrome和Firefox都应该阻止这个POST请求,尽管它们在阻止时可能会表现出不同的症状。请参阅维基百科文章(第一个链接)以了解浏览器与CORS标准的兼容性。 - Michael Pratt

0
我和你遇到了同样的问题,解决方法非常简单。 在接收ajax请求的PHP文件中,在发送响应之前,只需添加以下行:
<?php 
     header("Access-Control-Allow-Origin: *");
     ... // your code here
?>

0

HTML 200 OK不等同于有效的响应。它表示服务器接收到了你的请求,但并不意味着你的PHP文件实际上返回了可用数据。它可能会完全返回一个空响应。这是调试PHP文件的时候了。我建议暂时将日志记录到文件中或使用FirePHP。如果禁用错误显示(在生产服务器上应该这样做),那么如果你的脚本在生成任何输出之前失败,就会出现这种情况。


0

请求到底发生了什么?根据你在问题中列出的内容,你无法跨域进行ajax请求。

然而,你正在向URL发送一个空的POST请求,当我复制一个空的POST请求时,它会响应HTTP 206错误,这就是你需要解决的问题。

curl -X POST http://54.249.240.120/qcorner/login

{"head":{"status":206,"message":"Only 0 fields received, required 2"},"body":""}


206不是一个错误代码。所有2xx代码都意味着请求成功。206是一个部分内容响应,是对带有“Content-Range”标头的请求的响应。我想知道为什么在这种情况下会发生这种情况。 - Barmar
我将返回状态更改为200,仍然得到相同的结果,这不是HTTP响应,只是我返回的字符串。 - Abhishek Gupta

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接