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.