Dịch vụ nội dung

Khi một tập lệnh được xuất bản dưới dạng ứng dụng web, các hàm gọi lại đặc biệt doGet()doPost() sẽ được gọi bất cứ khi nào có yêu cầu được tạo đến URL của tập lệnh đó. Thay vì trả về một đối tượng giao diện người dùng được tạo bằng dịch vụ HTML, bạn có thể sử dụng Dịch vụ nội dung để trả về nội dung văn bản thô. Việc này cho phép bạn viết các tập lệnh hoạt động như "dịch vụ", phản hồi các yêu cầu GETPOST và phân phát dữ liệu thuộc nhiều loại MIME.

Thông tin cơ bản

Dưới đây là một ví dụ đơn giản về Dịch vụ nội dung:

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

Triển khai tập lệnh dưới dạng ứng dụng web, thực hiện tương tự như các bước bạn sẽ thực hiện khi phân phát giao diện người dùng. Khi nhận được yêu cầu GET đến URL của tập lệnh, văn bản Hello, world! sẽ được trả về. Ngoài văn bản thuần tuý, dịch vụ này cũng hỗ trợ trả về nội dung ATOM, CSV, iCal, JavaScript, JSON, RSS, vCard và XML.

Cung cấp nguồn cấp dữ liệu RSS

Hãy thử thực hiện một thao tác phức tạp hơn một chút như lọc một nguồn cấp dữ liệu RSS. Truyện tranh XKCD luôn hài hước, nhưng bạn không thể xem toàn bộ câu chuyện cười trừ khi bạn di chuột qua chuỗi truyện tranh để xem văn bản thay thế bổ sung. Rất tiếc, bạn không thể di chuột trên trình duyệt dành cho thiết bị di động, vì vậy, tính năng này không hoạt động.

Giả sử chúng ta muốn chỉnh sửa nguồn cấp dữ liệu để dòng bấm giờ bổ sung nằm trực tiếp trong nguồn cấp dữ liệu và thay vì di chuột, bạn chỉ cần cuộn xuống một chút để xem nguồn cấp dữ liệu. Điều này sẽ hoạt động tốt trên thiết bị di động. Đây là mã:

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

Bước này có vẻ phức tạp nhưng lại được chia thành các phần đơn giản. Chúng tôi sử dụng dịch vụ Tìm nạp URL để tìm nạp nguồn cấp dữ liệu RSS ban đầu của XKCD. Sau đó, chúng tôi sử dụng biểu thức chính quy JavaScript chuẩn để thực hiện các phép thay thế cần thiết. Cuối cùng, chúng ta gói nguồn cấp dữ liệu đã chỉnh sửa trong một đối tượng TextOutput và đặt loại MIME thành RSS.

Để xem tập lệnh này trong thực tế, hãy xuất bản tập lệnh dưới dạng một ứng dụng web, đảm bảo cho phép truy cập ẩn danh (vì trình đọc RSS của bạn sẽ truy cập tập lệnh dưới dạng người dùng ẩn danh). Sau đó, hãy thêm URL của dịch vụ (không phải nguồn cấp dữ liệu RSS ban đầu) vào trình đọc RSS hoặc chỉ cần truy cập trực tiếp vào trình duyệt web đó. Vậy là xong!

Phân phát JSON qua tập lệnh

Chúng tôi có thể làm gì khác với dịch vụ Nội dung? Còn việc phân phát JSON đến các tập lệnh khác hoặc các trang web và dịch vụ khác thì sao! Dưới đây là một tập lệnh đơn giản giúp triển khai một dịch vụ mà ai cũng có thể dùng để xem liệu một khung giờ trên lịch có mở vào một thời điểm cụ thể hay không.

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

Như trước đây, hãy xuất bản ứng dụng này dưới dạng một ứng dụng web ẩn danh để ứng dụng hoạt động. Trong trường hợp này, người dùng dịch vụ mới có thể sử dụng dịch vụ này bằng cách thêm tham số URL vào cuối URL của dịch vụ. Các tham số startend cung cấp một phạm vi thời gian để kiểm tra, được chỉ định trong thời gian bắt đầu của hệ thống Unix tiêu chuẩn.

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

Dịch vụ này sẽ trả về JSON để báo cáo xem bạn có mục nào trong lịch thuộc phạm vi đó hay không.

{"available":true}

Phân phát JSONP trên các trang web

Với một thay đổi nhỏ, dịch vụ JSON của bạn có thể trở thành JSONP, nghĩa là dịch vụ này có thể được gọi qua JavaScript trong trình duyệt. Sau đây là tập lệnh mới:

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

Để gọi dịch vụ này từ trình duyệt, hãy tạo một thẻ tập lệnh có thuộc tính src là URL của dịch vụ, với một tham số bổ sung có tên là prefix. Đây là tên hàm trong JavaScript phía máy khách sẽ được gọi với giá trị được dịch vụ trả về.

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

Ví dụ này sẽ hiển thị một hộp thông báo trong trình duyệt với dữ liệu đầu ra của dịch vụ, vì chúng ta chỉ định hàm alert() tích hợp của trình duyệt làm tiền tố. Mã JavaScript được trả về sẽ có dạng như sau:

alert({"available":true})

Chuyển hướng

Vì lý do bảo mật, nội dung do Dịch vụ nội dung trả về không được phân phát từ script.google.com mà được chuyển hướng đến URL một lần tại script.googleusercontent.com. Điều này có nghĩa là nếu sử dụng Dịch vụ nội dung để trả về dữ liệu cho một ứng dụng khác, bạn phải đảm bảo rằng ứng dụng HTTP được định cấu hình để tuân theo các lệnh chuyển hướng. Ví dụ: trong tiện ích dòng lệnh cURL, hãy thêm cờ -L. Hãy xem tài liệu về ứng dụng HTTP để biết thêm thông tin về cách bật hành vi này.