Lorsqu'un script est publié en tant qu'application Web, les fonctions de rappel spéciales doGet()
et doPost()
sont appelées chaque fois qu'une requête est envoyée à l'URL du script. Au lieu de renvoyer un objet d'interface utilisateur créé avec le service HTML, vous pouvez utiliser le service Content pour renvoyer du contenu textuel brut. Cela vous permet d'écrire des scripts qui agissent en tant que services et qui répondent aux requêtes GET
et POST
, ainsi que de diffuser des données de divers types MIME.
Principes de base
Voici un exemple simple de service de contenu:
function doGet() {
return ContentService.createTextOutput('Hello, world!');
}
Déployez le script en tant qu'application Web, en suivant la même procédure que lorsque vous diffusez une interface utilisateur. Lorsqu'une requête GET
est envoyée à l'URL du script, le texte Hello, world!
est renvoyé. En plus du texte brut, le service accepte également les contenus ATOM, CSV, iCal, JavaScript, JSON, RSS, VCard et XML.
Diffusion de flux RSS
Essayons quelque chose d'un peu plus compliqué, par exemple pour filtrer un flux RSS. Les bandes dessinées XKCD sont toujours drôles, mais vous ne pouvez pas lire toute la blague à moins de passer la souris sur la bande dessinée pour voir le texte alternatif supplémentaire. Malheureusement, vous ne pouvez pas pointer sur un navigateur mobile, ce qui ne fonctionne pas.
Supposons que nous voulions modifier le flux de sorte que la ligne de perforation supplémentaire se trouve directement dans le flux. Au lieu de passer la souris, vous avez simplement fait défiler la page vers le bas pour l'afficher. Cela fonctionnerait bien sur un appareil mobile. Voici le code :
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);
}
Cela peut sembler compliqué, mais il se divise en plusieurs parties simples. Nous utilisons le service de récupération d'URL pour récupérer le flux RSS XKCD d'origine. Nous utilisons ensuite une expression régulière JavaScript standard pour effectuer les substitutions dont nous avons besoin. Enfin, nous encapsulons le flux modifié dans un objet TextOutput et définissons le type MIME sur RSS.
Pour voir comment cela fonctionne, publiez le script en tant qu'application Web, en veillant à autoriser l'accès anonyme (puisque votre lecteur RSS y accédera en tant qu'utilisateur anonyme). Ajoutez ensuite l'URL du service (et non le flux RSS d'origine) à votre lecteur RSS ou accédez-y directement dans un navigateur Web. Et voilà !
Diffuser du code JSON à partir de scripts
Que pouvons-nous faire d'autre avec le service de contenu ? Que diriez-vous de diffuser JSON sur d'autres scripts ou autres sites Web et services ? Voici un script simple qui met en œuvre un service permettant à tout le monde de déterminer si un créneau d'agenda est ouvert à un moment précis.
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);
}
Comme précédemment, publiez-la en tant qu'application Web anonyme pour la rendre opérationnelle. Dans ce cas, les utilisateurs de votre nouveau service peuvent l'utiliser en ajoutant des paramètres à la fin de l'URL du service. Les paramètres start
et end
fournissent une période à vérifier, spécifiée dans l'époque Unix standard.
curl -L URL_OF_YOUR_SCRIPT?start=1325437200&end=1325439000
Le service renvoie un fichier JSON indiquant s'il y a du contenu dans cette plage dans votre agenda.
{"available":true}
Diffuser du contenu JSONP dans des pages Web
Avec une légère modification, votre service JSON peut devenir JSONP, ce qui signifie qu'il peut être appelé à partir de JavaScript dans un navigateur. Voici le nouveau 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);
}
Pour appeler ce service à partir d'un navigateur, créez un tag de script dont l'attribut src
correspond à l'URL de votre service, avec un paramètre supplémentaire appelé prefix
. Il s'agit du nom de la fonction dans votre code JavaScript côté client qui sera appelée avec la valeur renvoyée par le service.
<script src="URL_OF_YOUR_SCRIPT?start=1325437200&end=1325439000&prefix=alert"></script>
Cet exemple affiche une fenêtre de message dans le navigateur avec la sortie du service, car nous spécifions la fonction alert()
intégrée du navigateur comme préfixe. Le code JavaScript renvoyé se présente comme suit:
alert({"available":true})
Redirections
Pour des raisons de sécurité, le contenu renvoyé par le service de contenu n'est pas diffusé depuis script.google.com
, mais redirigé vers une URL unique à l'adresse script.googleusercontent.com
. Cela signifie que si vous utilisez le service de contenu pour renvoyer des données à une autre application, vous devez vous assurer que le client HTTP est configuré pour suivre les redirections. Par exemple, dans l'utilitaire de ligne de commande cURL, ajoutez l'option -L
. Consultez la documentation de votre client HTTP pour en savoir plus sur l'activation de ce comportement.