0

寻找连接到此服务并返回 xml 的帮助。

以下是说明(来自此处):

可以通过向端口 80(或设置中指定的端口)发送 XML 页面 state.xml 的请求来监控输入和继电器的状态。可以通过在端口 80(或设置中指定的端口)上向同一页面发送 GET 请求来控制继电器。这可以通过在 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==用户名和密码的 base 64 编码版本在哪里none: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);
}

任何帮助深表感谢。

4

1 回答 1

4

您可以轻松解决几个编码错误:

  1. 在“授权”标题中,“基本”之后需要一个空格。
    Authorization : "Basic " + Utilities.base64Encode(username+':'+password)

  2. urlFetchApp.fetch()返回一个 HTTP Response 对象,因此您需要提取内容进行解析。
    var result = UrlFetchApp.fetch(url, options);
    var state = result.getContentText();

  3. 你没有从你的parse()函数中返回任何东西。

  4. 您应该检查result.getResponseCode()after .fetch(),并在继续解析之前处理错误。

也就是说,我不断收到Bad request: http://75.65.130.27/state.xml错误,所以有些地方仍然不正确。这是一个 HTTP 400 响应,谷歌的服务器不会向脚本调试器返回任何内容以对其进行深入研究。您应该检查用户名和密码,但如果他们错了,我希望得到 401-Unauthorized 响应。我尝试包括 a payloadof relay1State=2,并得到了相同的Bad request结果。如果您可以捕获到达您的服务器的 HTTP 请求,那么您可能会发现什么是格式错误的。这也可能是防火墙的结果。

排序后,本教程应该有助于 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
}
于 2013-03-28T15:29:54.403 回答