CodeIgniter 中的 JSONP
Posted
技术标签:
【中文标题】CodeIgniter 中的 JSONP【英文标题】:JSONP in CodeIgniter 【发布时间】:2010-10-19 17:36:27 【问题描述】:我在 CodeIgniter 中使用 jQuery JSONP 方法 $.getJSON
时遇到问题。从中获取 JSON 的 URL 如下:
http://spinly.000space.com/index.php/admin/isloggedin
问题是我有一个运行$.getJSON
方法的demo.html
文件,并从我上面指出的URL 中获取数据。
demo.html:
<html>
<head>
<script src="http://www.spinly.000space.com/public/js/jquery.js"></script>
<script>
$(document).ready(function()
var myurl = "http://spinly.000space.com/index.php/admin/isloggedin/&jsoncallback=?";
//myurl = "http://com.lnk.bz/jsonp.php?sleep=3&jsoncallback=?";
$.getJSON(myurl,function(adat)
alert(adat);
// clearTimeout(t);
);
);
</script>
</head>
<body>
<div id="images">
</div>
</body>
</html>
当我运行demo.html
时,什么也没有发生。如您所见,当我将 URL 更改为另一个不使用 CodeIgniter 作为框架的 URL 时,它应该提醒返回的数据。我让警报功能运行,但在这种情况下,使用 CodeIgniter 备份的 URL 时,它不起作用。有没有人可以解决我的问题?如果您能给我一些反馈,我将不胜感激。提前致谢!
【问题讨论】:
寻找在CI中实现jsonp的好方法... 在详细说明之前,您能否指定您使用的 CI 版本,是“Core”还是“Reactor”? 这个网址已经失效了。 【参考方案1】:你的网址中的&符号错误:
loggedin/&jsoncallback=?
应该是这样的
loggedin/?jsoncallback=?
运行我得到的响应
jsonp123( ...
这意味着它会尝试调用 jsonp123 函数,此时您的代码中的 adat 部分从未使用过。
【讨论】:
后现代:我已经更改了代码,现在 spinly.000space.com/index.php/admin/isloggedin 显示 "title":"user online","user":"online":"yes" 仍然如此不起作用。 getJson 方法创建了一个新函数,该函数被替换为您的 url,发送时类似于:loggedin/?jsoncallback=jsonp1239837994134&_=1239838173986 尝试将您的 php 替换为:$cb = $_GET[ 'jsoncallback'];回声$cb;回声'("test":true)';这有点令人困惑。【参考方案2】:默认情况下,CI 不允许查询字符串,那么您是否在 config.php 中启用了 enable_query_strings?
$config['enable_query_strings'] = TRUE;
【讨论】:
【参考方案3】:我认为您面临的问题是由于浏览器对不允许跨域请求的限制。我猜您将应用托管在其他域/子域上,这就是导致此问题的原因。
您需要使用的是 JSONP,即带有填充的 Json。详情在这里:http://en.wikipedia.org/wiki/JSONP
在这里查看 jquerys ajax api 中的 jsonp:http://api.jquery.com/jQuery.ajax/ 看看是否能解决您的问题。
【讨论】:
【参考方案4】:还要确保在 config.php 中将 $config['allow_get_array']
设置为 TRUE
。这将允许您使用
$this->input->get();
在您的控制器中。
【讨论】:
以上是关于CodeIgniter 中的 JSONP的主要内容,如果未能解决你的问题,请参考以下文章
活动记录 CodeIgniter 2 中的这个查询有啥问题?