与UrlFetchApp错误的请求(bad request with UrlFetchApp)

2019-08-18 02:41发布

寻找一些帮助连接到该服务并返回XML。

这里是(从说明这里 ):

的输入端和继电器的状态可以通过发送该XML页面state.xml(在设置中指定或端口)到端口80的请求进行监测。 继电器可以通过发送GET请求到端口80上的相同的页面(或端口中设置指定的)来控制。 这可以通过输入命令到Web浏览器的URL行证实。

请求当前状态:HTTP:// “IP地址” /state.xml

...

如果控制密码在WebRelay-DualTM单元启用和state.xml页面通过浏览器请求,浏览器会提示用户输入密码。 如果XML请求是从另一个应用程序,而不是一个浏览器发送时,HTML请求将需要包含使用基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);
}

任何帮助深表感谢。

Answer 1:

有一对夫妇的编码,你可以很容易地照顾错误:

  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().fetch()并与解析操作前处理错误。

这就是说,我不断收到Bad request: http://75.65.130.27/state.xml错误,所以东西仍然是不正确的。 这是一个HTTP响应400,和谷歌的服务器没有任何返回脚本调试挖进去。 您应该检查用户名和密码,但我期望一个401不正当反应,如果他们错了。 我试图包括payloadrelay1State=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
}


文章来源: bad request with UrlFetchApp