我正在研究一种资产跟踪系统,该系统每5秒钟就会更新大量位置信息。我们将跟踪大约30 gps的单位,这些单位将信息发送到由供应商控制的服务器。供应商允许我们通过php请求访问数据。示例请求如下所示:
https://development.zonarsystems.net/interface.php?action=showposition&operation=path&format=json&reqtype=dbid&version=2&logvers=3&count=150&poweron=1&starttime=1189321200&endtime=1189493940&target=191
这种请求的结果是json格式的数据。我需要做的是使用该数据实时移动Web界面上的标记。我计划使用jquery和ajax来完成工作。这是相关代码(我无法分享实际的网址,用户名或密码):
function requestLocation() {
console.log('requesting data');
loadLocData();
reload = setInterval(loadLocData,1000);
}
//the following url request is for testing/devlopment and will change before final release
function loadLocData(){
var now = new Date();
var currentTime = now.getTime();
$.ajax({
type: "GET",
url: //(the url goes here),
username: //(my username goes here),
password: //(my password goes here),
data: {action: 'showposition',
operation: 'path',
format: 'json',
reqtype: 'dbid',
version: '2',
logvers: '3',
count: '5', //we will only use the five most recent points
starttime: ''+(currentTime-1500000),
endtime: ''+(currentTime+5000) //a five second buffer to ensure we're getting the most recent updates. may need to tweak this
},
dataType: 'json',
success: function(data){
console.log(data);
for(i=0;i<data.length;i++) {
//a function that will update the marker locations
}
}
});
}
代码返回以下错误:
XMLHttpRequest无法加载https:///interface.php?action = showposition&amp; operation = path&amp; format = json&amp; reqtype = dbid&amp; version = 2&amp; logvers = 3&amp; count = 5&amp; starttime = 1314037475842&amp; endtime = 1314038980842 。 Access-Control-Allow-Origin不允许原点http://maraudergroup.com。
在与我们供应商的技术支持人员交谈后,我似乎无法以这种方式导入数据。我认为我需要做的是使用脚本从服务器中获取位置数据并将其写入我们自己的数据库。然后我可以通过ajax从我们自己的数据中获取数据,而不是查询他们的数据库。但是,我不确定这是否是做事的方式,我不知道使用哪种语言,框架或数据库。我应该设置一个cronjob来每隔五秒左右运行一次脚本吗?或者有更好的方法吗?或者,更好的是,我可以使用ajax获取数据吗?无论我使用什么,都需要处理频繁的更新(每五秒钟,或者甚至更快)。
我对php,mysql和java有一点经验。我也愿意花时间学习python,因为无论如何我将在下学期上课。
谢谢!
感谢您的所有回复。根据Agustus的建议,我能够成功实现php的解决方案,尽管我在查看yahoo链接之前想出了一个解决方案。我不确定我所做的事情是否可以被视为代理,但它确实有效。我调用了脚本getData.php并将其存储在我的服务器上。这是它的样子(省略了敏感数据):
<?php
$currentTime = time();
$r = new HttpRequest('https://(the domain name goes here)/interface.php', HttpRequest::METH_GET);
$r->addQueryData(array('username' => (my username here),
'password' => (my password here),
'action' => 'showposition',
'operation' => 'path',
'format' => 'json',
'reqtype' => 'dbid',
'version' => '2',
'logvers' => '3',
'starttime' => ''.($currentTime*1000-1500000),
'endtime' => ''.($currentTime*1000+5000)
));
try {
echo $r->send()->getBody();
} catch (HttpException $ex) {
echo $ex;
}
?>
并且(尽管你可能已经猜到了这是什么样的),这里是修改后的ajax请求:
function loadLocData(){
$.ajax({
type: "GET",
url: "php/getData.php",
dataType: 'json',
success: function(data){
//a function that will update the marker locations
}
});
}
再次感谢!
答案 0 :(得分:1)
错误消息仅表示不允许使用XMLHTTPRequests(AJAX)连接到另一个域。因此,编写一个小代理,在您自己的域上运行,只从外部服务器加载数据并将其传递给您的JavaScript。
有关此事的更多信息,请参阅Mozilla's documentation。
或者,您可以请求其他HTTP标头来放松浏览器安全策略。请参阅same page上的Access-Control
标题
要回到这个问题,您的供应商页面还需要发送以下HTTP标头:
Access-Control-Allow-Origin: http://your-site.com
Access-Control-Allow-Credentials: true
Access-Control-Allow-Methods: GET
第一个授予您网站的权限,以通过AJAX从供应商的服务器请求数据。即使正在使用凭证,第二个标头也允许这样做(允许使用用户名和密码进行身份验证)。第三个标题仅允许GET
请求,因为您不需要其他任何内容。
如果答案的前一部分看起来太技术性或您无法更改供应商服务器/脚本的标题,您可能会发现代理解决方案更简单。雅虎有一个not so technical introduction to AJAX and proxying,对你来说很方便 - 甚至提供了代码示例。请注意,您选择代理哪种语言并不重要。
答案 1 :(得分:0)
如果你真正做的就是根据来自第三方的数据显示积分,除非你需要管理这些数据,用户信息等,否则你真的不需要后端数据库等。
所以,如果你所做的只是移动标记,我就会从那里开始。获取数据,然后开始移动这些标记。完成后,请完成下一步的操作。
我要做的第一件事是找出你为什么会收到这个错误,然后你就可以看到数据了。
至于错误:https:///inter ....你有3个斜杠///(不知道你是否知道)
我还会与他们核实,看看你是否合法地允许在你的系统上存储这些数据。我设计的过去的AVL解决方案我们禁止第三方保存因安全风险等而映射到任何类型用户信息的位置信息。