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. 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 nữa. Bạn nên chuyển sang OAuth 2.0 sớm nhất có thể.

API dữ liệu 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 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ề những khả 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 cách dù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 Google Data Java. Nếu bạn quan tâm đến để 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 Sites API cổ điển, vui lòng xem hướng dẫn về giao thức.

Đối tượng

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 cách sử dụng Thư viện ứng dụng Java 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 về việc 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 Google Data Java. 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 điều 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

Một ứng dụng mẫu 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. Bạn cũng có thể xem nguồn thông tin này 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 Sites 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 các API dữ liệu của Google để thiết lập nhanh bằng trình bổ trợ Eclipse.

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 diện cho kết nối ứng dụng với Sites API cũ:

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

Đối số applicationName phải 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 bạn đã tạo SitesService trong biến client.

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

Bạn có thể 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ư. Sites Data API cấp quyền truy cập vào các báo cáo riêng tư và công khai nguồn cấp dữ liệu, 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 nội dung của trang web công khai nhưng không cập nhật trang web đó – đây là quy định bắt buộc phải có khách hàng đã xác thực. Việc này có thể thực hiện qua 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ề việc 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 đảm bảo chỉ định phạm vi 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 G Suite, thì chế độ cài đặt "Yêu cầu SSL" API sẽ áp dụng chế độ cài đặt trong bảng điều khiển quản trị. Bạn có thể buộc tất cả API yêu cầu chuyển qua HTTPS bằng cách gọi client.useSsl();.

AuthSub 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 với Tài khoản Google. Nhà cung cấp dịch vụ không cần quyền truy cập vào tên người dùng và mật khẩu đối với người dùng Google Sites - mà chỉ cần Bắt buộc phải có mã thông báo AuthSub.

Xem hướng dẫn về cách 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 phải xác thực. Thông thường, nhà phát triển in một số văn bản và một đường liên kết để hướng người dùng vào 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 vài tham số (tương ứng với tham số truy vấn được 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
  • boolean cho biết 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

Hãy 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 phần 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

Hãy 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

OAuth có thể được dùng làm phương án 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ả yêu cầu dữ liệu phải được ký số và bạn phải đăng ký miền của mình.

Xem hướng dẫn về cách 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

Hãy xem bài viết Sử dụng OAuth với Thư viện ứng dụng Google Data API.

Cấp quyền mã thông báo yêu cầu

Hãy 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

Hãy xem bài viết Sử dụng OAuth với Thư viện ứng dụng Google Data API.

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

ClientLogin phải được sử dụng bởi các ứng dụng di động hoặc đã cài đặt cần xác thực người dùng với 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 của họ. Trong các yêu cầu tiếp theo, mã thông báo xác thực đang được tham chiếu.

Xem hướng dẫn về cách 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 đượ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 họ đư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 của bạn 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 để sử dụng sau này. Không cần phải nhắc người dùng nhập mật khẩu mỗi lần chạy ứng dụng của bạn. 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ể sử dụng nguồn cấp dữ liệu trang web này để liệt kê những 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 miền này để tạo và/hoặc sao chép toàn bộ trang web.

Trang 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ể 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 đề trang web, tên trang web và chủ đề của trang web. Bạn có thể sử dụng các phương thức getter khác cho truy cập vào các cơ sở lưu trú 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 các trang web mới bằng cách tạo một SiteEntry mới và gọi insert() 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' (chế độ cài đặt không bắt buộc) và cung cấp tên trang web (bắt buộc) và 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 thuộc 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 SiteEntry , được điền sẵn bằng các phần tử do máy chủ thêm vào: liên kết đến trang web, liên kết đến nguồn cấp dữ liệu acl của trang web, tên trang web, tiêu đề, bản 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.

Quá trình sao chép một trang web tương tự như quy trình tạo một trang web mới. Sự khác biệt là bạn cần đặt đường liên kết trên SiteEntry mới của bạn, trong đó bao gồm đường liên kết tự liên kết 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);

Điểm quan trọng:

  • 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 lệnh "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 một trang web từ một miền khác, trừ phi 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 chủ đề, 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 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ụ: http://www.mydomainsite.com có thể được sử dụng 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 bản đồ ánh xạ địa chỉ web của trang web. Hãy xem bài viết trên 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ề 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'. Chẳng hạn như trong ví dụ trên có 3 webAddressMapping trỏ đến trang web này http://sites.google.com/site/myOtherTestSite.

Sửa đổi mối liên kết địa chỉ web

Lưu ý: Mọi thao tác GET/POST/PUT phải chỉ định tham số with-mappings=true khi hoạt động bằng cách 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á (PUT) ánh xạ khỏi một mục nhập.

Để thêm, cập nhật hoặc xoá mối liên kết, chỉ cần chỉ định, thay đổi hoặc xoá đường liên kết như vậy 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 của nguồn cấp dữ liệu trang web. Lưu ý: để cập nhật mục ánh xạ đị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 đối với 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 đưa đường liên kết ra khỏi mục:

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ủa một Trang web (các thay đổi) bằng cách tìm nạp nguồn cấp dữ liệu hoạt động. Mỗi mục nhập trong nguồn cấp dữ liệu hoạt động chứa thông tin về 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 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. Ứ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 bài viết Xác thực với dịch vụ Sites.

Trở lại đầu trang

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

https://sites.google.com/feeds/content/site/siteName
Thông số nguồn cấp dữ liệuMô 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 trang web của bạn; được tìm thấy trong URL của trang web (ví dụ: mySite).

Ví dụ về 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);

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 contentFeed đại diện cho một trang hoặc mục khác trong Trang web của người dùng. ContentFeed sẽ chứa nhiều loại tổng số đối tượng, tất cả được 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 hoặc không yêu cầu xác thực; tuỳ theo quyền chia sẻ của Trang web. Nếu Trang web không công khai, ứng dụng 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 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 chuẩn của Google Data API và những thông tin 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 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 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ề filecabinetlistpage mục nhập:

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 Sites, bạn có thể sử dụng tham số path để tìm nạp trang cụ thể đó. Ví dụ này trả về trang nằm ở 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 nhập 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ụ dưới đây), bạn có thể sử dụng tham số parent để tìm nạp tất cả các mục nhập con (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



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 của mình 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 một HTTP POST vào 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ụ này sẽ tạo một webpage mới ở cấp cao nhất của Trang web, bao gồm một số IME cho phần nội dung của 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 bản sao của mục đượ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 với tiêu đề là "File Storage", nhưng lại 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 (con) trong trang mẹ, bạn phải đặt đường liên kết mẹ trong mục nhập. Thuộc tính href của đường liên kết đến 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 tìm thấy trong nguồn cấp nội dung của người dùng. Tiêu đề thông báo được đặt thành "Tiệc tùng!!" và nội dung thành "Đị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 cũng 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 từ khoá và nhãn được đặt thành "http://nguyes.google.com/g/2005#template" và "mẫu".

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ẫu bằng cách thêm <link> với rel='http://schema.google.com/sites/2008#template' chỉ đến đường liên kết tự liên kết của một mẫu trang.

Ví dụ này sẽ tạo một mẫu filecabinet mới rồi tạo thực thể cho trang filecabinet mới qua 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>, bao gồm một mẫu trong mục nhập vẫn là bắt buộc. 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 một tệp đính kèm lên thư mục 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 một đường liên kết gốc trên AttachmentEntry hoặc WebAttachmentEntry đối tượng mà bạn đang cố gắng tải lên. 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 tải một tệp PDF lên FileCabinetPageEntry đầu tiên trong nguồn cấp 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à một phần mô tả (không bắt buộc) là "gói HR".

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 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ó "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 web là các 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 của trang tổ chức tệp. Tính năng này tương tự như tính năng "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 được tìm thấy trong nguồn cấp 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 'GoogleLogo' và 'màu đẹ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 cách 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 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!");

Đ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, 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 sẽ gửi yêu cầu HTTP PUT đến đường liên kết edit-media của mục nhập. Được trả về AttachmentEntry 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 phương thức updateMedia(). Trường hợp 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ụ sau sẽ thay đổi tiêu đề tệp đính kèm thành "Tiêu đề mới", cập nhật nội dung mô tả 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 trang web tạo bằng Google Sites, trước tiên hãy truy xuất mục nhập nội dung rồi 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:

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 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 xuống được tìm thấy trong nguồn cấp nội dung của người dùng vào 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à một trang web công khai). Mục nhập sẽ chỉ 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 từng địa chỉ email trong phần "Người dùng có quyền truy cập" trong 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, ngay cả khi chúng có quyền truy cập ngầm ẩn 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ó. Phần tử gAcl:role có thể có 4 giá trị:

  • người đọc — một 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).
  • owner – thường là quản trị viên trang web (tương đương với quyền truy cập đọ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:

  • người dùng — một giá trị địa chỉ email, ví dụ: "user@gmail.com".
  • group — một địa chỉ email của Google Group, ví dụ: "group@domain.com".
  • domain – một tên miền của G Suite, ví dụ: "domain.com".
  • default — Chỉ có thể có một phạm vi thuộc loại "default", 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 đặt thành "chủ sở hữu" truy cập, họ chỉ có thể là độc giả hoặc tác giả.

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 hoạt động chia sẻ của một trang web quyền 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 cụ thể và xuất ra các quyền của mỗi 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 thì 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ẻ một trang web

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

Để chia sẻ trang web tạo bằng Google Sites bằng API, khách hàng của bạn cần tạo một trang web mới AclEntryPOST đến máy chủ.

Dưới đây là ví dụ có thêm "user@example.com" dưới dạng 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 AclScope có thể xuất hiện và AclRoles giá trị.

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 qua Nhóm Google hoặc miền G Suite.

Chia sẻ với một địa chỉ email 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ỉ cho miền mà trang web 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, chứ không thể chia sẻ với domain2.com. 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 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ó liên quan rồi sửa đổi quyền đó như mong muốn rồi gọi phương thức update() của AclEntry để sửa đổi ACL trên máy chủ.

Ví dụ này sửa đổi ví dụ về aclEntry trước đó trong phần Chia sẻ trang web, bằng cách cập nhật 'user@example.com' trở 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 nguồn cấp dữ liệu hoặc mục nhập mà bạn đã truy xuất trước đây, bạn có thể cải thiện hiệu quả bằng cách cho biết máy chủ để gửi danh sách hoặc mục nhập chỉ khi danh sách hoặc mục nhập đã thay đổi kể từ lần cuối bạn truy xuất.

Để thực hiện kiểu 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ẻ etag của một 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 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ặt hàng bạn yêu cầu có cùng ETag như ETag mà bạn đã chỉ định. Nếu ETag khớp, thì mặt hàng không thay đổi và máy chủ trả về Hệ thống sẽ gửi trường hợp ngoại lệ HTTP 304 NotModifiedException.

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