将脚本作为 Web 应用发布时,每当向该脚本的网址发出请求时,都会调用特殊的回调函数 doGet()
和 doPost()
。内容服务可用于返回原始文本内容,而不是返回使用 HTML 服务创建的界面对象。这样,您就可以编写充当“服务”的脚本,以响应 GET
和 POST
请求并提供各种 MIME 类型的数据。
基础知识
下面是一个简单的内容服务示例:
function doGet() {
return ContentService.createTextOutput('Hello, world!');
}
将脚本部署为 Web 应用,使用与提供界面时相同的步骤。向脚本的网址发出 GET
请求时,将返回文本 Hello, world!
。除了纯文本之外,该服务还支持返回 ATOM、CSV、iCal、JavaScript、JSON、RSS、vCard 和 XML 内容。
投放 RSS Feed
我们来试用一些稍微复杂一点的方法,比如过滤 RSS Feed。XKCD 漫画总是很有趣,但除非您将鼠标悬停在漫画栏中以查看额外的替代文本,否则无法理解整个笑话。 很遗憾,您无法将鼠标悬停在移动浏览器上,因此行不通。
假设我们想修改 Feed,使额外的关键内容直接显示在 Feed 中,而没有将鼠标悬停在那里,只需向下滚动屏幕就能看到它。这在移动设备上可以正常使用。代码如下:
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);
}
这可能看起来有点棘手,但实际上可以拆分成几个简单部分。我们使用网址提取服务来提取原始 XKCD RSS Feed。然后,我们使用标准 JavaScript 正则表达式进行所需的替换。最后,我们将修改后的 Feed 封装在 TextOutput 对象中,并将 MIME 类型设置为 RSS。
若要了解其实际效果,请将该脚本发布为 Web 应用,同时确保允许匿名访问(因为您的 RSS 阅读器将以匿名用户的身份对其进行访问)。然后将服务网址(而不是原始 RSS Feed)添加到 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);
}
像以前一样,将其发布为匿名 Web 应用,即可正常运行。在这种情况下,新服务的用户只需将网址参数添加到服务网址末尾,即可使用该服务。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
属性是您的服务网址,并附加一个名为 prefix
的参数。这是将在客户端 JavaScript 中使用服务返回的值调用的函数名称。
<script src="URL_OF_YOUR_SCRIPT?start=1325437200&end=1325439000&prefix=alert"></script>
此示例将在浏览器中显示包含服务输出的消息框,因为我们将浏览器的内置 alert()
函数指定为前缀。返回的 JavaScript 代码将如下所示:
alert({"available":true})
重定向
出于安全考虑,Content 服务返回的内容不是从 script.google.com
传送的,而是重定向到位于 script.googleusercontent.com
的一次性网址。这意味着,如果您使用内容服务将数据返回到其他应用,则必须确保将 HTTP 客户端配置为遵循重定向。例如,在 c网址 命令行实用程序中添加 -L
标志。如需详细了解如何启用此行为,请参阅 HTTP 客户端的相关文档。