UrlFetchApp的错误请求

时间:2013-03-28 06:16:26

标签: google-apps-script

寻找一些帮助连接到此服务并返回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);
}

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:3)

您可以轻松处理几个编码错误:

  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(),并在继续解析之前处理错误。

  5. 那就是说,我不断收到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
    }