4

我在 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?

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

保罗

4

2 回答 2

2

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

在 chrome 中 go:view>developer>developer tools>network tab> 然后重新加载并从左侧面板中选择文件,然后查看“headers tab”,它将为您提供发送或接收的每个 http 标头的详细信息,然后您就可以工作了找出两个结果之间的差异。

your php header("content-type"...) should work but if not it may be apache overriding your PHP header(); if so change the content type in an .htaccess file or delete the content-type text/html attribution for .php files in httpd.conf.

于 2012-12-16T07:03:58.147 回答
1

在您的 PHP 中,您正在执行以下操作:

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

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

于 2012-12-16T04:58:33.763 回答