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

Lưu ý 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 ngừng hoạt động kể từ ngày 20 tháng 4 năm 2012 và không còn được cung cấp nữa. Bạn nên chuyển sang OAuth 2.0 càng sớm càng tốt.

Google Sites Data API 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 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 nhật ký 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ề các chức năng của Sites Data API, hướng dẫn này còn cung cấp 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ài viết Bắt đầu sử dụng Thư viện ứng dụng Java của Google Data. 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 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

Tài liệu này dành cho những 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 của Google Data.

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ài viết Bắt đầu sử dụng Thư viện ứng dụng Java của Google Data. 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 bằng trình bổ trợ Eclipse cho API dữ liệu của Google. Dưới đây là những gì bạn cần để 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 các ứ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 .jars, bạn cần đưa 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 trang danh sách / mục danh sách)

Ngoài ra, hãy nhớ thêm các tệp jar 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 đầy đủ đang hoạt động nằm trong thư mục con /java/sample/sites của tệp tải xuống gdata-samples.java.zip. Bạn cũng có thể truy cập nguồn tại /trunk/java/sample/sites/ trong kho lưu trữ SVN qua thẻ Source (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 trang web phiên bản cũ.

Lưu ý rằng bạn sẽ cần 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 API Dữ liệu của Google để thiết lập nhanh bằng trình bổ trợ Eclipse của chúng tôi.

Tuỳ thuộc vào nhu cầu của ứng dụng, bạn sẽ cần một vài lệnh nhập. 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 đối tượng SitesService. Đối tượng này đại diện cho kết nối ứng dụng khách với API Trang web cũ:

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

Đối số applicationName phải theo định dạng: company-applicationname-version. Tham số này 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 bạn đã tạo SitesService trong biến client.

Xác thực đến API Sites cũ

Bạn có thể sử dụng thư viện ứng dụng Java để xử lý nguồn cấp dữ liệu công khai hoặc riêng tư. API Dữ liệu trang web cung cấp quyền truy cập vào nguồn cấp dữ liệu công khai và riêng tư, tuỳ thuộc vào quyền của Trang web và thao tác 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 thể cập nhật nguồn cấp dữ liệu đó – một thao tác cần có ứng dụng đã xác thực. Bạn có thể thực hiện việc này thông qua phương thức xác thực tên người dùng/mật khẩu ClientLogin, AuthSub hoặc OAuth.

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

Mẹo: API này 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 theo 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ả yêu cầu API phải qua HTTPS bằng cách gọi client.useSsl();.

AuthSub cho ứng dụng web

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

Xem hướng dẫn để tích hợp AuthSub vào ứng dụng web

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 sẽ in một số văn bản và đường liên kết hướng 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 Google Data Java cung cấp một hàm để tạo URL này. Mã bên dưới thiết lập một 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ữ, hãy làm như sau:

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 số 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 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 sử dụng ở chế độ đã đăng ký hay không; false trong ví dụ trên
  • boolean thứ hai để cho biết sau đó mã thông báo 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 phần Sử dụng AuthSub với Thư viện ứng dụng API Dữ liệu của Google.

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

Hãy xem bài viết Sử dụng AuthSub với Thư viện ứng dụng API Dữ liệu của Google.

Thu hồi mã thông báo phiên

Xem phần Sử dụng AuthSub với Thư viện ứng dụng API Dữ liệu của Google.

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

Bạn có thể sử dụng OAuth thay 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 ở chỗ tất cả yêu cầu dữ liệu phải được ký bằng kỹ thuật số và bạn phải đăng ký miền của mình.

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

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 API Dữ liệu của Google.

Cấp 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 API Dữ liệu của Google.

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 API Dữ liệu của Google.

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

Các ứng dụng đã cài đặt hoặc ứng dụng di động cần dùng tính năng ClientLogin để xác thực người dùng bằng Tài khoản Google. Trong lần chạy đầu tiên, ứng dụng của bạn sẽ nhắc người dùng nhập tên người dùng/mật khẩu. 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, kế thừa từ GoogleService. Chỉ định địa chỉ email và mật khẩu của người dùng mà ứng dụng của bạn đang thay mặt để đưa ra 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ã thông báo xác thực trong cơ sở dữ liệu để gọi lại khi cần sử dụng sau này. Bạn không cần nhắc người dùng nhập mật khẩu mỗi khi 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

Bạn có thể dùng nguồn cấp dữ liệu trang web để liệt kê những trang web Google Sites mà người dùng sở hữu hoặc có quyền xem. Bạn cũng có thể dùng tệp 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 tính năng này để tạo và/hoặc sao chép toàn bộ trang web.

Trang web đăng thông tin

Để 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, bạn có thể 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à giao diện của trang web. Có các phương thức getter khác để truy cập vào các thuộc tính bổ sung 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ụ sau tạo một trang web hoàn toàn mới với giao diện "phương tiện chặn" (chế độ cài đặt không bắt buộc) và cung cấp tên trang web (bắt buộc) và 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 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, trong đó có 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.

Cách sao chép trang web cũng tương tự như cách tạo 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, trong đó có đường liên kết nội bộ của trang web cần sao chép. Dưới đây là ví dụ về việc sao chép trang web đã 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);

Các điểm quan trọng:

  • Bạn chỉ có thể sao chép các trang web và mẫu trang web mà người dùng đã xác thực sở hữu.
  • Bạn cũng có thể sao chép mẫu trang web. Trang web là mẫu nếu bạn chọn chế độ cài đặt "Xuất bản trang web này dưới dạng mẫu" trong trang cài đặt Google Sites.
  • Bạn có thể sao chép một trang web từ một miền khác, miễn là 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 phầ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 hữu quan, sửa đổi một hoặc nhiều thuộc tính, sau đó 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 liên kết địa chỉ web cho phép người dùng Sites liên kết miền của riêng họ với một trang web Google Sites. Ví dụ: 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 các mục ánh xạ địa chỉ web của trang web

Để trả về các mối liên kết đị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ẽ xuất hiện dưới dạng link có 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 mối liên kết địa chỉ web

Lưu ý: Tất cả thao tác GET/POST/PUT phải chỉ định tham số with-mappings=true khi làm việc với các mố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 trang web (GET) hoặc được xem xét khi cập nhật/xoá (PUT) mối liên kết khỏi một mục.

Để 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á mối 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. Bạn phải đưa tham số with-mappings=true 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 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 nhập đường 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 ý: Việc ánh xạ địa chỉ web cũng có thể được chỉ định vào thời điểm tạo/sao chép 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 đã được thực hiện đối với Trang web.

Để truy vấn nguồn cấp dữ liệu hoạt động, hãy gửi một HTTP GET đến URL 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 sử 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 ý: Bạn phải là cộng tác viên hoặc chủ sở hữu của Trang web thì mới có thể truy cập vào nguồn cấp dữ liệu này. Ứ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. Xem phần Xác thực với dịch vụ Trang web.

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 dữ liệu nội dung, sau đó tìm nạp nguồn cấp dữ liệu bản sửa đổi cho mục nhập 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. Ứ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 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 dữ liệu nội dung

Nguồn cấp dữ liệu 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 vào URL này bằng cách gửi GET HTTP đến URL của nguồn cấp dữ liệu nội dung:

https://sites.google.com/feeds/content/site/siteName
Tham số nguồn cấp dữ liệuMô tả
site"site" hoặc miền của miền được lưu trữ trên G Suite (ví dụ: example.com).
siteNameTên trang web của trang web của bạn; có thể 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 dữ liệu 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);

contentFeed thu được 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 nhập 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ả đề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 xác thực hoặc không; 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ã AuthSub, OAuth hoặc ClientLogin. Hãy xem phần Xác thực với dịch vụ Sites.

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

Bạn có thể tìm kiếm nguồn cấp dữ liệu nội dung bằng một số tham số truy vấn API Dữ liệu Google tiêu chuẩn và các tham số dành riêng cho API trang web kiểu cũ. Để biết thêm thông tin chi tiết và danh sách đầy đủ các thông 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 phần Truy xuất nguồn cấp dữ liệu 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 nhập cụ thể, hãy sử dụng tham số kind. Ví dụ này chỉ trả về attachment mục nhập:

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 Google Site, 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 nằm 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 một trang mẹ

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ả mục nhập 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 các thông số khác, hãy xem Hướng dẫn tham khảo.

Trở lại đầu trang



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.
client.site = "siteName";

Bạn có thể tạo nội dung mới (trang web, trang danh sách, trang tệp, trang thông báo, v.v.) bằng cách gửi POST HTTP đến nguồn cấp dữ liệu 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ụ này tạo một webpage mới trong cấp cao nhất của Trang web, bao gồm một số XHTML cho phần nội dung trang và đặt tiêu đề 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 một bản sao của mục nhập được 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 đề là "File Storage" (Bộ nhớ tệp), nhưng tạo trang này 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 cho đườ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. Chuẩn hoá là cắt + thu gọn khoảng trắng thành "-" và xoá những ký tự không khớp với a-z, A-Z, 0-9, -, _.

Tạo trang con

Để tạo trang con (thuộc trang mẹ), bạn phải đặt đường liên kết đến trang mẹ trong mục nhập. Thuộc tính href của đường liên kết đến đường liên kết 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 tạo một announcement mới trong trang thông báo đầu tiên có trong nguồn cấp dữ liệu nội dung của người dùng. Tiêu đề thông báo được đặt là "Tiệc tùng!!" 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ư tạo mục/trang mớitạo trang con. Điểm khác biệt là việc thêm category với thuật ngữ và nhãn được đặt thành "http://schemas.google.com/g/2005#template" và "template" tương ứng.

Ví dụ này 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 thực thể cho trang mới từ mẫu bằng cách thêm <link> với rel='http://schema.google.com/sites/2008#template' trỏ đến đường liên kết 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 của 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ẫu xác định <category>, nhưng bạn vẫn phải thêm một <category> vào mục nhập. 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

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

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

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

Bạn phải tải tất cả các loại tệp đính kèm lên một trang mẹ. Do đó, bạn đặt đường liên kết mẹ trên đối tượng AttachmentEntry hoặc WebAttachmentEntry mà bạn đang cố tải lên. Hãy xem bài viết 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 tải một tệp PDF lên FileCabinetPageEntry đầu tiên tìm thấy trong nguồn cấp dữ liệu nội dung của người dùng. Tệp đính kèm được tạo với tiêu đề "Bắt đầu" và nội dung mô tả (không bắt buộc) là "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 bạn 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 một 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à một loại tệp đính kèm đặc biệt. Về cơ bản, đó 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 trang thông tin của mình trong filecabinet. Tính năng này tương tự như phương thức tải lên "Thêm tệp theo 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 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 tìm thấy trong nguồn cấp dữ liệu nội dung của người dùng. Tiêu đề và mô tả (không bắt buộc) của biểu trưng được đặt thành "GoogleBiểu trưng" và "màu sắc đẹp" tương ứng.

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 ngăn xếp 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 đề, pageName, v.v.) và nội dung trang của bất kỳ loại BaseContentEntry nào bằng cách sử dụ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 PUT HTTP đế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 được 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!");

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, sau đó 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 một yêu cầu PUT HTTP đế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 + nội dung tệp đính kèm

Bạn có thể cập nhật siêu dữ liệu 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(). Liệu bạn có thể chỉ cập nhật nội dung tệp, siêu dữ liệu hay cả hai.

Ví dụ này thay đổi tiêu đề của tệp đính kèm thành "New Title" (Tiêu đề mới), cập nhật nội dung mô tả và thay thế nội dung tệp bằng 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ục khỏi 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 đường liên kết edit và giá trị ETag của mục nhập vào phương thức đó:

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

Nếu mục nhập đã được xoá 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 AttachmentEntry xuống, hãy gửi yêu cầu GET HTTP đến đường liên kết src nội dung của mục nhập.

Ví dụ này tải AttachmentEntry đầu tiên tìm thấy trong nguồn cấp dữ liệu 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 một vai trò truy cập của một 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à một trang web công khai). Mục nhập sẽ chỉ xuất hiện cho những thực thể có quyền truy cập rõ ràng – một mục nhập sẽ xuất hiện cho mỗi địa chỉ email trong bảng "Những 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 xuất hiện, mặc dù họ có quyền truy cập ngầm vào một trang web.

Vai trò

Phần tử vai trò đại diện cho cấp truy cập mà một thực thể có thể có. Có 4 giá trị có thể có của phần tử gAcl:role:

  • reader – người xem (tương đương với quyền chỉ có thể đọc).
  • người viết — 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).

Phạm vi

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

  • user – giá trị địa chỉ email, ví dụ: "user@gmail.com".
  • group – địa chỉ email Google Groups, ví dụ: "group@domain.com".
  • domain – tên miền G Suite, ví dụ: "domain.com".
  • mặc định – Chỉ có một phạm vi có thể 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 mà mọi người dùng có theo mặc định trên một trang web công khai.

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

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

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

Ví dụ sau đây sẽ tìm nạp nguồn cấp dữ liệu ACL cho một trang web nhất định và in ra các 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 trong SiteFeed, thì mỗi SiteEntry sẽ chứa một đường liên kết đến nguồn cấp dữ liệu ACL của mục đó. 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 ý: Một số ACL chia sẻ nhất định có thể chỉ hoạt động được 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ẻ Google Sites bằng API, ứng dụng khách của bạn cần tạo một AclEntry mới và POST ứng dụng đó đến máy chủ.

Dưới đây là ví dụ về việc 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à 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 trên Google Groups hoặc miền G Suite.

Cách 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");

Tính năng chia sẻ ở cấp miền chỉ được hỗ trợ cho các miền G Suite và chỉ dành cho miền lưu trữ trang web. Ví dụ: http://sites.google.com/a/domain1.com/siteA chỉ có thể chia sẻ toàn bộ Trang web với domain1.com, chứ không phải miền2.com. Những trang web không được lưu trữ trên một miền G Suite (ví dụ: http://sites.google.com/site/siteB) không thể mời 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 liên quan, sửa đổi quyền như mong 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ụ aclEntry trước đó của chúng ta trong phần Chia sẻ 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 về API dữ liệu của Google.

Đang thu hồi 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 về 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 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 truy xuất gần đây nhất.

Để thực hiện loại truy xuất có điều kiện này, cả 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 etag của một mục từ entry.getEtag().

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

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 không thay đổi và máy chủ trả về một ngoại lệ HTTP 304 NotModifiedException sẽ được gửi.

Nếu ETag không khớp, thì mặt hàng đã được sửa đổi kể từ lần gần đây nhất bạn yêu cầu và máy chủ trả về mặt hàng.

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

Trở lại đầu trang