2012-06-04 34 views
8

Estoy intentando escribir un mensaje a un servicio web que está a la espera de obtener JSON como carga útil el uso de Google Apps Script. Estoy usando el siguiente código:Google Apps Script UrlFetchApp con JSON carga útil

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

En el lado del servidor Estoy recibiendo el siguiente error:

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 

Estoy asumiendo que el servidor está a la espera de obtener

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

en lugar de

endDate=2012-06-03 

pero no sé cómo hacer que el UrlFetchApp hacerlo.

Respuesta

10

No entiendo el error del lado del servidor, pero el parámetro 'carga útil' debe ser una cadena como se especifica aquí: https://developers.google.com/apps-script/class_urlfetchapp?hl=fr-FR#fetch.

intento:

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

Se dice de la carga útil en el enlace:" ... Puede ser una cadena, una matriz de bytes, o una tecla de JavaScript/mapa de valores. Ver ejemplo. ". Cuando intento su propuesta, obtengo el código de error 400 del servidor. Intenté 'Utilities.jsonStringify' también con el mismo código de respuesta 400. – Guy

+0

¿Pero el mensaje de error del lado del servidor es el mismo? Intente capturar la solicitud para ver cómo se ve el cuerpo. –

+0

El mensaje de error es diferente ya que no recibo la solicitud al servidor (400). No puedo capturar la solicitud desde el lado del cliente (Google Apps Script), y no veo que pase el Tomcat. No hay rastro de eso en los registros de Tomcat. – Guy

2
  • Si se establece como una cadena de carga útil, se pasa directamente (como una cadena UTF-8 ).
  • Si establece la carga útil como un Objeto, se enviará como un formulario HTML (que significa 'application/x-www-form-urlencoded' si los campos son simples, o 'multipart/form-data' si el objeto incluye un blob/archivo ).

Para su caso de uso (el servidor espera recibir JSON), parece que Utilities.jsonStringify() es el camino a seguir.

+0

Sospecho que podría haber un problema con GAS en este escenario ya que el cuerpo de la solicitud en este caso no es válido de alguna manera. El servidor que generalmente analiza el JSON en el cuerpo desde otras fuentes, no puede analizar la solicitud entrante de GAS. Probé ambas versiones de Stringing, la carga útil, con '...' y Utilities.jsonStringify (...). – Guy

+1

Tal vez para comparar las solicitudes, pruebe el POST a una URL de eco como: http://responseecho.appspot.com/ –

0

Aquí va el código que debe trabajar con algunos comentarios importantes:

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

Debe ser 'JSON.stringify (payload)' –

Cuestiones relacionadas