2012-06-04 13 views
8

Sto provando a pubblicare su un servizio Web che prevede di ottenere JSON come payload utilizzando Google Apps Script. Sto utilizzando il seguente codice:Script di Google Apps UrlFetchApp con payload JSON

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

Sul lato server sto ottenendo il seguente errore:

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 

sto supponendo che il server si aspetta di ottenere

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

invece di

endDate=2012-06-03 

ma non so come farlo fare UrlFetchApp.

risposta

10

Non capisco l'errore lato server ma il parametro 'payload' deve essere una stringa come specificato qui: https://developers.google.com/apps-script/class_urlfetchapp?hl=fr-FR#fetch.

prova:

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

Si dice circa il carico utile nel link:" ... Può essere una stringa, un array di byte, o un tasto JavaScript/valore mappa Vedi esempio. ". Quando provo la tua proposta ottengo il codice di errore 400 dal server. Ho provato anche 'Utilities.jsonStringify' con lo stesso codice di risposta 400. – Guy

+0

Ma il messaggio di errore lato server è lo stesso? Prova a catturare la richiesta per vedere come appare il corpo. –

+0

Il messaggio di errore è diverso in quanto non ottengo la richiesta al server (400). Non riesco a catturare la richiesta dal lato client (Script di Google Apps) e non vedo passare Tomcat. Nessuna traccia di esso nei log di Tomcat. – Guy

2
  • Se si imposta payload come una stringa, verrà passato direttamente (come stringa UTF-8 ).
  • Se si imposta il payload come oggetto, verrà inviato come un modulo HTML (che significa "application/x-www-form-urlencoded" se i campi sono semplici o "multipart/form-data" se l'oggetto include un blob/file ).

Per il tuo caso d'uso (il server si aspetta di ricevere JSON), suona come Utilities.jsonStringify() è la strada da percorrere.

+0

Sospetto che in questo scenario potrebbe esserci un problema con GAS in quanto il corpo della richiesta in questo caso non è valido in alcun modo. Il server che di solito analizza JSON nel corpo da altre origini, non è in grado di analizzare la richiesta in arrivo da GAS. Ho provato entrambe le versioni di Stringing the payload, con '...' e Utilities.jsonStringify (...). – Guy

+1

Forse per confrontare le richieste, prova il POST a un URL di eco come: http://responseecho.appspot.com/ –

0

Qui va il codice che dovrebbe funzionare con alcuni commenti importanti:

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

Dovrebbe essere 'JSON.stringify (payload)' –

Problemi correlati