Servizio contenuti

Quando uno script viene pubblicato come app web, le funzioni speciali di callback doGet() e doPost() vengono richiamate ogni volta che viene effettuata una richiesta all'URL dello script. Anziché restituire un oggetto dell'interfaccia utente creato con il servizio HTML, puoi utilizzare il servizio di contenuti per restituire contenuti testuali non elaborati. Ciò consente di scrivere script che agiscono da "servizi", rispondono alle richieste GET e POST e gestiscono dati di vari tipi MIME.

Nozioni di base

Ecco un semplice esempio del servizio Contenuti:

function doGet() {
  return ContentService.createTextOutput('Hello, world!');
}

Implementa lo script come applicazione web, seguendo gli stessi passaggi che faresti se stessi pubblicando un'interfaccia utente. Quando viene effettuata una richiesta GET all'URL dello script, il testo Hello, world! viene restituito. Oltre al testo normale, il servizio supporta anche la restituzione di contenuti ATOM, CSV, iCal, JavaScript, JSON, RSS, vCard e XML.

Pubblicazione di feed RSS

Proviamo con qualcosa di leggermente più complicato, come il filtro di un feed RSS. I fumetti di XKCD sono sempre divertenti, ma non puoi capirne tutte le battute a meno che non passi il mouse sopra il fumetto per vedere il testo alternativo aggiuntivo. Purtroppo non è possibile passare il mouse sopra un browser mobile, quindi non è possibile.

Ipotizziamo di voler modificare il feed in modo che la frase finale in più sia direttamente nel feed e, invece di passare il mouse sopra, è sufficiente scorrere un po' verso il basso per vederlo. Questo andrebbe bene su un dispositivo mobile. Ecco il codice:

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

Può sembrare complicato, ma è suddiviso in parti semplici. Utilizziamo il servizio di recupero URL per recuperare il feed RSS XKCD originale. Utilizziamo quindi un'espressione regolare JavaScript standard per eseguire le sostituzioni necessarie. Infine, incorporiamo il feed modificato in un oggetto TextOutput e impostiamo il tipo MIME su RSS.

Per vederlo in azione, pubblica lo script come app web, assicurandoti di consentire l'accesso anonimo (dal momento che il tuo lettore RSS lo visiterà come utente anonimo). Quindi, aggiungi l'URL del servizio (non il feed RSS originale) al tuo lettore RSS o visitalo direttamente in un browser web. È tutto.

Pubblicazione di JSON dagli script

Che cos'altro possiamo fare con il servizio Contenuti? Che ne pensi della pubblicazione di JSON su altri script o altri siti web e servizi. Ecco un semplice script che implementa un servizio che chiunque può utilizzare per vedere se uno slot del calendario è aperto in un orario specifico.

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

Come prima, pubblicala come app web anonima per farla funzionare. In questo caso, gli utenti del nuovo servizio possono utilizzarlo aggiungendo parametri URL alla fine dell'URL del servizio. I parametri start e end forniscono un intervallo di tempo per il controllo, specificato nell'epoca standard di Unix.

curl -L URL_OF_YOUR_SCRIPT?start=1325437200&end=1325439000

Il servizio restituirà un JSON che segnala se nel tuo calendario sono presenti elementi all'interno di quell'intervallo.

{"available":true}

Pubblicazione di JSONP nelle pagine web

Con una leggera modifica, il tuo servizio JSON può diventare JSONP, il che significa che può essere chiamato da JavaScript in un browser. Ecco il nuovo script:

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

Per chiamare questo servizio da un browser, crea un tag script il cui attributo src sia l'URL del tuo servizio, con un parametro aggiuntivo chiamato prefix. Questo è il nome della funzione nel codice JavaScript lato client che verrà chiamata con il valore restituito dal servizio.

<script src="URL_OF_YOUR_SCRIPT?start=1325437200&end=1325439000&prefix=alert"></script>

Questo esempio mostrerà una finestra di messaggio nel browser con l'output del servizio, poiché specifichiamo la funzione alert() integrata del browser come prefisso. Il codice JavaScript restituito sarà simile al seguente:

alert({"available":true})

Reindirizzamenti

Per motivi di sicurezza, i contenuti restituiti dal servizio di contenuti non vengono pubblicati da script.google.com, ma vengono reindirizzati a un URL monouso all'indirizzo script.googleusercontent.com. Ciò significa che se utilizzi il Servizio contenuti per restituire i dati a un'altra applicazione, devi assicurarti che il client HTTP sia configurato in modo da seguire i reindirizzamenti. Ad esempio, nell'utilità a riga di comando cURL, aggiungi il flag -L. Consulta la documentazione del tuo client HTTP per ulteriori informazioni su come abilitare questo comportamento.