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 callback đặc biệt doGet()doPost() được gọi bất cứ khi nào có yêu cầu được gửi đến tập lệnh URL. 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ề dữ liệu thô nội dung văn bản. Điều này cho phép bạn viết các tập lệnh đóng vai trò là "dịch vụ", phản hồi các yêu cầu GETPOST cũng như phản hồi dữ liệu phân phát thuộc nhiều loại MIME.

Khái niệm 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 một ứng dụng web, bằng cách sử dụng các bước giống như khi bạn phân phát giao diện người dùng. Thời gian một yêu cầu GET được thực hiện đến URL của tập lệnh, thì văn bản Hello, world! sẽ là bị trả lại. Ngoài văn bản thuần tuý, dịch vụ này cũng hỗ trợ trả về ATOM, Nội dung CSV, iCal, JavaScript, JSON, RSS, vCard và XML.

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

Hãy thử một hành động phức tạp hơn một chút, chẳng hạn như lọc nguồn cấp dữ liệu RSS. Chiến lược phát hành đĩa đơn Truyện tranh XKCD lúc nào cũng hài hước, nhưng không thể xem trọn vẹn nói đùa trừ phi bạn di chuột lên phần truyện tranh để xem văn bản thay thế. 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 để điểm nhấn bổ sung nằm 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. Đó 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);
}

Việc này có vẻ phức tạp nhưng sẽ 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 bản gốc Nguồn cấp dữ liệu RSS XKCD. Sau đó, chúng tôi sử dụng một biểu thức chính quy JavaScript chuẩn để làm cho phương thức thay thế mà mình cần. Cuối cùng, chúng tôi gói nguồn cấp dữ liệu đã chỉnh sửa trong một TextOutput (Đầu ra văn bản) và đặt MIME nhập vào RSS.

Để xem mã này trong thực tế, hãy xuất bản tập lệnh dưới dạng ứng dụng web, đồng thời đảm bảo cho phép quyền truy cập ẩn danh (vì trình đọc RSS của bạn sẽ truy cập dưới dạng ẩn danh người dùng). 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 nguồn cấp dữ liệu 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 từ các tập lệnh

Chúng tôi có thể làm gì khác với dịch vụ Nội dung? Làm thế nào để phân phối JSON cho các tập lệnh hoặc các trang web và dịch vụ khác! Đây là một tập lệnh đơn giản giúp triển khai dịch vụ mà bất kỳ ai cũng có thể sử dụng để xem liệu một ô lịch có mở tại một thời điểm cụ thể hay không bất cứ lúc nào.

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ủa bạn có thể sử dụng nó bằng cách thêm tham số URL vào cuối đoạn mã URL dịch vụ của bạn. Tham số startend đưa ra một khoảng thời gian để kiểm tra, được chỉ định trong thời gian Unix chuẩn.

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

Dịch vụ sẽ trả về JSON báo cáo xem bạn có bất kỳ nội dung gì trong lịch trong phạm vi đó.

{"available":true}

Phân phát JSONP trong trang web

Với một thay đổi nhỏ, dịch vụ JSON của bạn có thể trở thành JSONP, tức là có thể được gọi khỏi JavaScript trong trình duyệt. Dưới đâ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ụ có một tham số bổ sung có tên là prefix. Chiến dịch này là tên của hàm trong JavaScript phía máy khách của bạn sẽ được gọi bằng 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 kết quả dịch vụ, vì chúng ta chỉ định hàm alert() tích hợp sẵn của trình duyệt làm tiền tố. Chiến lược phát hành đĩa đơn 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ề sẽ không được phân phát từ script.google.com, nhưng lại đượ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 bạn 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 máy khách HTTP được định cấu hình để theo dõi chuyển hướng. Ví dụ: trong tiện ích dòng lệnh cURL, thêm cờ -L. Hãy xem tài liệu về ứng dụng HTTP của bạn để biết thêm thông tin về cách kích hoạt hành vi này.