带有 Sencha Touch 的 JSONP 不起作用

Posted

技术标签:

【中文标题】带有 Sencha Touch 的 JSONP 不起作用【英文标题】:JSONP with Sencha Touch not working 【发布时间】:2011-05-03 12:10:51 【问题描述】:

我正在关注 Sencha Touch 的这个教程:http://www.vimeo.com/15672696 完美的教程,完美无瑕。

但是当我尝试在我自己的项目中重用这段代码时,我没有工作。 这是我所做的:

在我的 Sencha touch 应用程序中,我编写了以下函数:

showContacts = function()

    Ext.util.JSONP.request(
        url: 'http://www.hotcoffee.be/check-relations/index.php/json/contactpersonen',
        callbackKey: "callback",
        params: 
            unique: Math.random()
        ,
        callback: function(data)
        
            var contacts = data.results;
            nameOfPanel.update(contacts);
        
    );

首先,我用 PHP(codeigniter)编写了自己的 JSON 文件:

<?
    $row[] = array(
        "name" => $item->name,
        "first_name" => $item->first_name,
        "avatar"=>$item->avatar
    );

    // PASSING THE ARRAY $row TO A VIEW
    // ON THE VIEW I OUTPUT THE ARRAY

    $this->output->set_content_type('application/json')->set_output(json_encode($row));
?>

(结果:见 showContacts 函数的 URL)

这不起作用,所以我认为使用 PHP 文件作为 JSON 有问题,所以我创建了一个 JSON 文件:

(结果:http://www.hotcoffee.be/check-relations/json/friends.json)

现在看来这也不起作用。我在很多小时内都在为此头疼... 我还在 Chrome 的调试器中收到以下消息:

Resource interpreted as Script but transferred with MIME type application/json. (contactpersonen:-1)
Uncaught SyntaxError: Unexpected token : (contactpersonen:1)
Resource interpreted as Image but transferred with MIME type text/html. (csi:-1)

另一件事是我可以确保面板和 tpl 写得很好,因为使用硬编码的测试数据它确实有效。只有加载 JSON 文件才是问题所在。

有人知道怎么处理吗? 非常感谢!

【问题讨论】:

JSONP 通过将 JSON 包装在回调函数中来工作(以便它可以包含在 嗯,现在 JSON 文件在同一个域上,但将来我想从另一个主机获取它。所以我想我想让它从一开始就在另一个域中工作。 【参考方案1】:

这是php服务器的例子:

$callback = $_REQUEST['callback'];

// Create the output object.
$output = array('a' => 'Apple', 'b' => 'Banana');

//start output
if ($callback) 
    header('Content-Type: text/javascript');
    echo $callback . '(' . json_encode($output) . ');';
 else 
    header('Content-Type: application/x-json');
    echo json_encode($output);

当你在chrome或firefox中调试时,你会发现响应加入了Ext.util.JSONP.callback()

这就是 jsonp 如何“从与正在运行的页面的原始域不同的域中的页面检索数据”,并将数据提供给正在运行的页面。

【讨论】:

【参考方案2】:

我在这里回答了类似的问题:Sencha seems to not like Rails' json。它是特定于 Rails 的,但这个概念仍然适用。

基本上詹姆斯皮尔斯是正确的。您返回的内容需要包装在标签和回调函数中。这将在您的页面上插入代码并运行脚本,该脚本具有调用您提供的功能的效果。

$response = "<script type='text/javascript'>";
$response .= $_GET['callback'] . "(" . json_encode($row) . ")";
$response .= "</script>";
$this->output->set_content_type('application/json')->set_output($response);

【讨论】:

感谢 James Pearce 和 misagrooves!两者都是正确的,我通过 James Pearce 的信息找到了解决方案。 FWIW,出于某种原因,这仅在我删除 &lt;script type='text/javascript'&gt;&lt;/script&gt; 时才对我有效——即,不要使用上面的第一行和第三行

以上是关于带有 Sencha Touch 的 JSONP 不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Sencha Touch 2.3.1 + Phonegap 3.4 jsonp 在 Android 中不工作,但在浏览器上工作

Sencha Touch JsonP 回调无法识别 Ext 对象

Sencha Touch 2 - 我如何通过回调调用 JsonP 中的细节

如何在 Sencha Touch 2 中使用 JsonP 提交表单?

sencha touch 动态构建窗体

sencha touch ajax 加载列表