Serviço de conteúdo

Quando um script é publicado como um app da Web, as funções especiais de callback doGet() e doPost() são invocadas sempre que uma solicitação é feita para o URL do script. Em vez de retornar um objeto da interface do usuário criado com o serviço HTML, o serviço Content pode ser usado para retornar conteúdo textual bruto. Isso permite escrever scripts que atuam como "serviços", respondendo a solicitações GET e POST e veiculando dados de vários tipos MIME.

Noções básicas

Veja um exemplo simples do serviço Conteúdo:

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

Implante o script como um app da Web usando as mesmas etapas que você faria ao disponibilizar uma interface do usuário. Quando uma solicitação GET é feita no URL do script, o texto Hello, world! é retornado. Além do texto simples, o serviço também oferece suporte ao retorno de conteúdo ATOM, CSV, iCal, JavaScript, JSON, RSS, vCard e XML.

Veiculação de feeds RSS

Vamos tentar algo um pouco mais complicado, como filtrar um feed RSS. Os quadrinhos XKCD são sempre engraçados, mas você só poderá ler a piada completa se passar o cursor sobre a tira de quadrinhos para conferir o texto alternativo extra. Não é possível passar o cursor em um navegador para dispositivos móveis. Por isso, não funciona.

Digamos que queiramos editar o feed para que o resumo extra apareça diretamente no feed e, em vez de passar o cursor, você role para baixo um pouco para vê-lo. Isso funcionaria bem em um dispositivo móvel. O código fica assim:

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

Isso pode parecer complicado, mas é dividido em partes simples. Usamos o serviço de busca de URL para buscar o feed RSS XKCD original. Em seguida, usamos uma expressão regular JavaScript padrão para fazer as substituições necessárias. Por fim, unimos o feed editado em um objeto TextOutput e definimos o tipo MIME como RSS.

Para ver como isso funciona, publique o script como um app da Web e permita o acesso anônimo, já que seu leitor de RSS o visitará como um usuário anônimo. Em seguida, adicione o URL do serviço (não o feed RSS original) ao leitor de RSS ou acesse-o diretamente em um navegador da Web. Pronto!

Como disponibilizar JSON a partir de scripts

O que mais podemos fazer com o serviço de Conteúdo? Que tal disponibilizar JSON para outros scripts ou outros sites e serviços! Veja a seguir um script simples que implementa um serviço que qualquer pessoa pode usar para ver se um horário da agenda está aberto em um horário 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, publique o app como um app da Web anônimo para que ele funcione. Nesse caso, os usuários do novo serviço podem usá-lo adicionando parâmetros de URL ao final do URL do serviço. Os parâmetros start e end fornecem um intervalo de tempo a ser verificado, especificado na época Unix padrão.

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

O serviço vai retornar um JSON que informa se há algo na sua agenda nesse intervalo.

{"available":true}

Como exibir JSONP em páginas da Web

Com uma pequena mudança, o serviço JSON pode se tornar JSONP, o que significa que ele pode ser chamado a partir do JavaScript em um navegador. Este é o novo 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);
}

Para chamar esse serviço em um navegador, crie uma tag de script em que o atributo src seja o URL do serviço, com um parâmetro extra chamado prefix. Esse é o nome da função no JavaScript do lado do cliente que será chamada com o valor retornado pelo serviço.

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

Este exemplo mostra uma caixa de mensagem no navegador com a saída do serviço, já que especificamos a função alert() integrada do navegador como nosso prefixo. O código JavaScript retornado terá esta aparência:

alert({"available":true})

Redirecionamentos

Por motivos de segurança, o conteúdo retornado pelo serviço de conteúdo não é veiculado de script.google.com, mas redirecionado para um URL único em script.googleusercontent.com. Isso significa que, se você usar o serviço de conteúdo para retornar dados a outro aplicativo, será necessário verificar se o cliente HTTP está configurado para seguir os redirecionamentos. Por exemplo, no utilitário de linha de comando cURL, adicione a sinalização -L. Consulte a documentação do seu cliente HTTP para mais informações sobre como ativar esse comportamento.