虽然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包装在文件中(“你的杰森在这里”);