Cuando una secuencia de comandos se publica como una aplicación web, las funciones especiales de devolución de llamada doGet()
y doPost()
se invocan cada vez que se realiza una solicitud a la URL de la secuencia de comandos. En lugar de mostrar un objeto de interfaz de usuario creado con el servicio HTML, se puede usar el servicio de contenido para mostrar contenido textual sin procesar. Esto te permite escribir secuencias de comandos que actúen como &servicios; esto responde a las solicitudes GET
y POST
, y entrega datos de varios tipos de MIME.
Conceptos básicos
Este es un ejemplo simple del servicio de contenido:
function doGet() {
return ContentService.createTextOutput('Hello, world!');
}
Implementa la secuencia de comandos como una aplicación web y sigue los mismos pasos que si estuvieras entregando una interfaz de usuario. Cuando se realiza una solicitud GET
a la URL de la secuencia de comandos, se muestra el texto Hello, world!
. Además de texto sin formato, el servicio también puede mostrar contenido ATOM, CSV, iCal, JavaScript, JSON, RSS, vCard y XML.
Publicación de feeds RSS
Probemos algo más complicado, como filtrar un feed RSS. Los cómics de XKCD siempre son graciosos, pero no puedes obtener el chiste completo, a menos que te desplaces sobre la tira de cómics para ver el texto alternativo adicional. Lamentablemente, no puedes desplazarte en un navegador móvil, por lo que esto no funciona.
Supongamos que queremos editar el feed para que el texto adicional aparezca directamente en el feed. En lugar de desplazarse sobre este, te desplazaste un poco hacia abajo. Eso funcionaría bien en un dispositivo móvil. Este es el código:
function doGet() {
var feed = UrlFetchApp.fetch('http://xkcd.com/rss.xml').getContentText();
feed = feed.replace(
/(<img.*?alt="(.*?)".*?>)/g,
'$1' + new Array(10).join('<br />') + '$2');
return ContentService.createTextOutput(feed)
.setMimeType(ContentService.MimeType.RSS);
}
Esto puede parecer complicado, pero se divide en partes simples. Usamos el servicio de recuperación de URL para recuperar el feed RSS de XKCD original. Luego, usamos una expresión regular de JavaScript estándar para hacer las sustituciones que necesitamos. Por último, unimos el feed editado en un objeto TextOutput y establecimos el tipo de MIME en RSS.
Para ver esto en acción, publica la secuencia de comandos como una aplicación web y asegúrate de permitir el acceso anónimo (ya que el lector RSS la visitará como usuario anónimo). Luego, agrega la URL del servicio (no el feed RSS original) a tu lector de RSS o visítala directamente en un navegador web. Listo.
Entrega JSON desde secuencias de comandos
¿Qué más podemos hacer con el servicio de contenido? ¿Qué te parece entregar JSON a otras secuencias de comandos o a otros sitios web y servicios? Esta es una secuencia de comandos simple que implementa un servicio que cualquier persona puede usar para ver si hay un horario disponible en un horario específico.
function doGet(request) {
var events = CalendarApp.getEvents(
new Date(Number(request.parameters.start) * 1000),
new Date(Number(request.parameters.end) * 1000));
var result = {
available: events.length == 0
};
return ContentService.createTextOutput(JSON.stringify(result))
.setMimeType(ContentService.MimeType.JSON);
}
Como antes, publica esto como una aplicación web anónima para que funcione. En este caso, los usuarios de tu servicio nuevo pueden usarlo si agregan parámetros de URL al final de la URL del servicio. Los parámetros start
y end
proporcionan un intervalo de tiempo para verificar, especificado en la época Unix estándar.
curl -L URL_OF_YOUR_SCRIPT?start=1325437200&end=1325439000
El servicio mostrará JSON que informa si tienes algo en tu calendario en ese rango.
{"available":true}
Entrega JSONP en páginas web
Con un pequeño cambio, tu servicio JSON puede convertirse en JSONP, lo que significa que se puede llamar desde JavaScript en un navegador. Esta es la nueva secuencia de comandos:
function doGet(request) {
var events = CalendarApp.getEvents(
new Date(Number(request.parameters.start) * 1000),
new Date(Number(request.parameters.end) * 1000));
var result = {
available: events.length == 0
};
return ContentService.createTextOutput(
request.parameters.prefix + '(' + JSON.stringify(result) + ')')
.setMimeType(ContentService.MimeType.JAVASCRIPT);
}
Para llamar a este servicio desde un navegador, crea una etiqueta de secuencia de comandos cuyo atributo src
sea la URL del servicio, con un parámetro adicional llamado prefix
. Este es el nombre de la función en tu JavaScript del cliente a la que se llamará con el valor que muestra el servicio.
<script src="URL_OF_YOUR_SCRIPT?start=1325437200&end=1325439000&prefix=alert"></script>
En este ejemplo, se mostrará un cuadro de mensaje en el navegador con el resultado del servicio, ya que especificamos la función alert()
integrada del navegador como nuestro prefijo. El código de JavaScript que se muestra se verá de la siguiente manera:
alert({"available":true})
Redireccionamientos
Por motivos de seguridad, el contenido que muestra el servicio de contenido no se entrega desde script.google.com
, sino que se redirecciona a una URL por única vez en script.googleusercontent.com
. Esto significa que si usas el servicio de contenido para mostrar datos a otra aplicación, debes asegurarte de que el cliente HTTP esté configurado para seguir redireccionamientos. Por ejemplo, en la utilidad de línea de comandos cURL, agrega la marca -L
. Consulta la documentación de tu cliente HTTP para obtener más información sobre cómo habilitar este comportamiento.