我有通过ajax接收json的问题,错误在下面.根据我迄今为止发现的关于错误的信息,这似乎是某种跨域问题,但我不知道这是什么意思,以及如何解决这个问题.
响应头可能有问题(我自己创建了API并且没有以前没有经验),但是如果直接在浏览器中访问url,则会收到200 OK.
如果在浏览器中直接访问url有效的json,那么这不应该是问题.
这怎么可以解决?
注意:该URL转到Apache服务器,而不是已在Stack上看到的有关问题的95%问题的文件.
督察错误:
XMLHttpRequest cannot load http://localhost/api/v1/products?_=1355583847077. Origin null is not allowed by Access-Control-Allow-Origin. Error: error
代码:
$.ajaxSetup ({ url: "http://localhost/api/v1/products",// <--- returns valid json if accessed in the browser type: "GET",dataType: "json",cache: false,contentType: "application/json" }) $.ajax({ success: function(data){ console.log("You made it!"); },error: function(xhr) { console.log("Error: " + xhr.statusText); } }).done(function(data){ console.log(data); })
PARAMS
_ 1355583610778
头
回应标题:
Connection Keep-Alive Content-Length 3887 Content-Type application/json Date Sat,15 Dec 2012 14:50:53 GMT Keep-Alive timeout=5,max=100 Server Apache/2.2.14 (Unix) DAV/2 mod_ssl/2.2.14 OpenSSL/0.9.8l PHP/5.3.1 mod_perl/2.0.4 Perl/v5.10.1 X-Powered-By PHP/5.3.1
请求标题:
Accept application/json,text/javascript,*/*; q=0.01 Accept-Encoding gzip,deflate Accept-Language sv-SE,sv;q=0.8,en-US;q=0.5,en;q=0.3 Connection keep-alive Host localhost Origin null User-Agent Mozilla/5.0 (Macintosh; Intel Mac OS X 10.7; rv:17.0) Gecko/17.0 Firefox/17.0
响应
这里没有什么…
解决方法
尝试实施某种形式的
JSONP机制.如果你正在使用PHP,它可能是这样简单的东西…
/* If a callback has been supplied then prepare to parse the callback ** function call back to browser along with JSON. */ $jsonp = false; if ( isset( $_GET[ 'callback' ] ) ) { $_GET[ 'callback' ] = strip_tags( $_GET[ 'callback' ] ); $jsonp = true; $pre = $_GET[ 'callback' ] . '('; $post = ');'; } //isset( $_GET[ 'callback' ] ) /* Encode JSON,and if jsonp is true,then ouput with the callback ** function; if not - just output JSON. */ $json = json_encode( /* data here */ ); print( ( $jsonp ) ? $pre . $json . $post : $json );
所有这一切都将检查一个$_GET var称为回调,然后将输出包装在函数调用中 – 以$_GET [‘callback’]名称作为函数名称.
那么你的AJAX调用就像这样
$.ajax({ type: 'GET',url: '/* script here */ ',data: /* data here - if any */,contentType: "jsonp",// Pay attention to the dataType/contentType dataType: 'jsonp',// Pay attention to the dataType/contentType success: function (json) { /* call back */ } });
当jQuery被赋予’jsonp’作为dataType / contentType时,它将为您提供一个回调函数名称,并设置回调函数等;意味着你不必做任何事情真的!
从jQuery文档:
“jsonp”: Loads in a JSON block using JSONP. Adds an extra “?callback=?” to the end of your URL to specify the callback. Disables caching by appending a query string parameter,“_=[TIMESTAMP]”,to the URL unless the cache option is set to true.
结束时JSONP将是您最好的选择 – 我已经将PHP代码放在您的服务器端脚本使用PHP的机会上;如果不是,那么原则是一样的.不管服务器端技术如何,jQuery /客户端的东西保持不变. (一般来说)
祝你好运 :)