Hướng dẫn về ngôn ngữ Java

Quan trọng: Tài liệu này được viết trước năm 2012. Các tuỳ chọn xác thực được mô tả trong tài liệu này (OAuth 1.0, AuthSub và ClientLogin) đã chính thức không được dùng nữa kể từ ngày 20 tháng 4 năm 2012 và không còn hoạt động nữa. Bạn nên chuyển sang OAuth 2.0 càng sớm càng tốt.

API dữ liệu của Google Sites cho phép các ứng dụng khách truy cập, xuất bản và sửa đổi nội dung trong một trang web tạo bằng Google Sites. Ứng dụng khách của bạn cũng có thể yêu cầu danh sách hoạt động gần đây, tìm nạp lịch sử sửa đổi và tải tệp đính kèm xuống.

Ngoài việc cung cấp một số thông tin cơ bản về chức năng của Sites Data API, hướng dẫn này còn đưa ra các ví dụ về cách tương tác với API bằng thư viện ứng dụng Java. Để được trợ giúp thiết lập thư viện ứng dụng, hãy xem Bắt đầu sử dụng Thư viện ứng dụng Java dữ liệu của Google. Nếu bạn muốn tìm hiểu thêm về giao thức cơ bản mà thư viện ứng dụng Java sử dụng để tương tác với API Sites cũ, vui lòng xem hướng dẫn về giao thức.

Đối tượng người xem

Tài liệu này dành cho các nhà phát triển muốn viết các ứng dụng khách tương tác với Google Sites bằng Thư viện ứng dụng Java dữ liệu của Google.

Bắt đầu

Google Sites sử dụng Tài khoản Google hoặc tài khoản G Suite để xác thực. Nếu đã có tài khoản, thì bạn đã hoàn tất. Nếu không, bạn có thể tạo một tài khoản mới.

Cài đặt thư viện

Để được trợ giúp thiết lập và cài đặt thư viện ứng dụng, hãy xem Bắt đầu với Thư viện ứng dụng Java dữ liệu của Google. Nếu bạn đang sử dụng Eclipse, bài viết đó cũng giải thích cách thiết lập dự án của bạn bằng trình bổ trợ Eclipse của Google Data API. Dưới đây là những việc bạn cần làm để bắt đầu:

  1. Cài đặt Java 1.5 trở lên
  2. Tải thư viện ứng dụng xuống (phiên bản mới nhất của gdata-src.java.zip)
  3. Tải danh sách phần phụ thuộc xuống
  4. Tải ứng dụng mẫu xuống (phiên bản mới nhất của gdata-samples.java.zip)

Sau khi cài đặt tệp .jar, bạn cần thêm những nội dung sau vào dự án:

  1. java/lib/gdata-sites-2.0.jar – Phiên bản 2.0 ở đây là dành cho phiên bản 1.4 của API Sites cũ.
  2. java/lib/gdata-core-1.0.jar
  3. java/lib/gdata-client-1.0.jar
  4. java/lib/gdata-spreadsheet-3.0.jar (nếu làm việc với các trang danh sách / mục danh sách)

Ngoài ra, hãy nhớ thêm các tệp phần phụ thuộc (gdata-media-1.0.jar, mail.jargoogle-collect....jar).

Chạy ứng dụng mẫu

Ứng dụng mẫu đang hoạt động đầy đủ nằm trong thư mục con /java/sample/sites của tệp tải xuống gdata-samples.java.zip. Nguồn này cũng có tại /trunk/java/sample/sites/ trong kho lưu trữ SVN có thể truy cập được từ thẻ Nguồn. SitesDemo.java cho phép người dùng thực hiện một số thao tác minh hoạ cách sử dụng API của Sites cũ.

Lưu ý là bạn sẽ phải thêm java/sample/util/lib/sample-util.jar để chạy mẫu.

Bắt đầu dự án của riêng bạn

Mẹo: Hãy xem bài viết Sử dụng Eclipse với các API dữ liệu của Google để thiết lập nhanh bằng trình bổ trợ Eclipse.

Bạn sẽ cần nhập nhiều lần, tuỳ thuộc vào nhu cầu của ứng dụng. Bạn nên bắt đầu với các lệnh nhập sau:

import com.google.gdata.client.*;
import com.google.gdata.client.sites.*;
import com.google.gdata.data.*;
import com.google.gdata.data.acl.*;
import com.google.gdata.data.media.*;
import com.google.gdata.data.sites.*;
import com.google.gdata.data.spreadsheet.*;  // If working with listpages / listitems
import com.google.gdata.util.*;

Tiếp theo, bạn cũng cần thiết lập một đối tượng SitesService, đại diện cho kết nối ứng dụng với API Sites cũ:

SitesService client = new SitesService("yourCo-yourAppName-v1");

Đối số applicationName phải tuân theo định dạng: company-applicationname-version. Thông số này được dùng cho mục đích ghi nhật ký.

Lưu ý: Phần còn lại của hướng dẫn này giả định rằng bạn đã tạo một SitesService trong biến client.

Xác thực với API Sites cũ

Bạn có thể sử dụng thư viện ứng dụng Java để làm việc với nguồn cấp dữ liệu công khai hoặc riêng tư. API Dữ liệu trang web cho phép bạn truy cập vào nguồn cấp dữ liệu riêng tư và công khai, tuỳ thuộc vào quyền của Sites và thao tác mà bạn đang cố gắng thực hiện. Ví dụ: bạn có thể đọc nguồn cấp dữ liệu nội dung của một trang web công khai nhưng không được cập nhật trang đó – một hoạt động yêu cầu ứng dụng phải được xác thực. Bạn có thể thực hiện việc này thông qua quy trình xác thực tên người dùng/mật khẩu ClientLogin, AuthSub hoặc OAuth.

Vui lòng xem Tổng quan về xác thực API dữ liệu của Google để biết thêm thông tin về AuthSub, OAuth và ClientLogin.

Lưu ý: API hỗ trợ SSL (HTTPS). Nếu bạn đang sử dụng AuthSub/OAuth, hãy nhớ chỉ định phạm vi của https://sites.google.com/feeds/ để yêu cầu nguồn cấp dữ liệu qua SSL. Ngoài ra, xin lưu ý rằng đối với các miền G Suite, API sẽ tuân thủ chế độ cài đặt "Yêu cầu SSL" trong bảng điều khiển quản trị. Bạn có thể buộc tất cả các yêu cầu API chuyển qua HTTPS bằng cách gọi client.useSsl();.

AuthSub dành cho các ứng dụng web

Xác thực AuthSub cho ứng dụng web nên được sử dụng bởi các ứng dụng khách cần xác thực người dùng của họ đối với tài khoản Google. Toán tử không cần quyền truy cập vào tên người dùng và mật khẩu cho người dùng Google Sites mà chỉ cần mã thông báo AuthSub.

Xem hướng dẫn kết hợp AuthSub vào ứng dụng web của bạn

Yêu cầu mã thông báo dùng một lần

Khi người dùng truy cập vào ứng dụng của bạn lần đầu tiên, họ cần xác thực. Thông thường, nhà phát triển in một số văn bản và đường liên kết đưa người dùng đến trang phê duyệt AuthSub để xác thực người dùng và yêu cầu quyền truy cập vào tài liệu của họ. Thư viện ứng dụng Java dữ liệu của Google cung cấp hàm tạo URL này. Mã bên dưới thiết lập một đường liên kết đến trang AuthSubRequest.

import com.google.gdata.client.*;

String nextUrl = "http://www.example.com/welcome.jsp";
String scope = "https://sites.google.com/feeds/";
boolean secure = true;
boolean session = true;
String authSubUrl = AuthSubUtil.getRequestUrl(nextUrl, scope, secure, session);

Nếu bạn muốn xác thực người dùng trên miền do G Suite lưu trữ:

import com.google.gdata.client.*;

String hostedDomain = "example.com";
String nextUrl = "http://www.example.com/welcome.jsp";
String scope = "https://sites.google.com/feeds/";  // SSL is also supported
boolean secure = true;
boolean session = true;
String authSubUrl = AuthSubUtil.getRequestUrl(hostedDomain, nextUrl, scope, secure, session);

Phương thức getRequestUrl() nhận một vài tham số (tương ứng với các tham số truy vấn mà trình xử lý AuthSubRequest sử dụng):

  • URL tiếp theo – URL mà Google sẽ chuyển hướng đến sau khi người dùng đăng nhập vào tài khoản của họ và cấp quyền truy cập; http://www.example.com/welcome.jsp trong ví dụ trên
  • phạm vihttps://sites.google.com/feeds/ trong ví dụ ở trên
  • một boolean cho biết liệu mã thông báo có được dùng ở chế độ đã đăng ký hay không; false trong ví dụ trên
  • một giá trị boolean thứ hai để cho biết liệu sau đó mã thông báo này có được trao đổi lấy mã thông báo phiên hay không; true trong ví dụ trên

Nâng cấp lên mã thông báo phiên

Xem Sử dụng AuthSub với thư viện ứng dụng Google Data API.

Truy xuất thông tin về mã phiên

Xem Sử dụng AuthSub với thư viện ứng dụng Google Data API.

Thu hồi mã phiên

Xem Sử dụng AuthSub với thư viện ứng dụng Google Data API.

OAuth cho web hoặc ứng dụng đã cài đặt/thiết bị di động

Có thể sử dụng OAuth làm giải pháp thay thế cho AuthSub và dành cho các ứng dụng web. OAuth tương tự như việc sử dụng chế độ bảo mật và đăng ký của AuthSub, trong đó tất cả các yêu cầu dữ liệu phải có chữ ký số và bạn phải đăng ký miền của mình.

Xem hướng dẫn kết hợp OAuth vào ứng dụng đã cài đặt

Đang tìm nạp mã thông báo yêu cầu

Xem bài viết Sử dụng OAuth với thư viện ứng dụng Google Data API.

Uỷ quyền mã thông báo yêu cầu

Xem bài viết Sử dụng OAuth với thư viện ứng dụng Google Data API.

Nâng cấp lên mã truy cập

Xem bài viết Sử dụng OAuth với thư viện ứng dụng Google Data API.

ClientLogin cho ứng dụng đã cài đặt/dành cho thiết bị di động

Bạn nên sử dụng ClientLogin cho các ứng dụng đã cài đặt hoặc dành cho thiết bị di động cần xác thực người dùng trong Tài khoản Google. Trong lần chạy đầu tiên, ứng dụng sẽ nhắc người dùng nhập tên người dùng/mật khẩu của họ. Trong các yêu cầu tiếp theo, mã thông báo xác thực sẽ được tham chiếu.

Xem hướng dẫn kết hợp ClientLogin vào ứng dụng đã cài đặt

Để sử dụng ClientLogin, hãy gọi phương thức setUserCredentials() của đối tượng SitesService. Đối tượng này được kế thừa từ GoogleService. Chỉ định địa chỉ email và mật khẩu của người dùng mà khách hàng của bạn thay mặt gửi yêu cầu. Ví dụ:

SitesService client = new SitesService("yourCo-yourAppName-v1");
client.setUserCredentials("example@gmail.com", "pa$$word");

Mẹo: Sau khi ứng dụng xác thực thành công người dùng lần đầu tiên, hãy lưu trữ mã xác thực trong cơ sở dữ liệu để gọi lại để dùng sau. Không cần nhắc người dùng về mật khẩu của họ trong mỗi lần bạn chạy ứng dụng. Hãy xem phần Gọi lại mã thông báo xác thực để biết thêm thông tin.

Để biết thêm thông tin về cách sử dụng ClientLogin trong các ứng dụng Java, hãy xem phần Sử dụng ClientLogin với thư viện ứng dụng API dữ liệu của Google.

Trở lại đầu trang

Nguồn cấp dữ liệu trang web

Nguồn cấp dữ liệu trang web có thể dùng để liệt kê các trang web tạo bằng Google Sites mà người dùng sở hữu hoặc có quyền xem. Bạn cũng có thể dùng URL này để sửa đổi tên của một trang web hiện có. Đối với các miền G Suite, bạn cũng có thể dùng dịch vụ này để tạo và/hoặc sao chép toàn bộ trang web.

Trang web danh sách

Để truy vấn nguồn cấp dữ liệu trang web, hãy gửi một HTTP GET đến URL nguồn cấp dữ liệu trang web:

https://sites.google.com/feeds/site/site/

Trong ứng dụng Java, hãy sử dụng các lớp SiteFeedSiteEntry để làm việc với nguồn cấp dữ liệu trang web:

public String getSiteFeedUrl() {
  String domain = "site";  // OR if the Site is hosted on G Suite, your domain (e.g. example.com)
  return "https://sites.google.com/feeds/site/" + domain + "/";
}

public void getSiteFeed() throws IOException, ServiceException {
  SiteFeed siteFeed = client.getFeed(new URL(getSiteFeedUrl()), SiteFeed.class);
  for (SiteEntry entry : siteFeed.getEntries()){
    System.out.println("title: " + entry.getTitle().getPlainText());
    System.out.println("site name: " + entry.getSiteName().getValue());
    System.out.println("theme: " + entry.getTheme().getValue());
    System.out.println("");
  }
}

Đoạn mã trên in tiêu đề, tên trang web và chủ đề của trang web. Bạn có thể dùng các phương thức getter khác để truy cập vào các thuộc tính khác trong nguồn cấp dữ liệu.

Tạo trang web mới

Lưu ý: Tính năng này chỉ dành cho các miền G Suite.

Bạn có thể cấp phép cho các trang web mới bằng cách tạo một SiteEntry mới và gọi phương thức insert() của ứng dụng trên nguồn cấp dữ liệu trang web.

Ví dụ này tạo một trang web hoàn toàn mới với chủ đề "phương tiện chặn" (cài đặt không bắt buộc) và cung cấp tên trang web (bắt buộc) cũng như nội dung mô tả (không bắt buộc):

public String getSiteFeedUrl() {
  String domain = "example.com";
  return "https://sites.google.com/feeds/site/" + domain + "/";
}

public SiteEntry createSite(String title, String summary, String theme, String tag)
    throws MalformedURLException, IOException, ServiceException {
  SiteEntry entry = new SiteEntry();
  entry.setTitle(new PlainTextConstruct(title));
  entry.setSummary(new PlainTextConstruct(summary));

  Theme tt = new Theme();
  tt.setValue(theme);
  entry.setTheme(tt);

  entry.getCategories().add(new Category(TagCategory.Scheme.TAG, tag, null));

  return client.insert(new URL(getSiteFeedUrl()), entry);
}

SiteEntry newSiteEntry = createSite("My Site Title", "summary for site", "slate", "tag");

Yêu cầu trên sẽ tạo một trang web mới trong miền G Suite example.com. Do đó, URL của trang web này sẽ là https://sites.google.com/a/example.com/my-site-title.

Nếu trang web được tạo thành công, máy chủ sẽ phản hồi bằng một đối tượng SiteEntry, chứa các phần tử do máy chủ thêm vào: đường liên kết đến trang web, đường liên kết đến nguồn cấp dữ liệu acl của trang web, tên trang web, tiêu đề, thông tin tóm tắt, v.v.

Sao chép trang web

Lưu ý: Tính năng này chỉ dành cho các miền G Suite.

Sao chép một trang web cũng tương tự như việc tạo một trang web mới. Điểm khác biệt là bạn cần đặt một đường liên kết trên SiteEntry mới bao gồm đường liên kết tự liên kết của trang web cần sao chép. Sau đây là ví dụ về việc sao chép trang web được tạo trong phần Tạo trang web mới:

public SiteEntry copySite(String title, String summary, String sourceHref)
    throws MalformedURLException, IOException, ServiceException {
  SiteEntry entry = new SiteEntry();
  entry.setTitle(new PlainTextConstruct(title));
  entry.setSummary(new PlainTextConstruct(summary));
  entry.addLink(SitesLink.Rel.SOURCE, Link.Type.ATOM, sourceHref);

  return client.insert(new URL(getSiteFeedUrl()), entry);
}

String sourceHref = newSiteEntry.getLink(SitesLink.Rel.SOURCE, Link.Type.ATOM).getHref();
SiteEntry myTwin = copySite("Duplicate Site", "A copy", sourceHref);

Lưu ý quan trọng:

  • Chỉ những trang web và mẫu trang web mà người dùng đã xác thực mới có thể sao chép.
  • Bạn cũng có thể sao chép mẫu trang web. Trang web được xem là một mẫu nếu chế độ cài đặt "Xuất bản trang web này dưới dạng mẫu" được chọn trong trang cài đặt Google Sites.
  • Bạn có thể sao chép trang web từ một miền khác, trong khi chờ bạn được liệt kê là chủ sở hữu trên trang web nguồn.

Cập nhật siêu dữ liệu của trang web

Để đổi tên một trang web, thay đổi giao diện, thẻ danh mục hoặc bản tóm tắt của trang web đó, trước tiên, bạn cần tìm nạp SiteEntry chứa trang web đó, sửa đổi một hoặc nhiều thuộc tính rồi gọi phương thức update() của SiteEntry. Ví dụ này sửa đổi giao diện của trang web trước và đổi tên trang web:

myTwin.setTitle(new PlainTextConstruct("better-title"));

Theme theme = myTwin.getTheme();
theme.setValue('iceberg');
myTwin.setTheme(theme);

myTwin.getCategories().add(new Category(TagCategory.Scheme.TAG, "newTag", null));

SiteEntry updatedSiteEntry = myTwin.update();

System.out.println(updatedSiteEntry.getTitle().getPlainText();

Liên kết địa chỉ web

Tính năng ánh xạ địa chỉ web cho phép người dùng Sites ánh xạ miền của riêng họ đến một trang web tạo bằng Google Sites. Ví dụ: bạn có thể sử dụng http://www.mydomainsite.com thay cho http://sites.google.com/a/domain.com/mysite. Tuỳ thuộc vào nơi lưu trữ trang web, bạn có thể sửa đổi mối liên kết địa chỉ web của trang web theo cách thủ công. Hãy xem bài viết trong trung tâm trợ giúp của chúng tôi để biết thêm thông tin.

Tìm nạp ánh xạ địa chỉ web của một trang web

Để trả về mục ánh xạ địa chỉ web cho một trang web, hãy tìm nạp mục nhập/nguồn cấp dữ liệu trang web bằng tham số with-mappings=true:

SiteQuery query = new SiteQuery(new URL("https://sites.google.com/feeds/site/siteName"));
query.setWithMappings(true);

SiteFeed feed = service.getFeed(query, SiteFeed.class);
for (SiteEntry entry : feed.getEntries()) {
  System.out.println("Mappings for '" + entry.getSiteName().getValue() + "':");
  for (Link link : entry.getWebAddressMappingLinks()) {
    System.out.println("  " + link.getHref());
  }
}

Các mối liên kết hiện có sẽ hiển thị dưới dạng link với rel='webAddressMapping'. Ví dụ: trong ví dụ trên, có ba webAddressMapping trỏ đến trang web http://sites.google.com/site/myOtherTestSite.

Sửa đổi ánh xạ địa chỉ web

Lưu ý: Tất cả các thao tác GET/POST/PUT đều phải chỉ định tham số with-mappings=true khi làm việc với liên kết địa chỉ web. Nếu không có tham số này, webAddressMapping sẽ không được trả về trong các mục nhập trang web (GET) hoặc được xem xét khi cập nhật/xoá các liên kết (PUT) khỏi một mục nhập.

Để thêm, cập nhật hoặc xoá mối liên kết, bạn chỉ cần chỉ định, thay đổi hoặc xoá đường liên kết đó khi tạo trang web mới hoặc cập nhật siêu dữ liệu của trang web. Tham số with-mappings=true phải được đưa vào URI nguồn cấp dữ liệu trang web. Lưu ý: để cập nhật mối liên kết địa chỉ, bạn cần phải là quản trị viên trang web hoặc quản trị viên miền trong trường hợp trang web được lưu trữ trên G Suite.

Ví dụ: yêu cầu bên dưới sẽ cập nhật ánh xạ http://www.mysitemapping.com thành http://www.my-new-sitemapping.com và xoá http://www.mysitemapping2.com bằng cách rời khỏi mục liên kết:

SiteEntry entry = client.getEntry(new URL("https://sites.google.com/feeds/site/site/siteName?with-mappings=true"), SiteEntry.class);

// Modify mappings (remove all mappings, add some of them again, add modified mappings)
entry.removeLinks(SitesLink.Rel.WEBADDRESSMAPPING, Link.Type.HTML);
entry.addLink(SitesLink.Rel.WEBADDRESSMAPPING, Link.Type.HTML, "http://www.my-new-sitemapping.com");

// Update the entry with the mappings.
entry.update();

Lưu ý: Bạn cũng có thể chỉ định mục ánh xạ địa chỉ web tại thời điểm tạo/sao chép một trang web.

Trở lại đầu trang

Danh sách hoạt động

Bạn có thể tìm nạp hoạt động gần đây (các thay đổi) của một Trang web bằng cách tìm nạp nguồn cấp dữ liệu hoạt động. Mỗi mục trong nguồn cấp dữ liệu hoạt động chứa thông tin về một thay đổi đối với Trang web.

Để truy vấn nguồn cấp dữ liệu hoạt động, hãy gửi một GET HTTP đến URL của nguồn cấp dữ liệu hoạt động:

https://sites.google.com/feeds/activity/site/siteName

Trong ứng dụng Java, hãy dùng lớp ActivityFeed để trả về các đối tượng ActivityEntry:

public String buildActivityFeedUrl() {
  String domain = "site";  // OR if the Site is hosted on G Suite, your domain (e.g. example.com)
  String siteName = "mySite";
  return "https://sites.google.com/feeds/activity/" + domain + "/" + siteName + "/";
}

public void getActivityFeed() throws IOException, ServiceException {
  ActivityFeed activityFeed = client.getFeed(new URL(buildActivityFeedUrl()), ActivityFeed.class);
  for (BaseActivityEntry<?> entry : activityFeed.getEntries()){
    System.out.println(entry.getSummary().getPlainText());
    System.out.println(" revisions link: " + entry.getRevisionLink().getHref());
  }
}

Lưu ý: Để truy cập vào nguồn cấp dữ liệu này, bạn phải là cộng tác viên hoặc chủ sở hữu của Trang web. Khách hàng của bạn phải xác thực bằng mã thông báo AuthSub, OAuth hoặc ClientLogin. Hãy xem phần Xác thực với dịch vụ Sites.

Trở lại đầu trang

Nguồn cấp dữ liệu bản sửa đổi

Để tìm nạp nhật ký sửa đổi cho bất kỳ mục nhập nội dung nào, hãy gửi một HTTP GET đến đường liên kết sửa đổi của mục nhập:

https://sites.google.com/feeds/revision/site/siteName/CONTENT_ENTRY_ID

Ví dụ này truy vấn nguồn cấp nội dung, sau đó tìm nạp nguồn cấp dữ liệu sửa đổi cho mục nội dung đầu tiên:

ContentFeed contentFeed = client.getFeed(new URL(buildContentFeedUrl()), ContentFeed.class);
URL revisionFeedUrl = new URL(contentFeed.getEntries().get(0).getRevisionLink().getHref()); // use first entry

public void getRevisionFeed(String revisionFeedUrl) throws IOException, ServiceException {
  RevisionFeed revisionFeed = client.getFeed(revisionFeedUrl, RevisionFeed.class);
  for (BaseContentEntry<?> entry : revisionFeed.getEntries()){
    System.out.println(entry.getTitle().getPlainText());
    System.out.println(" updated: " + entry.getUpdated().toUiString() + " by " +
        entry.getAuthors().get(0).getEmail());
    System.out.println(" revision #: " + entry.getRevision().getValue());
  }
}

Lưu ý: Để truy cập vào nguồn cấp dữ liệu này, bạn phải là cộng tác viên hoặc chủ sở hữu của Trang web. Khách hàng của bạn phải xác thực bằng mã thông báo AuthSub, OAuth hoặc ClientLogin. Hãy xem phần Xác thực với dịch vụ Sites.

Trở lại đầu trang

Nguồn cấp nội dung

Truy xuất nguồn cấp nội dung

Nguồn cấp nội dung liệt kê nội dung mới nhất của một Trang web. Bạn có thể truy cập công cụ này bằng cách gửi HTTP GET đến URL nguồn cấp nội dung:

https://sites.google.com/feeds/content/site/siteName
Thông số nguồn cấp dữ liệuNội dung mô tả
site"site" hoặc miền của miền do G Suite lưu trữ (ví dụ: example.com).
siteNameTên trang web của bạn; được tìm thấy trong URL của trang web (ví dụ: mySite).

Ví dụ về cách tìm nạp nguồn cấp nội dung:

public String buildContentFeedUrl() {
  String domain = "site";  // OR if the Site is hosted on G Suite, your domain (e.g. example.com)
  String siteName = "mySite";
  return "https://sites.google.com/feeds/content/" + domain + "/" + siteName + "/";
}

ContentFeed contentFeed = client.getFeed(new URL(buildContentFeedUrl()), ContentFeed.class);

Kết quả contentFeed là một đối tượng ContentFeed chứa phản hồi từ máy chủ. Mỗi mục nhập của contentFeed đại diện cho một trang hoặc mục khác nhau trong Trang web của người dùng. ContentFeed sẽ chứa nhiều loại đối tượng, tất cả đều kế thừa từ BaseContentEntry: ListItemEntry, ListPageEntry, AttachmentEntry, WebAttachmentEntry, FileCabinetPageEntry, AnnouncementsPageEntry, AnnouncementEntry, WebPageEntry, CommentEntry.

Dưới đây là ví dụ về cách liệt kê các loại mục trong ContentFeed. Mỗi loại mục nhập chứa các thuộc tính khác nhau, nhưng không phải tất cả mục đều được in ở đây.

public String getContentBlob(BaseContentEntry<?> entry) {
 return ((XhtmlTextConstruct) entry.getTextContent().getContent()).getXhtml().getBlob();
}

// Extracts an entry's numeric ID.
private String getEntryId(String selfLink) {
  return selfLink.substring(selfLink.lastIndexOf("/") + 1);
}

public void printContentEntries(ContentFeed contentFeed) {
  System.out.println("Listing all WebPageEntry:");
  for (WebPageEntry entry : contentFeed.getEntries(WebPageEntry.class)) {
    System.out.println(" title: " + entry.getTitle().getPlainText());
    System.out.println(" id: " + getEntryId(entry));
    if (entry.getParentLink() != null) {
      System.out.println(" parent id: " + getEntryId(entry.getParentLink().getHref()));
    }
    System.out.println(" author: " + entry.getAuthors().get(0).getEmail());
    System.out.println(" content: " + getContentBlob(entry));
  }

  System.out.println("Listing all ListPageEntry:");
  for (ListPageEntry entry : contentFeed.getEntries(ListPageEntry.class)) {
    System.out.println(" title: " + entry.getTitle().getPlainText());
    System.out.println(" id: " + getEntryId(entry));
    for (Column col : entry.getData().getColumns()) {
      System.out.print(" [" + col.getIndex() + "] " + col.getName() + "\t");
    }
  }

  for (ListItemEntry entry : contentFeed.getEntries(ListItemEntry.class)) {
    for (Field field : entry.getFields()) {
      System.out.print(" [" + field.getIndex() + "] " + field.getValue() + "\t");
    }
    System.out.println("\n");
  }

  System.out.println("Listing all FileCabinetPageEntry:");
  for (FileCabinetPageEntry entry : contentFeed.getEntries(FileCabinetPageEntry.class)) {
    System.out.println(" title: " + entry.getTitle().getPlainText());
    System.out.println(" id: " + getEntryId(entry));
    System.out.println(" content: " + getContentBlob(entry));
  }

  System.out.println("Listing all CommentEntry:");
  for (CommentEntry entry : contentFeed.getEntries(CommentEntry.class)) {
    System.out.println(" in-reply-to: " + entry.getInReplyTo().toString());
    System.out.println(" content: " + getContentBlob(entry));
  }

  System.out.println("Listing all AnnouncementsPageEntry:");
  for (AnnouncementsPageEntry entry : contentFeed.getEntries(AnnouncementsPageEntry.class)) {
    System.out.println(" title: " + entry.getTitle().getPlainText());
    System.out.println(" id: " + getEntryId(entry));
    System.out.println(" content: " + getContentBlob(entry));
  }

  System.out.println("Listing all AnnouncementEntry:");
  for (AnnouncementEntry entry : contentFeed.getEntries(AnnouncementEntry.class)) {
    System.out.println(" title: " + entry.getTitle().getPlainText());
    System.out.println(" id: " + getEntryId(entry));
    if (entry.getParentLink() != null) {
      System.out.println(" parent id: " + getEntryId(entry.getParentLink().getHref()));
    }
    System.out.println(" draft?: " + entry.isDraft());
    System.out.println(" content: " + getContentBlob(entry));
  }

  System.out.println("Listing all AttachmentEntry:");
  for (AttachmentEntry entry : contentFeed.getEntries(AttachmentEntry.class)) {
    System.out.println(" title: " + entry.getTitle().getPlainText());
    System.out.println(" id: " + getEntryId(entry));
    if (entry.getParentLink() != null) {
      System.out.println(" parent id: " + getEntryId(entry.getParentLink().getHref()));
    }
    if (entry.getSummary() != null) {
      System.out.println(" description: " + entry.getSummary().getPlainText());
    }
    System.out.println(" revision: " + entry.getRevision().getValue());
    MediaContent content = (MediaContent) entry.getContent();
    System.out.println(" src: " + content.getUri());
    System.out.println(" content type: " + content.getMimeType().getMediaType());
  }

  System.out.println("Listing all WebAttachmentEntry:");
  for (WebAttachmentEntry entry : contentFeed.getEntries(WebAttachmentEntry.class)) {
    System.out.println(" title: " + entry.getTitle().getPlainText());
    System.out.println(" id: " + getEntryId(entry));
    if (entry.getParentLink() != null) {
      System.out.println(" parent id: " + getEntryId(entry.getParentLink().getHref()));
    }
    if (entry.getSummary() != null) {
      System.out.println(" description: " + entry.getSummary().getPlainText());
    }
    System.out.println(" src: " + ((MediaContent) entry.getContent()).getUri());
  }
}

Lưu ý: Nguồn cấp dữ liệu này có thể yêu cầu hoặc không yêu cầu xác thực, tuỳ thuộc vào quyền chia sẻ của Trang web. Nếu Trang web không công khai, ứng dụng khách của bạn phải xác thực bằng cách sử dụng mã thông báo AuthSub, OAuth hoặc ClientLogin. Hãy xem phần Xác thực dịch vụ Sites.

Ví dụ về truy vấn nguồn cấp nội dung

Bạn có thể tìm kiếm nguồn cấp nội dung bằng cách sử dụng một số tham số truy vấn API Dữ liệu của Google chuẩn và các tham số truy vấn dành riêng cho API Sites cũ. Để biết thêm thông tin chi tiết và danh sách đầy đủ các tham số được hỗ trợ, hãy xem Hướng dẫn tham khảo.

Lưu ý: Các ví dụ trong phần này sử dụng phương thức buildContentFeedUrl() trong bài viết Truy xuất nguồn cấp nội dung.

Truy xuất các loại mục nhập cụ thể

Để chỉ tìm nạp một loại mục cụ thể, hãy sử dụng tham số kind. Ví dụ này chỉ trả về các mục nhập attachment:

ContentQuery query = new ContentQuery(new URL(buildContentFeedUrl()));
query.setKind("webpage");
ContentFeed contentFeed = client.getFeed(query, ContentFeed.class);
for (AttachmentEntry entry : contentFeed.getEntries(AttachmentEntry.class)) {
  System.out.println(entry.getTitle().getPlainText());
}

Để trả về nhiều loại mục nhập, hãy phân tách từng kind bằng dấu ",". Ví dụ này trả về các mục nhập filecabinetlistpage:

URL url = new URL(buildContentFeedUrl() + "?kind=filecabinet,listpage");
ContentFeed contentFeed = client.getFeed(url, ContentFeed.class);
for (FileCabinetPageEntry entry : contentFeed.getEntries(FileCabinetPageEntry.class)) {
  System.out.println(" title: " + entry.getTitle().getPlainText());
}
for (ListPageEntry entry : contentFeed.getEntries(ListPageEntry.class)) {
  System.out.println(" title: " + entry.getTitle().getPlainText());
}

Truy xuất trang theo đường dẫn

Nếu biết đường dẫn tương đối của một trang trong trang web tạo bằng Google Sites, bạn có thể sử dụng tham số path để tìm nạp trang cụ thể đó. Ví dụ này sẽ trả về trang tại http://sites.google.com/site/siteName/path/to/the/page:

ContentQuery query = new ContentQuery(new URL(buildContentFeedUrl()));
query.setPath("/path/to/the/page");
ContentFeed contentFeed = client.getFeed(query, ContentFeed.class);
for (BaseContentEntry<?> entry : contentFeed.getEntries()) {
  System.out.println(" title: " + entry.getTitle().getPlainText());
}

Truy xuất tất cả các mục trong trang gốc

Nếu biết mã mục nhập nội dung của một trang (ví dụ: "1234567890" trong ví dụ bên dưới), bạn có thể sử dụng tham số parent để tìm nạp tất cả các mục con của trang đó (nếu có):

ContentQuery query = new ContentQuery(new URL(buildContentFeedUrl()));
query.setParent("1234567890");
ContentFeed contentFeed = client.getFeed(query, ContentFeed.class);

Để biết thêm các thông số khác, hãy xem Hướng dẫn tham khảo.

Trở lại đầu trang



Sáng tạo nội dung

Lưu ý: Trước khi tạo nội dung cho một trang web, hãy đảm bảo rằng bạn đã thiết lập trang web đó trong ứng dụng khách.
client.site = "siteName";

Bạn có thể tạo nội dung mới (trang web, trang danh sách, trang trang tổ chức tệp, trang thông báo, v.v.) bằng cách gửi HTTP POST đến nguồn cấp nội dung:

https://sites.google.com/feeds/content/site/siteName

Để biết danh sách các loại nút hỗ trợ, hãy xem tham số kind trong Hướng dẫn tham khảo.

Tạo mục / trang mới

Ví dụ sau đây sẽ tạo một webpage mới trong cấp cao nhất của Trang web, bao gồm một số ngôn ngữ viết tắt cho phần nội dung của trang và đặt tiêu đề thành "Tiêu đề trang web mới":

private void setContentBlob(BaseContentEntry<?> entry, String pageContent) {
  XmlBlob xml = new XmlBlob();
  xml.setBlob(pageContent);
  entry.setContent(new XhtmlTextConstruct(xml));
}

public WebPageEntry createWebPage(String title, String content)
    throws MalformedURLException, IOException, ServiceException {
  WebPageEntry entry = new WebPageEntry();
  entry.setTitle(new PlainTextConstruct(title));

  setContentBlob(entry, content); // Entry's HTML content

  return client.insert(new URL(buildContentFeedUrl()), entry);
}

WebPageEntry createdEntry = createWebPage("New Webpage Title", "<b>HTML content</b>");
System.out.println("Created! View at " + createdEntry.getHtmlLink().getHref());

Nếu yêu cầu thành công, createdEntry sẽ chứa bản sao của mục nhập đã tạo trên máy chủ.

Tạo mục/trang trong đường dẫn URL tuỳ chỉnh

Theo mặc định, ví dụ trước sẽ được tạo trong URL http://sites.google.com/site/siteName/new-webpage-title và có tiêu đề trang là "Tiêu đề trang web mới". Tức là <atom:title> được chuẩn hoá thành new-webpage-title cho URL. Để tuỳ chỉnh đường dẫn URL của một trang, bạn có thể thiết lập phần tử <sites:pageName>.

Ví dụ này tạo một trang filecabinet mới có tiêu đề "Bộ nhớ tệp", nhưng sẽ tạo trang trong URL http://sites.google.com/site/siteName/files (thay vì http://sites.google.com/site/siteName/file-storage) bằng cách chỉ định phần tử <sites:pageName>.

public FileCabinetPageEntry createFileCabinetPage(String title, String content, String customPageName)
    throws MalformedURLException, IOException, ServiceException {
  FileCabinetPageEntry entry = new FileCabinetPageEntry();
  entry.setTitle(new PlainTextConstruct(title));

  setContentBlob(entry, content); // Entry's HTML content

  entry.setPageName(new PageName(customPageName)); // Upload to a custom page path

  return client.insert(new URL(buildContentFeedUrl()), entry);
}

FileCabinetPageEntry createdEntry = createFileCabinetPage("File Storage", "<b>HTML content</b>", "files");
System.out.println("Created! View at " + createdEntry.getHtmlLink().getHref());

Máy chủ sử dụng các quy tắc ưu tiên sau đây để đặt tên đường dẫn URL của một trang:

  1. <sites:pageName>, nếu có. Phải đáp ứng a-z, A-Z, 0-9, -, _.
  2. <atom:title>, không được để trống nếu không có pageName. Theo cách chuẩn hoá, bạn sẽ cắt bỏ + thu gọn khoảng trắng thành "*" và xoá các ký tự không khớp với a-z, A-Z, 0-9, -, _.

Tạo trang con

Để tạo trang con (con) trong trang mẹ, bạn phải đặt đường liên kết đến trang cha trong mục nhập. Thuộc tính href của đường liên kết đến đường liên kết tự liên kết của nút mẹ.

public AnnouncementEntry postAnnouncement(String title, String content, AnnouncementsPageEntry parentPage)
    throws MalformedURLException, IOException, ServiceException {
  AnnouncementEntry entry = new AnnouncementEntry();
  entry.setTitle(new PlainTextConstruct(title));

  setContentBlob(entry, content); // Entry's HTML content

  // Set the entry's parent link to create the announcement under that page.
  entry.addLink(SitesLink.Rel.PARENT, Link.Type.ATOM, parentPage.getSelfLink().getHref());

  return client.insert(new URL(buildContentFeedUrl()), entry);
}

ContentFeed contentFeed = client.getFeed(new URL(buildContentFeedUrl() + "?kind=announcementspage"), ContentFeed.class);

AnnouncementEntry createdEntry = postAnnouncement("Party!!", "My place, this weekend", contentFeed.getEntries().get(0));
System.out.println("New post by " + createdEntry.getAuthors().get(0).getName());

Ví dụ trên sẽ tạo một announcement mới trong trang thông báo đầu tiên có trong nguồn cấp nội dung của người dùng. Tiêu đề thông báo được đặt thành "Party!!" và nội dung là "Địa điểm của tôi, cuối tuần này".

Mẫu trang

Tạo mẫu trang

Quy trình tạo mẫu trang giống như quy trình tạo mục/trang mớitạo trang con.Điểm khác biệt là việc thêm category có thuật ngữ và nhãn được đặt tương ứng là "http://schemas.google.com/g/2005#template" và "template".

Ví dụ này sẽ tạo một mẫu webpage mới.

// The template webpage entry.
WebPageEntry entry = new WebPageEntry();

// Set title and content.
entry.setTitle(new PlainTextConstruct("Page template title"));
XmlBlob xml = new XmlBlob();
xml.setBlob("Content for page template");
entry.setContent(new XhtmlTextConstruct(xml));

// Set the template category
Category TEMPLATE_CATEGORY = new Category(TemplateCategory.Scheme.LABELS,
    TemplateCategory.Term.TEMPLATE, TemplateCategory.Label.TEMPLATE);
entry.getCategories().add(TEMPLATE_CATEGORY);

// Insert the template webpage entry.
WebPageEntry createdEntry = client.insert(new URL("https://sites.google.com/feeds/content/site/siteName"), entry);

Tạo trang từ mẫu

Tương tự như việc tạo mẫu trang, bạn có thể tạo bản sao trang mới từ một mẫu bằng cách bao gồm <link> với rel='http://schemas.google.com/sites/2008#template' trỏ đến tự liên kết của mẫu trang.

Ví dụ này tạo một mẫu filecabinet mới, sau đó tạo bản sao trang filecabinet mới từ mẫu đó.

URL feedUrl = new URL("https://sites.google.com/feeds/content/site/siteName");

// 1. Create file cabinet page template
FileCabinetPageEntry inputTemplateEntry = new FileCabinetPageEntry();
inputTemplateEntry.setTitle(new PlainTextConstruct("File cabinet page template title"));
XmlBlob xml = new XmlBlob();
xml.setBlob("Content for page template");
inputTemplateEntry.setContent(new XhtmlTextConstruct(xml));

// Set the template category
Category TEMPLATE_CATEGORY = new Category(TemplateCategory.Scheme.LABELS,
    TemplateCategory.Term.TEMPLATE, TemplateCategory.Label.TEMPLATE);
inputTemplateEntry.getCategories().add(TEMPLATE_CATEGORY);

// 2. Create file cabinet page template instance
FileCabinetPageEntry templateEntry = client.insert(feedUrl, inputTemplateEntry);

// Specify link to the page template
FileCabinetPageEntry templateInstanceEntry = new FileCabinetPageEntry();
templateInstanceEntry.setTitle(new PlainTextConstruct("File cabinet template instance"));
templateInstanceEntry.addLink(new Link(SitesLink.Rel.TEMPLATE, Link.Type.ATOM, templateEntry.getSelfLink().getHref()));

FileCabinetPageEntry createdFileCabinetFromTemplate =  client.insert(feedUrl, templateInstanceEntry);

Lưu ý: Mặc dù một mẫu xác định <category> nhưng bạn vẫn bắt buộc phải có một mẫu trong mục nhập của mình. Ngoài ra, xin lưu ý rằng nếu bạn thêm phần tử <content>, máy chủ sẽ từ chối phần tử đó.

Đang tải tệp lên

Cũng giống như trong Google Sites, API hỗ trợ tải tệp đính kèm lên trang tổ chức tệp hoặc trang mẹ.

Để tải tệp đính kèm lên tài khoản mẹ, hãy gửi yêu cầu HTTP POST đến URL nguồn cấp nội dung:

https://sites.google.com/feeds/content/site/siteName

Tất cả các loại tệp đính kèm phải được tải lên trang gốc. Do đó, bạn đã đặt đường liên kết mẹ trên đối tượng AttachmentEntry hoặc WebAttachmentEntry mà bạn đang cố gắng tải lên. Hãy xem phần Tạo trang con để biết thêm thông tin.

Đang tải tệp đính kèm lên

Ví dụ này sẽ tải một tệp PDF lên FileCabinetPageEntry đầu tiên có trong nguồn cấp nội dung của người dùng. Tài liệu đính kèm này được tạo với tiêu đề "Bắt đầu" và phần mô tả (không bắt buộc), "Gói nhân sự".

MimetypesFileTypeMap mediaTypes = new MimetypesFileTypeMap();
mediaTypes.addMimeTypes("application/msword doc");
mediaTypes.addMimeTypes("application/vnd.ms-excel xls");
mediaTypes.addMimeTypes("application/pdf pdf");
mediaTypes.addMimeTypes("text/richtext rtx");
// ... See a more complete list of mime types in the SitesHelper.java

public AttachmentEntry uploadAttachment(File file, BasePageEntry<?> parentPage,
    String title, String description) throws IOException, ServiceException {
  AttachmentEntry newAttachment = new AttachmentEntry();
  newAttachment.setMediaSource(new MediaFileSource(file, mediaTypes.getContentType(file)));
  newAttachment.setTitle(new PlainTextConstruct(title));
  newAttachment.setSummary(new PlainTextConstruct(description));
  newAttachment.addLink(SitesLink.Rel.PARENT, Link.Type.ATOM, parentPage.getSelfLink().getHref());

  return client.insert(new URL(buildContentFeedUrl()), newAttachment);
}

ContentFeed contentFeed = client.getFeed(new URL(buildContentFeedUrl() + "?kind=filecabinet"), ContentFeed.class);
FileCabinetPageEntry parentPage = contentFeed.getEntries(FileCabinetPageEntry.class).get(0);

AttachmentEntry attachment = uploadAttachment(
    new File("/path/to/your/file.pdf"), parentPage, "Getting Started", "HR packet");
System.out.println("Uploaded!");

Nếu tải lên thành công, attachment sẽ chứa một bản sao của mục đính kèm đã tạo.

Tải tệp đính kèm lên thư mục

Để tải tệp đính kèm lên một thư mục hiện có trong FileCabinetPageEntry, hãy thêm một danh mục có thuộc tính "term" được đặt thành tên của thư mục. Ví dụ: thêm dòng này vào uploadAttachment():

newAttachment.getCategories().add(new Category("http://schemas.google.com/sites/2008#folder", "FolderName"));

Tệp đính kèm trên web

Tệp đính kèm trên web là loại tệp đính kèm đặc biệt. Về cơ bản, chúng là các đường liên kết đến các tệp khác trên web mà bạn có thể thêm vào danh sách trang tổ chức tệp của mình. Tính năng này tương tự như phương pháp tải lên "Thêm tệp bằng URL" trong giao diện người dùng Google Sites.

Lưu ý: Bạn chỉ có thể tạo tệp đính kèm trên web trong trang tổ chức tệp. Bạn không thể tải các tệp này lên các loại trang khác.

Ví dụ này tạo một WebAttachmentEntry trong FileCabinetPageEntry đầu tiên có trong nguồn cấp nội dung của người dùng. Tiêu đề và nội dung mô tả (không bắt buộc) của biểu trưng được đặt lần lượt thành "GoogleBiểu trưng" và "màu sắc đẹp".

public WebAttachmentEntry uploadWebAttachment(String contentUrl, FileCabinetPageEntry filecabinet,
    String title, String description) throws MalformedURLException, IOException, ServiceException {
  MediaContent content = new MediaContent();
  content.setUri(contentUrl);

  WebAttachmentEntry webAttachment = new WebAttachmentEntry();
  webAttachment.setTitle(new PlainTextConstruct(title));
  webAttachment.setSummary(new PlainTextConstruct(description));
  webAttachment.setContent(content);
  webAttachment.addLink(SitesLink.Rel.PARENT, Link.Type.ATOM,
      filecabinet.getSelfLink().getHref());

  return client.insert(new URL(buildContentFeedUrl()), webAttachment);
}

ContentFeed contentFeed = client.getFeed(new URL(buildContentFeedUrl() + "?kind=filecabinet"), ContentFeed.class);
FileCabinetPageEntry parentPage = contentFeed.getEntries(FileCabinetPageEntry.class).get(0);

WebAttachmentEntry webAttachment =
    uploadWebAttachment("http://www.google.com/images/logo.gif", parentPage, "Google's Logo", "nice colors");
System.out.println("Web attachment created!");

POST tạo một đường liên kết trong trang tổ chức tệp của người dùng trỏ đến hình ảnh tại "http://www.google.com/images/logo.gif".

Trở lại đầu trang



Cập nhật nội dung

Cập nhật siêu dữ liệu và/hoặc nội dung html của trang

Bạn có thể chỉnh sửa siêu dữ liệu (tiêu đề, tên trang, v.v.) và nội dung trang thuộc bất kỳ loại BaseContentEntry nào bằng phương thức update() của mục nhập. Thao tác này sẽ gửi một yêu cầu HTTP PUT đến đường liên kết edit của mục nhập.

Dưới đây là ví dụ về cách cập nhật ListPageEntry với các thay đổi sau:

  • Tiêu đề đã được sửa đổi thành "Tiêu đề đã cập nhật"
  • Nội dung HTML của trang được cập nhật thành '<p>Nội dung HTML đã cập nhật</p>'
  • Tiêu đề cột đầu tiên của danh sách đã thay đổi thành "Chủ sở hữu"
ContentFeed contentFeed = client.getFeed(
    new URL(buildContentFeedUrl() + "?kind=listpage"), ContentFeed.class);
ListPageEntry listPage = contentFeed.getEntries(ListPageEntry.class).get(0); // Update first list page found

// Update title
listPage.setTitle(new PlainTextConstruct("Updated Title"));

// Update HTML content
XmlBlob xml = new XmlBlob();
xml.setBlob("<p>Updated HTML Content</p>");
listPage.setContent(new XhtmlTextConstruct(xml));

// Change first column's heading
listPage.getData().getColumns().get(0).setName("Owner");

// listPage.setPageName(new PageName("new-page-path"));  // You can also change the page's URL path

ListPageEntry updatedEntry = listPage.update();

System.out.println("ListPage updated!");

Đang cập nhật nội dung tệp đính kèm

Đối với AttachmentEntry, bạn cũng có thể cập nhật nội dung bằng cách đặt MediaSource của mục nhập rồi sử dụng phương thức updateMedia(boolean) của mục nhập đó.

Ví dụ này sẽ cập nhật nội dung của một tệp đính kèm hiện có:

public AttachmentEntry updateFile(AttachmentEntry entry, File newFile)
    throws IOException, ServiceException {
  // See Uploading Attachments for the definition of mediaTypes.
  entry.setMediaSource(new MediaFileSource(newFile, mediaTypes.getContentType(newFile)));
  return entry.updateMedia(false);
}

Ví dụ này gửi yêu cầu HTTP PUT đến đường liên kết edit-media của mục nhập. AttachmentEntry được trả về sẽ chứa nội dung đã cập nhật.

Cập nhật siêu dữ liệu và nội dung của tệp đính kèm

Bạn có thể cập nhật siêu dữ liệu của tệp đính kèm và nội dung của tệp đính kèm đó trong cùng một lệnh gọi bằng cách sử dụng phương thức updateMedia(). Bạn có thể chỉ cập nhật nội dung tệp, siêu dữ liệu hoặc cả hai.

Ví dụ này thay đổi tiêu đề của tệp đính kèm thành "Tiêu đề mới", cập nhật mô tả của tệp và thay thế nội dung tệp bằng một tệp .zip mới. Vì yêu cầu chứa nội dung tệp mới, nên updateMedia() của AttachmentEntry sẽ được sử dụng.

public AttachmentEntry updateAttachment(AttachmentEntry entry, File newFile, String newTitle, String newDescription)
    throws IOException, ServiceException  {
  // See Uploading Attachments for the definition of mediaTypes.
  entry.setMediaSource(new MediaFileSource(newFile, mediaTypes.getContentType(newFile)));
  entry.setTitle(new PlainTextConstruct(newTitle));
  entry.setSummary(new PlainTextConstruct(newDescription));

  return entry.updateMedia(true);
}

ContentFeed contentFeed = client.getFeed(
    new URL(buildContentFeedUrl() + "?kind=attachment&max-results=1"), ContentFeed.class);
AttachmentEntry attachment = contentFeed.getEntries(AttachmentEntry.class).get(0); // Update first attachment found

AttachmentEntry updatedAttachment = updateAttachment(attachment, new File("/path/to/file.zip"), "New Title", "better stuff");

Trở lại đầu trang



Xoá nội dung

Để xoá một trang hoặc một mục khỏi một trang web tạo bằng Google Sites, trước tiên hãy truy xuất mục nhập nội dung, sau đó gọi delete() của mục nhập đó.

entry.delete();

Bạn cũng có thể sử dụng phương thức delete() của lớp dịch vụ bằng cách truyền vào đó đường liên kết edit và giá trị ETag của mục nhập:

client.delete(entry.getEditLink().getHref(), "*"); // Note: using "*" may overwrite another client's changes.

Nếu xoá mục nhập thành công, máy chủ sẽ phản hồi bằng một HTTP 200 OK.

Trở lại đầu trang



Đang tải tệp đính kèm xuống

Để tải một AttachmentEntry xuống, hãy gửi một yêu cầu HTTP GET đến đường liên kết content src của mục nhập.

Ví dụ này tải AttachmentEntry đầu tiên có trong nguồn cấp nội dung của người dùng xuống thư mục "/path/to/save/file/":

private void downloadFile(String downloadUrl, String fullFilePath) throws IOException, ServiceException {
  System.out.println("Downloading file from: " + downloadUrl);

  MediaContent mc = new MediaContent();
  mc.setUri(downloadUrl);
  MediaSource ms = service.getMedia(mc);

  InputStream inStream = null;
  FileOutputStream outStream = null;

  try {
    inStream = ms.getInputStream();
    outStream = new FileOutputStream(fullFilePath);

    int c;
    while ((c = inStream.read()) != -1) {
      outStream.write(c);
    }
  } finally {
    if (inStream != null) {
      inStream.close();
    }
    if (outStream != null) {
      outStream.flush();
      outStream.close();
    }
  }
}

public void downloadAttachment(AttachmentEntry entry, String directory) throws IOException, ServiceException {
  String url = ((OutOfLineContent) entry.getContent()).getUri();
  downloadFile(url, directory + entry.getTitle().getPlainText()); // Use entry's title for the save filename
}

ContentFeed contentFeed = client.getFeed(
    new URL(buildContentFeedUrl() + "?kind=attachment&max-results=1"), ContentFeed.class);

downloadAttachment(contentFeed.getEntries(AttachmentEntry.class).get(0), "/path/to/save/file/");
System.out.println("Downloaded.");

Trở lại đầu trang

Nguồn cấp dữ liệu ACL

Tổng quan về quyền chia sẻ (ACL)

Mỗi mục nhập ACL trong nguồn cấp dữ liệu ACL đại diện cho vai trò truy cập của một thực thể cụ thể, có thể là người dùng, nhóm người dùng, miền hoặc quyền truy cập mặc định (là trang web công khai). Các mục nhập sẽ chỉ được hiển thị cho các thực thể có quyền truy cập rõ ràng – một mục nhập sẽ hiển thị cho mỗi địa chỉ email trong bảng điều khiển "Người có quyền truy cập" trên màn hình chia sẻ của giao diện người dùng Google Sites. Do đó, quản trị viên miền sẽ không hiển thị, mặc dù họ có quyền truy cập ngầm định vào một trang web.

Vai trò

Phần tử vai trò thể hiện cấp truy cập mà một thực thể có thể có. Phần tử gAcl:role có thể có bốn giá trị:

  • người đọc – người xem (tương đương với quyền chỉ có thể đọc).
  • tác giả – một cộng tác viên (tương đương với quyền đọc/ghi).
  • chủ sở hữu — thường là quản trị viên trang web (tương đương với quyền đọc/ghi).

Kính ngắm

Phần tử phạm vi đại diện cho thực thể có cấp truy cập này. Có thể có 4 loại phần tử gAcl:scope:

  • user — giá trị địa chỉ email, ví dụ: "user@gmail.com".
  • group — địa chỉ email của Google Group, ví dụ: "group@domain.com".
  • domain — tên miền G Suite, ví dụ như "domain.com".
  • default – Chỉ có thể có một phạm vi thuộc loại "mặc định" không có giá trị (ví dụ: <gAcl:scope type="default">). Phạm vi cụ thể này kiểm soát quyền truy cập của bất kỳ người dùng nào theo mặc định trên trang web công khai.

Lưu ý: Miền không được có giá trị gAcl:role được đặt thành quyền truy cập "chủ sở hữu", chúng chỉ có thể là người đọc hoặc người ghi.

Truy xuất nguồn cấp dữ liệu ACL

Các lớp AclFeedAclEntry có thể được dùng để kiểm soát quyền chia sẻ của một trang web và có thể được tìm nạp bằng phương thức getFeed() của lớp dịch vụ.

Ví dụ sau tìm nạp nguồn cấp dữ liệu ACL cho một trang web nhất định và in ra quyền của từng AclEntry:

public String getAclFeedUrl(String siteName) {
  String domain = "site";  // OR if the Site is hosted on G Suite, your domain (e.g. example.com)
  return "https://sites.google.com/feeds/acl/site/" + domain + "/" + siteName + "/";
}

public void getAclFeed(String siteName) throws IOException, ServiceException {
  AclFeed aclFeed = client.getFeed(new URL(getAclFeedUrl(siteName)), AclFeed.class);
  for (AclEntry entry : aclFeed.getEntries()) {
    System.out.println(entry.getScope().getValue() + " (" + entry.getScope().getType() + ") : " +
                       entry.getRole().getValue());
  }
}

getAclFeed('my-site-name');

Nếu bạn đang làm việc với các mục nhập trong SiteFeed, mỗi SiteEntry chứa một đường liên kết đến nguồn cấp dữ liệu ACL của nó. Ví dụ: đoạn mã này tìm nạp nguồn cấp dữ liệu acl của SiteEntry:

String aclLink = siteEntry.getLink(SitesAclFeedLink.Rel.ACCESS_CONTROL_LIST, Link.Type.ATOM).getHref();
AclFeed aclFeed = client.getFeed(new URL(aclLink), AclFeed.class);

Chia sẻ trang web

Lưu ý: Bạn chỉ có thể sử dụng một số ACL chia sẻ nhất định nếu miền được định cấu hình để cho phép các quyền đó (ví dụ: nếu bạn bật tính năng chia sẻ bên ngoài miền cho các miền G Suite, v.v.).

Để chia sẻ một trang web tạo bằng Google Sites bằng API này, ứng dụng của bạn cần tạo một AclEntry mới và POST nó đến máy chủ.

Sau đây là ví dụ về cách thêm "user@example.com" làm reader trên trang web:

AclRole role = new AclRole("reader");
AclScope scope = new AclScope(AclScope.Type.USER, "user@example.com");
AclEntry aclEntry = addAclRole(role, scope, entry);

public AclEntry addAclRole(AclRole role, AclScope scope, SiteEntry siteEntry)
    throws IOException, MalformedURLException, ServiceException  {
  AclEntry aclEntry = new AclEntry();
  aclEntry.setRole(role);
  aclEntry.setScope(scope);

  Link aclLink = siteEntry.getLink(SitesAclFeedLink.Rel.ACCESS_CONTROL_LIST, Link.Type.ATOM);
  return client.insert(new URL(aclLink.getHref()), aclEntry);
}

Xem phần Tổng quan về nguồn cấp dữ liệu ACL để biết các giá trị AclScopeAclRoles có thể có.

Chia sẻ ở cấp nhóm và cấp miền

Tương tự như việc chia sẻ trang web với một người dùng, bạn có thể chia sẻ trang web trên một nhóm Google hoặc miền G Suite.

Đang chia sẻ với địa chỉ email của nhóm:

AclScope scope = new AclScope(AclScope.Type.GROUP, "group_name@example.com");

Chia sẻ với toàn bộ miền:

AclScope scope = new AclScope(AclScope.Type.DOMAIN, "example.com");

Chúng tôi chỉ hỗ trợ chia sẻ ở cấp miền cho các miền G Suite và chỉ cho miền mà trang web được lưu trữ. Ví dụ: http://sites.google.com/a/domain1.com/siteA chỉ có thể chia sẻ toàn bộ Trang web với domain1.com, không phải domain2.com. Các trang web không được lưu trữ trên miền G Suite (ví dụ: http://sites.google.com/site/siteB) không thể mời các miền.

Sửa đổi quyền chia sẻ

Đối với quyền chia sẻ hiện có trên một Trang web, trước tiên, hãy tìm nạp AclEntry được đề cập, sửa đổi quyền theo ý muốn, sau đó gọi phương thức update() của AclEntry để sửa đổi Danh sách kiểm soát quyền truy cập (ACL) trên máy chủ.

Ví dụ này sửa đổi ví dụ trước về aclEntry trong phần Chia sẻ một trang web, bằng cách cập nhật "user@example.com" thành writer (cộng tác viên):

aclEntry.setRole(new AclRole("writer"));
AclEntry updatedAclEntry = aclEntry.update();

// Could also use the client's update method
// client.update(new URL(aclEntry.getEditLink().getHref()), aclEntry);

Để biết thêm thông tin về ETag, hãy xem hướng dẫn tham khảo API dữ liệu của Google.

Đang xoá quyền chia sẻ

Để xoá quyền chia sẻ, trước tiên hãy truy xuất AclEntry rồi gọi phương thức delete():

aclEntry.delete();

// Could also use the client's delete method
// client.delete(new URL(aclEntry.getEditLink().getHref()), aclEntry);

Để biết thêm thông tin về ETag, hãy xem hướng dẫn tham khảo API dữ liệu của Google.

Trở lại đầu trang

Chủ đề đặc biệt

Truy xuất lại nguồn cấp dữ liệu hoặc mục nhập

Nếu muốn truy xuất một nguồn cấp dữ liệu hoặc mục nhập mà bạn đã truy xuất trước đó, bạn có thể cải thiện tính hiệu quả bằng cách yêu cầu máy chủ chỉ gửi danh sách hoặc mục nhập nếu danh sách hoặc mục nhập đó đã thay đổi kể từ lần gần nhất bạn truy xuất.

Để thực hiện loại truy xuất có điều kiện này, cả hai phương thức getFeed()getEntry() đều cung cấp một đối số bổ sung chấp nhận giá trị ETag hoặc đối tượng DateTime cho tiêu đề If-Modified-Since. Bạn có thể truy cập vào thẻ của mục nhập từ entry.getEtag().

Ví dụ sau thực hiện truy xuất có điều kiện cho mục nhập trang web nội dung:

String feedUrl = "https://sites.google.com/feeds/content/site/siteName/123456789";
WebPageEntry entry = client.getEntry(new URL(feedUrl), WebPageEntry.class, "\"GVQHSARDQyp7ImBq\"");

Khi nhận được yêu cầu này, máy chủ sẽ kiểm tra xem mục mà bạn yêu cầu có cùng ETag với ETag mà bạn đã chỉ định hay không. Nếu ETag khớp, thì mục đó sẽ không thay đổi và máy chủ sẽ trả về một ngoại lệ HTTP 304 NotModifiedException.

Nếu ETag không khớp, thì mục này đã được sửa đổi kể từ lần cuối cùng bạn yêu cầu và máy chủ sẽ trả về mục.

Để biết thêm thông tin về ETag, hãy xem hướng dẫn tham khảo API dữ liệu của Google.

Trở lại đầu trang