寻找一些帮助连接到此服务并返回xml。
以下是说明(来自here):
可以通过发送a来监控输入和继电器的状态 请求为XML页面的端口80(或设置中指定的端口) state.xml。可以通过向GET发送GET请求来控制继电器 端口80(或设置中指定的端口)上的相同页面。这可以 通过在Web浏览器的URL行中输入命令来演示。
请求当前状态:http://“ip address”/state.xml
...
如果在WebRelay-DualTM设备中启用了控制密码 浏览器将通过浏览器请求state.xml页面 提示用户输入密码。如果发送XML请求 另一个应用程序而不是浏览器,html请求将需要 包含使用base 64编码方案编码的密码。该 没有密码的html请求标头如下所示:
GET /state.xml?relay1State=1&noReply=1 HTTP/1.1 (Ends with two \r\n)
带密码的html请求标头如下所示:
GET /state.xml?relay1State=1&noReply=1 HTTP/1.1(\r\n here) Authorization: Basic bm9uZTp3ZWJyZWxheQ== (Ends with two \r\n)
其中
bm9uZTp3ZWJyZWxheQ==
是基础64编码版本的 用户名和密码无:webrelay
代码:
function webRelay(){
//working url http://75.65.130.27/state.xml
var url = 'http://75.65.130.27/';
var params = encodeURIComponent('state.xml');
Logger.log(params);
var headers = {
"Authorization" : "Basic" + Utilities.base64Encode('none:webrelay')
};
var options =
{
"method" : "get",
"headers" : headers
};
var state = UrlFetchApp.fetch(url+params, options);
Logger.log('1: '+state);
Logger.log(parse(state));
}
function parse(txt) {
var doc = Xml.parse(txt, true);
}
非常感谢任何帮助。
答案 0 :(得分:3)
您可以轻松处理几个编码错误:
在“授权”标题中,“基本”后需要一个空格
Authorization : "Basic " + Utilities.base64Encode(username+':'+password)
urlFetchApp.fetch()
返回HTTP Response对象,因此您需要提取内容以进行解析
var result = UrlFetchApp.fetch(url, options);
var state = result.getContentText();
您没有从parse()
函数返回任何内容。
您应该在result.getResponseCode()
之后检查.fetch()
,并在继续解析之前处理错误。
那就是说,我不断收到Bad request: http://75.65.130.27/state.xml
错误,所以有些事情仍然不对。这是一个HTTP 400响应,谷歌的服务器不会向脚本调试器返回任何内容以进行深入研究。你应该检查用户名和&密码,虽然如果他们错了我会期待401-Unauthorized响应。我尝试添加payload
relay1State=2
,并得到相同的Bad request
结果。如果您可以捕获命中服务器的HTTP请求,则可能会出现格式错误的线索。这也可能是防火墙的结果。
一旦排序,this tutorial应该有助于XML解析。
以下是我对您的代码的编辑:
function webRelay(){
var url = 'http://75.65.130.27/state.xml';
var username = "none";
var password = "webrelay";
var headers =
{
Authorization : "Basic " + Utilities.base64Encode(username+':'+password)
}
var options =
{
"method" : "get",
"headers": headers
};
// Getting "bad request" here - check the username & password
var result = UrlFetchApp.fetch(url, options);
var state=result.getContentText();
// You should check state.getResponseCode()
Logger.log('1: '+state);
Logger.log(parse(state));
}
function parse(txt) {
var doc = Xml.parse(txt, true);
return doc; // Return results
}