我在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吗?
我已经搜索过,感觉有点卡在这里,所以我觉得是时候问我了。
保
答案 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
标题。