来自PHP的Backbone JSON请求麻烦

时间:2012-12-16 03:47:00

标签: php javascript json backbone.js

我在stackoverflow上的第一篇文章。 我正在开发一个系统,它包含客户端javascript和backbone.js以及highcharts.js,以显示我家可再生能源系统的实时数据。

它使用一个名为Arduino的小型微控制器来处理低水平的传感器数据。 控制器有自己的以太网硬件,我把它设置为小型服务器。

在我的客户端程序中,我使用Backbone作为MVC,模型URL指向Arduino的IP来请求json数据包。效果很好。

我现在正在做的是将该URL指针移动到我的托管站点,在那里我有一个小的php文件从SQL表中提取数据并以相同的json格式呈现。

从我的浏览器中,当我从Arduino控制器请求json数据包时,它看起来像这样;

<head></head><body><pre>{"vT_pv":234.00,"iT_pv":5.90,"iS_pv":0.00,"vB_pv":27.51}</pre></body>

当我将浏览器指向我称之为php的托管网站时,它看起来像这样;

<head></head><body><pre>{"vT_pv":230.70,"iT_pv":4.90,"iS_pv":0.00,"vB_pv":27.56}</pre></body>

编辑:包含Alex

要求的完整标题

两者看起来都是一样的,但在我的客户端javascript中,只有第一个实际工作在于数据成功放入模型然后在屏幕上可见。

当我检查页面时,两者之间的一个区别是我的Arduino返回HTTP / 1.0,而我托管站点返回的json数据是HTTP / 1.1

这会导致这样的问题吗?

以下是json的主干模型;

PollerModel = Backbone.Model.extend({
//  url:'//xxx.xxx.xxx.xxx/poller.json',    // this one works
    url: 'http://yyy.yyy.yyy.yyy.host_site/sql_get_live.php',    // this one does not

    startUpdate: function() {
        var that = this;
        startUpdate(that);
        function  startUpdate(isThis) {
            that.fetch({async:false});
            pollerUpdateInterval = setTimeout(function(){startUpdate(that);}, 5000);
        };
    },
});

正如您所看到的,一旦调用了startUpate函数,它将永远每5秒调用一次,这就是我想要的。

当我使用指向微控制器的第一个URL时,它就像一个魅力。 当我使用第二个URL时,我可以看到它发出请求并得到回复,但它似乎对数据没有任何作用,它没有放入模型。

所以在我的客户端应用程序中,第一个URL我在渲染视图上看到了数据,但没有看到第二个URL。

以下是我在主机网站上的php文件;

<?php

//  The JSON standard MIME header.
//  header('content-type: application/json; charset=utf-8');

    $con = mysql_connect('host', 'username', 'password');
    if (!$con) {
        die('mysql connect error: ' .mysql_error());
    }

    mysql_select_db("DataBase", $con);

    $sql_Live = "SELECT * FROM live";
    $mysql_record = mysql_query($sql_Live,$con);

    $row = mysql_fetch_array($mysql_record);
    $jsonData = '{"vT_pv":' . $row['vT_pv'] . ',"iT_pv":' . "4.90" . ',"iS_pv":' . $row['iS_pv'] . ',"vB_pv":' . $row['vB_pv'] . '}';
    echo "<pre >";
    echo $jsonData;
    echo "</pre>";
    mysql_close($con);
?>

注释掉的标题对格式或任何结果没有影响。 我尝试过以各种方式使用json编码功能,但都没有成功。 事实上使用json编码产生我认为非json格式,所以我上面的格式可能格式不正确吗?但它适用于第一个URL吗?

我已经搜索过,感觉有点卡在这里,所以我觉得是时候问我了。

2 个答案:

答案 0 :(得分:2)

我几乎毫不怀疑这是标题的问题。

Chrome中的

go:view&gt; developer&gt; developer tools&gt; network tab&gt;然后重新加载并从左侧面板中选择文件,然后查看“标题选项卡”,它将为您提供详细发送或收到的每个http标题,然后您可以计算出2个结果之间的差异。

你的php header("content-type"...)应该可以工作,但如果没有,它可能是apache覆盖你的PHP头();如果是这样,请更改.htaccess文件中的内容类型,或删除httpd.conf中.php文件的content-type text/html属性。

答案 1 :(得分:1)

在你的PHP中,你这样做:

echo "<pre >";
echo $jsonData;
echo "</pre>";

$jsonData看起来像是有效的JSON,但<pre>$jsonData</pre>不是JSON,将JSON包装在某些HTML中。您应该能够在没有echo $jsonData;包装器的情况下简单<pre>并在JavaScript中获得合理的结果;我还要包含Content-Type: application/json标题。