Service de contenu

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, le service Content peut être utilisé pour renvoyer du contenu textuel brut. Cela vous permet d'écrire des scripts qui agissent en tant que "services", en réponse aux requêtes GET et POST et en diffusant des données de différents types MIME.

Principes de base

Voici un exemple simple de service Content:

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

Déployez le script en tant qu'application Web en suivant la même procédure que si 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 permet également de renvoyer du contenu ATOM, CSV, iCal, JavaScript, JSON, RSS, vCard et XML.

Diffuser des flux RSS

Essayons quelque chose d'un peu plus compliqué, comme filtrer un flux RSS. Les bandes dessinées XKCD sont toujours amusantes, mais vous ne pouvez pas la regarder en entier, sauf si vous passez la souris sur la bande dessinée pour afficher le texte alternatif supplémentaire. Malheureusement, vous ne pouvez pas pointer sur un navigateur mobile, ce qui signifie que cela ne fonctionne pas.

Imaginons que nous voulions modifier le flux pour que la zone de perforation supplémentaire figure directement dans le flux. Au lieu de passer la souris, vous pouvez faire défiler l'écran vers le bas pour le voir. 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 délicat, mais il se décompose en 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 nécessaires. Enfin, nous encapsulons le flux modifié dans un objet TextOutput et définissons le type MIME sur RSS.

Pour voir cela en pratique, 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 des données JSON à partir de scripts

Que pouvons-nous faire d'autre avec le service de contenu ? Que diriez-vous de diffuser du code JSON à d'autres scripts, ou à d'autres sites Web et services ! Voici un script simple qui met en œuvre un service permettant à tous les utilisateurs de vérifier si un créneau horaire 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 qu'elle fonctionne. Dans ce cas, les utilisateurs de votre nouveau service peuvent l'utiliser en ajoutant des paramètres d'URL à la fin de l'URL du service. Les paramètres start et end donnent une période à vérifier, spécifiée dans l'epoch Unix standard.

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

Le service renvoie un fichier JSON qui indique si votre agenda comporte des événements compris dans cette plage.

{"available":true}

Diffuser du 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 le 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 montre une zone de message dans le navigateur avec la sortie du service, car nous spécifions la fonction alert() intégrée au navigateur comme préfixe. Le code JavaScript renvoyé se présentera comme suit:

alert({"available":true})

Redirections

Pour des raisons de sécurité, le contenu renvoyé par le service de contenu n'est pas diffusé à partir de script.google.com, mais redirigé vers une URL à usage 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'indicateur -L. Consultez la documentation de votre client HTTP pour savoir comment activer ce comportement.