虽然HTTP状态为200 OK,但JQuery ajax对URL的GET请求失败

如果这个问题已经得到解答,我道歉。

我试图从REST Web服务检索数据,该服务使用jQuery .ajax调用公开JSON接口。

当我使用URL调用服务时,虽然我获得了HTTP状态代码200 OK,但jQuery调用失败。

当我将响应复制到文件系统上的文件并检索它时,同样的调用工作。

我正在访问的文件和我正在调用的Web服务都在同一台机器上。

关于以下代码中使用的URL的一些注释:

使用:

url: "http://localhost:9090/app/user/861", 

呼叫失败,进入所有浏览器的.fail。

URL本身在所有浏览器上返回json:

 { "userid": 861, "employeeno": "123", "jobdesc": "Developer", "firstname": "Jasper", "lastname": "Fitussi" } 

当在本地文件系统中使用“test.json”时,行为如下:

 url: "ajax/test.json", 

在Firefox上,调用执行,进入.done并在页面上显示结果。

在Chrome上,通话失败,状态为404,并显示以下消息 –

“请求的资源上没有’Access-Control-Allow-Origin’标题。因此不允许原点’null’访问。”

我试过改变dataType:"jsonp"不同组合dataType:"jsonp" ,添加一个?callback=? 到URL的末尾,并用’(’和”)将数据包含在test.json中,没有运气。

请理解我是UI编程,javascript和jQuery的新手。

请帮助我做错了什么。 这是javascript:

    $(document).ready(function () { $.ajax({ type: "GET", url:"ajax/test.json", // the following commented call fails, goes into .fail // url:"http://localhost:9090/app/user/861", contentType: "application/json", accepts: "application/json", dataType: "json" }) .done(function(data) { alert("Success"); console.log(data); var items = []; $.each( data, function( key, val ) { items.push( "
  • " + val + "
  • "); }); $( "
      ", { "class": "my-new-list", html: items.join( "" ) }).appendTo( "body" ); }) .fail(function(data) { console.log(data); alert("Failed"); }) .always(function() { alert("In Always"); }); });

    以下是将url粘贴到浏览器中时的输出(也是ajax / test.json的内容):

     { "userid": 861, "employeeno": "123", "jobdesc": "Developer", "firstname": "Jasper", "lastname": "Fitussi" } 

    你的问题不是关于UI编程,而是关于现代浏览器的安全模型:p

    当您从与托管HTML页面的域不同的域调用Web服务(即:加载JSON文件)时,会发生Access-Control-Allow-Origin错误。 在您的情况下,您将从硬盘驱动器(文件:///)打开html文件并在localhost上调用Web服务。

    这是所有现代浏览器中的安全function,禁止从外部Web服务获取数据,而Web服务所有者不会授权您(或允许每个人,通配符)调用它。

    我建议您阅读MDN的以下指南,以便了解您遇到此问题的原因。 然后很容易解决

    https://developer.mozilla.org/en/docs/HTTP/Access_control_CORS

    如果您控制Web服务的源代码或托管它的Web服务器,则需要添加Access-Control-Allow-Origin HTTP标头。

    你是否在wamp,lamp,xampp或mamp上使用Apache进行ajax调用? 我认为你直接使用一些文件可以在你的桌面上说,而不是从wamp的www文件。 如果浏览器发送了正确的URL,那么后端响应很好,你的前端代码看起来很好,所以我认为chrome抱怨你没有使用localhost。 我对吗? 您的本地开发设置是什么?

    如果它是客户端的本地文件,请使用file:///为URL添加前缀:

     url: 'file:///ajax/test.json' 

    第三个/ in file:///表示:

    作为一种特殊情况,可以是字符串“localhost”或空字符串; 这被解释为“正在解释URL的机器”。 3.10

    参考这里

    从http://fiddler2.com/下载一个名为fiddler的工具,可以很好地调试Web请求并查看它们失败的原因。 这将帮助您缩小您遇到的问题范围,我们可以进一步帮助您,因为目前它的所有猜测工作。

    我有同样的问题,在IE和FireFox中都运行良好,使用jsonp对rest服务进行了一次ajax调用,并且在chrome中工作正常,但是当我尝试使用jsonp加载文件时,我得到了跨域错误。 总之,我不得不在文件路径中添加“file:”

      $.ajax({ type : 'GET', url : 'file:jsondata/rain_acc_data.json', dataType : 'jsonp', jsonpCallback : "jsoncallback", success : function(data) { aler('ok'); }, error : function(jqXHR, status) { alert("Failed to load list" + status + jqXHR); } }); 

    这对我有用,请确保用jsoncallback将你的json包装在文件中(“你的杰森在这里”);