如何从 yaler 获得 json 回复
How to get a json response from yaler
我用yaler创建了一个账号,用来和我的arduino yun交流。它工作正常,我可以打开和关闭 LED。
然后我创建了一个网页,带有一个按钮,该按钮使用 GET 方法调用 ajax 函数到 yaler(yaler 网络服务器接受 URL 上的 REST 样式)
$.ajax({
url: "http://RELAY_DOMAIN.try.yaler.net/arduino/digital/13/1",
dataType: "json",
success: function(msg){
var jsonStr = msg;
},
error: function(err){
alert(err.responseText);
}
});
此代码似乎工作正常,实际上 LED 会关闭和打开,但我希望 json 成功函数 (msg) 中的响应如下所示:
{
"command":"digital",
"pin":13,
"value":1,
"action":"write"
}
但是我得到一个错误(错误函数)。我也试图提醒 err.responseText,但它是未定义的....
我该如何解决这个问题?有什么建议么???
提前致谢....
如果包含上述 Ajax 请求的网页是从不同的来源提供的,您将必须解决 Web 浏览器的同源策略。
有两种方法(基于http://forum.arduino.cc/index.php?topic=304804):
- CORS,即将header
Access-Control-Allow-Origin: *
添加到Yun Web服务
- JSONP,即如果 Ajax 请求使用查询参数
?callback=?
请求,让 Yun 提供额外的 JS 函数
CORS 可能可以在 Yun 的 OpenWRT 部分配置,而 JSONP 可以添加到 Brige.ino 代码(您似乎正在使用)。
我遇到了同样的问题。我用 JSONP 来解决它。 JSONP 是 JSON 带填充。基本上意味着您使用某种包装器发送 JSON 数据。
您必须发送 Java 脚本函数,而不仅仅是数据,这是 Internet 允许的。
所以您的回复不是:
{"command":"digital","pin":13,"value":0,"action":"write"}
应该是:
showResult({command:"analog",pin:13,value:0,action:"write"});
我更改了 yunYaler.ino 来执行此操作。
所以对于 html :
var url = 'http://try.yaler.net/realy-domain/analog/13/210';
$.ajax({
type: 'GET',
url: url,
async: false,
jsonpCallback: 'showResult',
contentType: "application/json",
dataType: 'jsonp',
success: function(json) {
console.dir(json.action);
},
error: function(e) {
console.log(e.message);
}
});
};
function showResult(show)
{
var str = "command = "+show.command;// you can do the others the same way.
alert (str);
}
我的 JSON 被 showResult() 包裹,所以它成为 JSONP 和我在回调中调用的函数。
希望这对您有所帮助。如果 CORS 对你有用。你能把它是如何工作的放在这里吗?
我用yaler创建了一个账号,用来和我的arduino yun交流。它工作正常,我可以打开和关闭 LED。 然后我创建了一个网页,带有一个按钮,该按钮使用 GET 方法调用 ajax 函数到 yaler(yaler 网络服务器接受 URL 上的 REST 样式)
$.ajax({
url: "http://RELAY_DOMAIN.try.yaler.net/arduino/digital/13/1",
dataType: "json",
success: function(msg){
var jsonStr = msg;
},
error: function(err){
alert(err.responseText);
}
});
此代码似乎工作正常,实际上 LED 会关闭和打开,但我希望 json 成功函数 (msg) 中的响应如下所示:
{
"command":"digital",
"pin":13,
"value":1,
"action":"write"
}
但是我得到一个错误(错误函数)。我也试图提醒 err.responseText,但它是未定义的....
我该如何解决这个问题?有什么建议么??? 提前致谢....
如果包含上述 Ajax 请求的网页是从不同的来源提供的,您将必须解决 Web 浏览器的同源策略。
有两种方法(基于http://forum.arduino.cc/index.php?topic=304804):
- CORS,即将header
Access-Control-Allow-Origin: *
添加到Yun Web服务 - JSONP,即如果 Ajax 请求使用查询参数
?callback=?
请求,让 Yun 提供额外的 JS 函数
CORS 可能可以在 Yun 的 OpenWRT 部分配置,而 JSONP 可以添加到 Brige.ino 代码(您似乎正在使用)。
我遇到了同样的问题。我用 JSONP 来解决它。 JSONP 是 JSON 带填充。基本上意味着您使用某种包装器发送 JSON 数据。 您必须发送 Java 脚本函数,而不仅仅是数据,这是 Internet 允许的。
所以您的回复不是:
{"command":"digital","pin":13,"value":0,"action":"write"}
应该是:
showResult({command:"analog",pin:13,value:0,action:"write"});
我更改了 yunYaler.ino 来执行此操作。
所以对于 html :
var url = 'http://try.yaler.net/realy-domain/analog/13/210';
$.ajax({
type: 'GET',
url: url,
async: false,
jsonpCallback: 'showResult',
contentType: "application/json",
dataType: 'jsonp',
success: function(json) {
console.dir(json.action);
},
error: function(e) {
console.log(e.message);
}
});
};
function showResult(show)
{
var str = "command = "+show.command;// you can do the others the same way.
alert (str);
}
我的 JSON 被 showResult() 包裹,所以它成为 JSONP 和我在回调中调用的函数。
希望这对您有所帮助。如果 CORS 对你有用。你能把它是如何工作的放在这里吗?