Когда скрипт публикуется как веб-приложение, специальные функции обратного вызова doGet()
и doPost()
вызываются всякий раз, когда делается запрос к URL-адресу скрипта. Вместо возврата объекта пользовательского интерфейса, созданного с помощью службы HTML , службу содержимого можно использовать для возврата необработанного текстового содержимого. Это позволяет вам писать сценарии, которые действуют как «сервисы», отвечая на запросы GET
и POST
и предоставляя данные различных типов MIME.
Основы
Вот простой пример службы контента:
function doGet() {
return ContentService.createTextOutput('Hello, world!');
}
Разверните сценарий как веб-приложение , выполнив те же действия, что и при обслуживании пользовательского интерфейса. Когда к URL-адресу сценария делается запрос GET
, текст Hello, world!
будет возвращен. Помимо обычного текста, служба также поддерживает возврат содержимого ATOM, CSV, iCal, JavaScript, JSON, RSS, vCard и XML.
Обслуживание RSS-каналов
Давайте попробуем что-нибудь посложнее, например фильтрацию RSS-канала. Комиксы XKCD всегда забавны, но вы не сможете понять всю шутку, если не наведете курсор на комикс, чтобы увидеть дополнительный замещающий текст. К сожалению, вы не можете навести курсор на мобильный браузер, поэтому это не работает.
Допустим, мы хотели отредактировать ленту так, чтобы дополнительная изюминка была непосредственно в ленте, и вместо того, чтобы наводить курсор, вы просто прокручивали немного вниз, чтобы увидеть ее. Это будет отлично работать на мобильном устройстве. Вот код:
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);
}
Это может показаться сложным, но оно разбивается на простые части. Мы используем службу URL Fetch для получения исходного RSS-канала XKCD. Затем мы используем стандартное регулярное выражение JavaScript для выполнения необходимых нам замен. Наконец, мы помещаем отредактированный канал в объект TextOutput и устанавливаем тип MIME на RSS.
Чтобы увидеть это в действии, опубликуйте сценарий как веб-приложение, обязательно разрешив анонимный доступ (поскольку ваша программа чтения RSS будет посещать его как анонимный пользователь). Затем добавьте URL-адрес службы (а не исходный RSS-канал) в программу чтения RSS или просто посетите ее прямо в веб-браузере. Вот и все!
Обслуживание JSON из скриптов
Что еще мы можем делать с контент-сервисом? Как насчет передачи JSON другим скриптам или другим веб-сайтам и сервисам! Вот простой скрипт, реализующий службу, которую каждый может использовать, чтобы узнать, открыт ли слот календаря в определенное время.
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);
}
Как и прежде, опубликуйте это как анонимное веб-приложение, чтобы оно заработало. В этом случае пользователи вашего нового сервиса смогут использовать его, добавив параметры URL-адреса в конец URL-адреса сервиса. Параметры start
и end
задают диапазон времени для проверки, указанный в стандартной эпохе Unix.
curl -L URL_OF_YOUR_SCRIPT?start=1325437200&end=1325439000
Служба вернет JSON, который сообщит, есть ли в вашем календаре что-либо в этом диапазоне.
{"available":true}
Обслуживание JSONP на веб-страницах
С небольшими изменениями ваша служба JSON может стать JSONP , что означает, что ее можно вызывать из JavaScript в браузере. Вот новый скрипт:
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);
}
Чтобы вызвать эту службу из браузера, создайте тег сценария, атрибут src
которого является URL-адресом вашей службы, с дополнительным параметром prefix
. Это имя функции в клиентском JavaScript, которая будет вызываться со значением, возвращаемым службой.
<script src="URL_OF_YOUR_SCRIPT?start=1325437200&end=1325439000&prefix=alert"></script>
В этом примере будет показано окно сообщения в браузере с выводом службы, поскольку в качестве префикса мы указываем встроенную функцию alert()
браузера. Возвращенный код JavaScript будет выглядеть так:
alert({"available":true})
Перенаправления
По соображениям безопасности контент, возвращаемый службой контента, не передается с script.google.com
, а перенаправляется на одноразовый URL-адрес script.googleusercontent.com
. Это означает, что если вы используете службу контента для возврата данных в другое приложение, вы должны убедиться, что HTTP-клиент настроен на отслеживание перенаправлений. Например, в утилите командной строки cURL добавьте флаг -L
. Дополнительную информацию о том, как включить это поведение, см. в документации вашего HTTP-клиента.