2012-06-04 17 views
8

Próbuję POST na usługę internetową, która spodziewa się uzyskać JSON jako ładunek za pomocą Google Apps Script. Używam następujący kod:Skrypt Google Apps UrlFetchApp z JSON Payload

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); 

po stronie serwera Dostaję następujący błąd:

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 

jestem przy założeniu, że serwer spodziewa się dostać

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

zamiast

endDate=2012-06-03 

, ale nie wiem, jak zrobić UrlFetchApp to zrobić.

Odpowiedz

10

Nie rozumiem błędu po stronie serwera, ale parametr "ładunek" musi być ciągiem określonym tutaj: https://developers.google.com/apps-script/class_urlfetchapp?hl=fr-FR#fetch.

try:

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

Mówi się o ładowności w link:”... To może być ciągiem, tablica bajtów lub klucz JavaScript/mapa wartości. Zobacz przykład. ". Kiedy próbuję twojej propozycji, otrzymuję kod błędu 400 z serwera. Próbowałem 'Utilities.jsonStringify' również z tym samym kodem odpowiedzi 400. – Guy

+0

Ale czy komunikat o błędzie po stronie serwera jest taki sam? Spróbuj uchwycić żądanie, aby zobaczyć, jak wygląda ciało. –

+0

Komunikat o błędzie jest inny, ponieważ nie otrzymuję wcale żądania do serwera (400). Nie mogę przechwycić żądania od strony klienta (Google Apps Script) i nie widzę, by przekazywał on Tomcat. Brak śladu w dziennikach Tomcat. – Guy

2
  • Jeśli ustawisz ładowność jako String, zostanie on przekazany bezpośrednio (jako ciąg UTF-8).
  • Jeśli ustawisz ładunek jako obiekt, będzie on wysyłany jak formularz HTML (co oznacza albo "application/x-www-form-urlencoded", jeśli pola są proste, albo "wieloczęściowe/dane formularzy" jeśli obiekt zawiera plik/plik blob/ ).

Dla twojego przypadku użycia (serwer spodziewa się otrzymać JSON), to brzmi jak Utilities.jsonStringify() jest drogą do zrobienia.

+0

Podejrzewam, że w tym scenariuszu może występować problem z GAS, ponieważ treść żądania w tym przypadku jest w jakiś sposób nieważna. Serwer, który zazwyczaj analizuje JSON w ciele z innych źródeł, nie może przeanalizować przychodzącego żądania z GAS. Próbowałem obu wersji Stringing ładunku, z "..." i Utilities.jsonStringify (...). – Guy

+1

Może porównać żądania, spróbuj POST na adres URL echa, taki jak: http://responseecho.appspot.com/ –

0

Tu idzie kod, który powinien pracować z niektórych ważnych uwag:

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

Powinien być 'JSON.stringify (payload)' –

Powiązane problemy