2012-06-04 121 views
8

我正嘗試將POST發佈到期望使用Google Apps腳本獲取JSON作爲有效內容的Web服務。我使用下面的代碼:帶有JSON有效負載的Google Apps腳本UrlFetchApp

var options = 
{ 
    "method" : "post", 
    "contentType" : "application/json", 
    "headers" : { 
    "Authorization" : "Basic <Base64 of user:password>" 
    }, 
    "payload" : { "endDate": "2012-06-03" } 
}; 

var response = UrlFetchApp.fetch("http://www.example.com/service/expecting/json", options); 

在服務器端我收到以下錯誤:

WARN [facade.SettingsServlet] 04 Jun 2012 15:30:26 - Unable to parse request body: endDate=2012-06-03 
net.liftweb.json.JsonParser$ParseException: unknown token e 

我假設服務器期望得到

{ "endDate": "2012-06-03" } 

,而不是

endDate=2012-06-03 

但我不知道如何讓UrlFetchApp做到這一點。

回答

10

我不明白服務器端錯誤,但'payload'參數必須是字符串,如下所示:https://developers.google.com/apps-script/class_urlfetchapp?hl=fr-FR#fetch

嘗試:

var options = 
{ 
    "method" : "post", 
    "contentType" : "application/json", 
    "headers" : { 
    "Authorization" : "Basic <Base64 of user:password>" 
    }, 
    "payload" : '{ "endDate": "2012-06-03" }' 
}; 
+0

據說大約在鏈接有效載荷:」 ......它可以是一個字符串,一個字節數組或一個JavaScript關鍵/ value map。看例子「。 當我嘗試您的提議時,我從服務器獲得錯誤代碼400。我嘗試了'Utilities.jsonStringify'以及相同的400響應代碼。 – Guy

+0

但是服務器端的錯誤信息是一樣的嗎?嘗試捕獲請求以查看身體的外觀。 –

+0

錯誤消息是不同的,因爲我根本沒有收到請求(400)的服務器。我無法捕獲客戶端的請求(Google Apps腳本),但我沒有看到它通過Tomcat。在Tomcat日誌中沒有它的蹤跡。 – Guy

2
  • 如果設置有效載荷爲一個字符串,它會被直接傳遞(作爲 UTF-8字符串)。
  • 如果您將有效負載設置爲對象,它將以類似於 的HTML表單發送(如果 字段很簡單,則表示'application/x-www-form-urlencoded',或'multipart/form-data'如果對象包含一個 blob /文件)。

對於您的用例(服務器期望收到JSON),聽起來像Utilities.jsonStringify()是要走的路。

+0

我懷疑在這種情況下GAS可能存在問題,因爲在這種情況下請求的主體在某些方面無效。通常從其他來源解析正文中的JSON的服務器無法解析來自GAS的傳入請求。我嘗試使用'...'和Utilities.jsonStringify(...)兩種版本的字符串。 – Guy

+1

也許要比較請求,請嘗試將POST發送到回顯URL,例如:http://responseecho.appspot.com/ –

0

這裏去應該有一些重要的意見的工作代碼:

function testMe() { 
    var products_authkey = "------------"; 
    try { 
     var url = "https://app.ecwid.com/api/v1/---------/product?id=----------&secure_auth_key=" + products_authkey; 
     //url= "http://requestb.in/----------"; // you can actually debug what you send out with PUTs or POSTs using Requestb.in service 
     var payload = { 
      id: "21798583", // id is necessary and should be a string, or it might be sent in scientific representation (with E) 
      price: 62755 
     }; 

     payload = JSON.stringify(payload); // the payload needs to be sent as a string, so we need this 
     var options = { 
      method: "put", 
      contentType: "application/json", // contentType property was mistyped as ContentType - case matters 
      payload: payload 
     }; 
     var result = UrlFetchApp.getRequest(url, options); 
     Logger.log(result) // a better way to debug 
     var result = UrlFetchApp.fetch(url, options); // works perfectly in my case 
     Logger.log(result) 
    } catch (e) { 
     Logger.log(e) 
    } 
} 
+0

應該是'JSON.stringify(有效內容)' –

相關問題