2013-03-28 29 views
0

尋找連接到此服務並返回xml的幫助。對UrlFetchApp的錯誤請求

這裏是指令(從here):

的輸入端和繼電器的狀態可以通過發送 請求到端口80(或端口中設置指定)用於 XML頁面狀態進行監視.XML。可以通過發送GET請求到端口80上的 相同頁面(或在安裝程序中指定的端口)來控制繼電器。這可以通過將命令輸入到Web瀏覽器的URL行中來演示,如 。

請求的當前狀態:HTTP:// 「IP地址」 /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); 
} 

任何幫助非常感謝。

回答

3

有一對夫婦的編碼錯誤,你可以很容易地照顧的:

  1. 在你的「基本」後,需要一個空間的Authorization頭。
    Authorization : "Basic " + Utilities.base64Encode(username+':'+password)

  2. urlFetchApp.fetch()返回一個HTTP Response對象,所以你需要提取的內容進行解析。
    var result = UrlFetchApp.fetch(url, options);
    var state = result.getContentText();

  3. 你是不是從你的parse()函數返回任何東西。

  4. 您應該在.fetch()之後檢查result.getResponseCode(),並在繼續解析之前處理錯誤。

這麼說,我不斷收到Bad request: http://75.65.130.27/state.xml錯誤,所以東西仍然是不正確的。這是一個HTTP 400響應,並且Google的服務器不會向腳本調試器返回任何內容以深入其中。你應該檢查用戶名&的密碼,但如果他們錯了,我會期待401-Unauthorized的迴應。我嘗試了包括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 
} 
+0

問題是否需要授權「」沒有?而且我也被卡住了,我重置了這個單位,試着改變了這個單詞,結果還是一樣。如果你把用戶名關掉,它會返回401,因此它最終得到單位因爲。最後一個問題是什麼是附加有效載荷的正確方法。 var payload = {「?relay1State =」:「2」} - 再次感謝這有助於 – LennyZ71 2013-03-28 21:52:20

+0

Auth需要''Basic''和編碼位之間的空格,我使用''Basic''。在''上不需要:''。有效載荷將是'var payload = {relay1State:「2」}'。你能捕獲來自應用程序的HTTP數據包 - 腳本雲嗎? (在交換機/路由器上的端口鏡像?Wireshark?) – Mogsdad 2013-03-29 02:47:32

+0

Mogs,感謝您的幫助,我終於弄清楚了這個問題。該單元實際上是接收命令,你必須直接將有效載荷添加到URL。但它自己的單元不會返回標題,這就是爲什麼我們不斷收到錯誤的請求。您的代碼調整確實幫助我創建了連接,再次感謝 – LennyZ71 2013-03-30 03:51:54