Quan trọng: Tài liệu này được viết trước năm 2012. Các lựa chọn uỷ quyền đượ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 Site. Ứ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 API Dữ liệu của Sites, 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 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, bạn có thể bỏ qua bước này. 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ợ Google Data APIs Eclipse. Sau đây là những điều bạn cần để bắt đầu:
- Cài đặt Java 1.5 trở lên
- Tải thư viện ứng dụng xuống (phiên bản mới nhất của
gdata-src.java.zip) - Tải danh sách phần phụ thuộc xuống
- 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 .jars, bạn sẽ cần thêm những nội dung sau vào dự án của mình:
java/lib/gdata-sites-2.0.jar– Phiên bản 2.0 ở đây dành cho phiên bản 1.4 của API Sites cũ.java/lib/gdata-core-1.0.jarjava/lib/gdata-client-1.0.jarjava/lib/gdata-spreadsheet-3.0.jar(nếu bạn đang làm việc với các trang danh sách / mục trong danh sách)
Ngoài ra, hãy nhớ thêm các jar phần phụ thuộc (gdata-media-1.0.jar, mail.jar và google-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 bản tải xuống gdata-samples.java.zip.
Nguồn này cũng có tại /trunk/java/sample/sites/ trong kho lưu trữ SVN mà bạn có thể truy cập 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ũ.
Xin lưu ý rằng bạn 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
Lưu ý: Hãy xem bài viết Sử dụng Eclipse với Google Data API để 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 số nội dung nhập. Bạn nên bắt đầu bằng các lệnh nhập sau:
import com.google.gdata.client.*; import com.google.gdata.client.sites.*; import com.google.gdata.data.*; import com.google.gdata.data.acl.*; import com.google.gdata.data.media.*; import com.google.gdata.data.sites.*; import com.google.gdata.data.spreadsheet.*; // If working with listpages / listitems import com.google.gdata.util.*;
Tiếp theo, bạn cũng cần thiết lập một đối tượng SitesService. Đối tượng này đại diện cho một mối kết nối ứng dụng với API Sites cũ:
SitesService client = new SitesService("yourCo-yourAppName-v1");
Đối số applicationName phải có định dạng: company-applicationname-version. Tham số này được dùng cho mục đích ghi nhật ký.
Lưu ý: Phần còn lại của hướng dẫn này giả định rằng bạn đã tạo một SitesService trong biến client.
Xác thực với API Sites cũ
Bạn có thể 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 cung cấp quyền truy cập vào các nguồn cấp dữ liệu riêng tư và công khai, tuỳ thuộc vào quyền của Sites và thao tác mà bạn đang cố gắng thực hiện. Ví dụ: bạn có thể đọc nguồn cấp nội dung của một Trang web công khai nhưng không thể cập nhật nội dung đó. Để làm được việc này, bạn cần có một ứng dụng khách đã 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ề 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 này hỗ trợ SSL (HTTPS). Nếu bạn đang sử dụng AuthSub/OAuth, hãy nhớ chỉ định phạm vi là https://sites.google.com/feeds/ để yêu cầu nguồn cấp dữ liệu qua SSL. Ngoài ra, xin lưu ý rằng đối với các miền G Suite, API sẽ tuân thủ chế độ cài đặt "Yêu cầu SSL" trong bảng điều khiển quản trị. Bạn có thể buộc tất cả các yêu cầu API phải được thực hiện qua HTTPS bằng cách gọi client.useSsl();.
AuthSub cho ứng dụng web
Xác thực AuthSub cho các ứng dụng web phải được dùng bởi những ứng dụng khách cần xác thực người dùng của mình với Tài khoản Google. Người vận hành không cần có 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 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 truy cập vào ứng dụng của bạn lần đầu tiên, người dùng 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 chuyển 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 Java của Google Data cung cấp một hàm để tạo URL này. Mã bên dưới thiết lập một đường liên kết đến trang AuthSubRequest.
import com.google.gdata.client.*; String nextUrl = "http://www.example.com/welcome.jsp"; String scope = "https://sites.google.com/feeds/"; boolean secure = true; boolean session = true; String authSubUrl = AuthSubUtil.getRequestUrl(nextUrl, scope, secure, session);
Nếu bạn muốn xác thực người dùng trên miền được lưu trữ trên G Suite:
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() có 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 next – 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.jsptrong ví dụ ở trên - phạm vi –
https://sites.google.com/feeds/trong ví dụ trên - một giá trị boolean để cho biết liệu mã thông báo sẽ được dùng ở chế độ đã đăng ký hay không;
falsetrong ví dụ ở trên - một giá trị boolean thứ hai để cho biết liệu mã thông báo sau này có được trao đổi để lấy mã thông báo phiên hay không;
truetrong 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 Google Data API.
Truy xuất thông tin về mã thông báo phiên
Xem phần Sử dụng AuthSub với Thư viện ứng dụng Google Data API.
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 Google Data API.
OAuth cho web hoặc ứng dụng di động/đã cài đặt
OAuth có thể được dùng thay cho AuthSub và dành cho các ứng dụng web. OAuth tương tự như việc sử dụng chế độ an toàn và đã đăng ký của AuthSub ở chỗ tất cả các yêu cầu dữ liệu đều phải được ký bằng chữ 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
Tìm nạp mã thông báo yêu cầu
Xem phần Sử dụng OAuth với Thư viện ứng dụng Google Data API.
Uỷ quyền cho mã thông báo yêu cầu
Xem phần Sử dụng OAuth với Thư viện ứng dụng Google Data API.
Nâng cấp lên mã truy cập
Xem phần 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/ứng dụng di động
ClientLogin phải được dùng bởi các ứng dụng đã cài đặt hoặc ứng dụng di động cần xác thực người dùng của họ vào 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ột mã thông báo xác thực sẽ đượ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. Đối tượng này được kế thừa từ GoogleService. Chỉ định địa chỉ email và mật khẩu của người dùng mà thay mặt cho họ, ứng dụng khách của bạn đang đưa ra yêu cầu. Ví dụ:
SitesService client = new SitesService("yourCo-yourAppName-v1"); client.setUserCredentials("example@gmail.com", "pa$$word");
Lưu ý: 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 uỷ quyền trong cơ sở dữ liệu để truy xuất cho lần sử dụng sau. 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 Thu hồi mã thông báo uỷ quyền để 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 Google Data API.
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 để liệt kê những trang web trên Google Sites mà người dùng sở hữu hoặc có quyền xem. Bạn cũng có thể dùng công cụ này để sửa đổi tên của một trang web hiện có. Đối với 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 yêu cầu 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 SiteFeed và SiteEntry để 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. Bạn có thể dùng các phương thức getter khác để truy cập vào các thuộc tính 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ỉ được cung cấp cho các miền G Suite.
Bạn có thể cung cấp các trang web mới bằng cách tạo một SiteEntry mới và gọi phương thức insert() của ứng dụng trên nguồn cấp dữ liệu trang web.
Ví dụ này tạo một trang web hoàn toàn mới có giao diện "slate" (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, được điền sẵn 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 đề, nội dung tóm tắt, v.v.
Sao chép trang web
Lưu ý: Tính năng này chỉ được cung cấp cho các miền G Suite.
Quy trình sao chép một trang web cũng tương tự như quy trình tạo một trang web mới. Điểm khác biệt là bạn cần đặt một đường liên kết trên SiteEntry mới của mình, trong đó có đường liên kết tự tham chiếu của trang web cần sao chép.
Sau đây là ví dụ về cách sao chép trang web được tạo trong phần Tạo trang web mới:
public SiteEntry copySite(String title, String summary, String sourceHref) throws MalformedURLException, IOException, ServiceException { SiteEntry entry = new SiteEntry(); entry.setTitle(new PlainTextConstruct(title)); entry.setSummary(new PlainTextConstruct(summary)); entry.addLink(SitesLink.Rel.SOURCE, Link.Type.ATOM, sourceHref); return client.insert(new URL(getSiteFeedUrl()), entry); } String sourceHref = newSiteEntry.getLink(SitesLink.Rel.SOURCE, Link.Type.ATOM).getHref(); SiteEntry myTwin = copySite("Duplicate Site", "A copy", sourceHref);
Những điểm quan trọng:
- Bạn chỉ có thể sao chép những 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. Một trang web là mẫu nếu bạn đánh dấu vào chế độ cài đặt "Xuất bản trang web này dưới dạng mẫu" trong trang cài đặt của 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 chủ đề, thẻ danh mục hoặc nội dung 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 có liên 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();
Ánh xạ đị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 trên Google Sites. Ví dụ: bạn có thể dùng http://www.mydomainsite.com thay vì http://sites.google.com/a/domain.com/mysite. Tuỳ thuộc vào nơi lưu trữ trang web của bạn, bạn có thể sửa đổi các mối liên kết giữa địa chỉ web của trang web theo cách thủ công. 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ối liên kết địa chỉ web của một 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/nguồn cấp dữ liệu của 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ó 3 webAddressMapping trỏ đến trang web http://sites.google.com/site/myOtherTestSite.
Sửa đổi ánh xạ địa chỉ web
Lưu ý: Tất cả các thao tác GET/POST/PUT đều phải chỉ định tham số with-mappings=true khi làm việc với các mối liên kết địa chỉ web. Nếu thiếu 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) các mối liên kết khỏi một mục.
Để thêm, cập nhật hoặc xoá một 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 một trang web. Bạn phải thêm tham số with-mappings=true vào URI nguồn cấp dữ liệu trang web.
Lưu ý: để cập nhật thông tin á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 trong trường hợp trang web được lưu trữ trên G Suite.
Ví dụ: yêu cầu bên dưới sẽ cập nhật mối liên kết http://www.mysitemapping.com thành http://www.my-new-sitemapping.com và xoá http://www.mysitemapping2.com bằng cách loại bỏ mối liên kết khỏi mục nhập:
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();
Xin lưu ý rằng bạn cũng có thể chỉ định mối liên kết giữa địa chỉ web tại thời điểm tạo/sao chép một trang web.
Danh sách hoạt động
Bạn có thể tìm nạp hoạt động (thay đổi) gần đây 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 đều chứa thông tin về một thay đổi được thực hiện đối với Trang web.
Để truy vấn bảng tin hoạt động, hãy gửi một GET HTTP đến URL bảng tin 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 ý: 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ó quyền truy cập vào nguồn cấp dữ liệu này. Ứng dụng phải xác thực bằng mã thông báo AuthSub, OAuth hoặc ClientLogin. Xem phần Xác thực với dịch vụ Sites.
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 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 đó:
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 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 phải xác thực bằng mã thông báo AuthSub, OAuth hoặc ClientLogin. Xem phần Xác thực với dịch vụ Sites.
Nguồn cấp dữ liệu 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 nguồn cấp nội dung bằng cách gửi một GET HTTP đến URL của nguồn cấp nội dung:
https://sites.google.com/feeds/content/site/siteName
| Tham số nguồn cấp dữ liệu | Mô tả |
|---|---|
site | "site" hoặc miền của tên miền được lưu trữ trên G Suite (ví dụ: example.com). |
siteName | Tên không gian trên web của trang web; có trong URL của trang web (ví dụ: mySite). |
Ví dụ về việc 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 trong 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 đối tượng, tất cả đều được kế thừa từ BaseContentEntry: ListItemEntry, ListPageEntry, AttachmentEntry, WebAttachmentEntry, FileCabinetPageEntry, AnnouncementsPageEntry, AnnouncementEntry, WebPageEntry, CommentEntry.
Sau đâ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ỳ thuộc vào quyền chia sẻ của Trang web. Nếu Trang web không phải là trang web công khai, thì ứng dụng 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ụ Sites.
Ví dụ về truy vấn nguồn cấp nội dung
Bạn có thể tìm kiếm trong nguồn cấp nội dung bằng cách sử dụng một số tham số truy vấn Google Data API tiêu chuẩn và những tham số 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 dữ liệu nội dung.
Truy xuất các loại mục cụ thể
Để chỉ tìm nạp một loại mục cụ thể, hãy sử dụng tham số kind. Ví dụ này chỉ trả về các mục attachment:
ContentQuery query = new ContentQuery(new URL(buildContentFeedUrl())); query.setKind("webpage"); ContentFeed contentFeed = client.getFeed(query, ContentFeed.class); for (AttachmentEntry entry : contentFeed.getEntries(AttachmentEntry.class)) { System.out.println(entry.getTitle().getPlainText()); }
Để trả về nhiều loại mục nhập, hãy phân tách từng kind bằng dấu ",". Ví dụ này trả về các mục nhập filecabinet và listpage:
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 mộ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ể 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ã nhận dạng mục nội dung của một trang (ví dụ: "1234567890" trong ví dụ bên dưới), bạn có thể dùng tham số parent để tìm nạp tất cả mục con của trang đó (nếu có):
ContentQuery query = new ContentQuery(new URL(buildContentFeedUrl())); query.setParent("1234567890"); ContentFeed contentFeed = client.getFeed(query, ContentFeed.class);
Để biết thêm các thông số, hãy xem Hướng dẫn tham khảo.
Tạo nội dung
Lưu ý: Trước khi tạo nội dung cho một trang web, hãy đảm bảo rằng bạn đã thiết lập trang web đó trong ứng dụng khách.client.site = "siteName";
Bạn có thể tạo nội dung mới (trang web, trang danh sách, trang tủ hồ sơ, trang thông báo, v.v.) bằng cách gửi một HTTP POST đến nguồn cấp nội dung:
https://sites.google.com/feeds/content/site/siteName
Để biết danh sách các loại nút được 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 nội dung trang và đặt tiêu đề của 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 được tạo trên máy chủ.
Tạo các 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ể đặt phần tử <sites:pageName>.
Ví dụ này tạo một trang filecabinet mới có tiêu đề là "Lưu trữ tệp", nhưng tạo trang trong URL http://sites.google.com/site/siteName/files (thay vì http://sites.google.com/site/siteName/file-storage) bằng cách chỉ định phần tử <sites:pageName>.
public FileCabinetPageEntry createFileCabinetPage(String title, String content, String customPageName) throws MalformedURLException, IOException, ServiceException { FileCabinetPageEntry entry = new FileCabinetPageEntry(); entry.setTitle(new PlainTextConstruct(title)); setContentBlob(entry, content); // Entry's HTML content entry.setPageName(new PageName(customPageName)); // Upload to a custom page path return client.insert(new URL(buildContentFeedUrl()), entry); } FileCabinetPageEntry createdEntry = createFileCabinetPage("File Storage", "<b>HTML content</b>", "files"); System.out.println("Created! View at " + createdEntry.getHtmlLink().getHref());
Máy chủ sử dụng các quy tắc ưu tiên sau đây để đặt tên cho đường dẫn URL của trang:
<sites:pageName>, nếu có. Phải đáp ứnga-z, A-Z, 0-9, -, _.<atom:title>không được có giá trị rỗng nếu không có pageName. Chuẩn hoá là cắt + thu gọn khoảng trắng thành "-" và xoá các ký tự không khớp vớia-z, A-Z, 0-9, -, _.
Tạo trang con
Để tạo trang con trong một 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ự tham chiếu của nút mẹ.
public AnnouncementEntry postAnnouncement(String title, String content, AnnouncementsPageEntry parentPage) throws MalformedURLException, IOException, ServiceException { AnnouncementEntry entry = new AnnouncementEntry(); entry.setTitle(new PlainTextConstruct(title)); setContentBlob(entry, content); // Entry's HTML content // Set the entry's parent link to create the announcement under that page. entry.addLink(SitesLink.Rel.PARENT, Link.Type.ATOM, parentPage.getSelfLink().getHref()); return client.insert(new URL(buildContentFeedUrl()), entry); } ContentFeed contentFeed = client.getFeed(new URL(buildContentFeedUrl() + "?kind=announcementspage"), ContentFeed.class); AnnouncementEntry createdEntry = postAnnouncement("Party!!", "My place, this weekend", contentFeed.getEntries().get(0)); System.out.println("New post by " + createdEntry.getAuthors().get(0).getName());
Ví dụ trên sẽ tạo một announcement mới trong trang thông báo đầu tiên có trong nguồn cấp nội dung của người dùng. Tiêu đề thông báo được đặt thành "Tiệc tùng!!" và nội dung là "Nhà 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 với quy trình tạo các mục/trang mới và tạo trang con.Điểm khác biệt là việc thêm category với cụm từ và nhãn được đặt thành "http://schemas.google.com/g/2005#template" và "template" (mẫu) 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ể một trang mới từ mẫu bằng cách thêm một <link> có rel='http://schemas.google.com/sites/2008#template' trỏ đến tự liên kết của một mẫu trang.
Ví dụ này tạo một mẫu filecabinet mới rồi tạo một 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 một <category>, nhưng bạn vẫn phải thêm một <category> vào mục nhập của mình. Ngoài ra, xin lưu ý rằng nếu bạn thêm một phần tử <content>, thì máy chủ sẽ từ chối phần tử đó.
Đang tải tệp lên
Giống như trong Google Sites, API này hỗ trợ việc tải tệp đính kèm lên trang tổ chức tệp hoặc trang mẹ.
Để tải tệp đính kèm lên một phần tử 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
Bạn phải tải tất cả các loại tệp đính kèm lên một trang gốc. Do đó, bạn đặt một đường liên kết đến đối tượng mẹ trên đối tượng AttachmentEntry hoặc WebAttachmentEntry mà bạn đang cố gắng tải lên. Hãy xem phần Tạo trang con để biết thêm thông tin.
Đang tải tệp đính kèm lên
Ví dụ này tải một tệp PDF lên FileCabinetPageEntry đầu tiên có trong nguồn cấp nội dung của người dùng.
Tệ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 tài liệu 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 quá trình tải lên thành công, attachment sẽ chứa một bản sao của mục tệp đí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 những tệp khác trên web mà bạn có thể thêm vào danh sách tủ hồ sơ. Tính năng này tương tự như phương thức tải lên "Thêm tệp bằng URL" trong giao diện người dùng của Google Sites.
Lưu ý: Bạn chỉ có thể tạo tệp đính kèm trên web trong trang tổ chức tệp. Bạn không thể tải các tệp này lên các loại trang khác.
Ví dụ này tạo một WebAttachmentEntry trong FileCabinetPageEntry đầu tiên được tìm thấy trong nguồn cấp nội dung của người dùng.
Tiêu đề và nội dung mô tả (không bắt buộc) của biểu tượng này được đặt lần lượt là "GoogleLogo" và "nice colors".
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 sẽ tạo một đường liên kết trong tủ hồ sơ của người dùng, trỏ đến hình ảnh tại "http://www.google.com/images/logo.gif".
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 một 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 mọi loại BaseContentEntry 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 HTTP PUT đến đường liên kết edit của mục.
Dưới đây là ví dụ về cách cập nhật ListPageEntry với những 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>Updated HTML Content</p>"
- Tiêu đề cột đầu tiên của danh sách sẽ 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, rồi sử dụng phương thức updateMedia(boolean) của mục.
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 HTTP PUT đến đường liên kết edit-media của mục. AttachmentEntry được trả về sẽ chứa nội dung đã cập nhật.
Cập nhật siêu dữ liệu và nội dung của tệp đính kèm
Bạn có thể cập nhật siêu dữ liệu và nội dung của tệp đính kèm trong cùng một lệnh gọi bằng cách sử dụng phương thức updateMedia().
Bạn có thể chỉ cập nhật nội dung tệp, siêu dữ liệu hoặc cả hai.
Ví dụ này thay đổi tiêu đề của tệp đính kèm thành "Tiêu đề mới", cập nhật 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 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");
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 nội dung, sau đó gọi delete() của mục đó.
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 cho phương thức này đường liên kết edit và giá trị ETag của mục:
client.delete(entry.getEditLink().getHref(), "*"); // Note: using "*" may overwrite another client's changes.
Nếu mục nhập bị xoá thành công, máy chủ sẽ phản hồi bằng mã trạng thái HTTP 200 OK.
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 src nội dung của mục nhập.
Ví dụ này tải AttachmentEntry đầu tiên có trong nguồn cấp nội dung của người dùng xuống thư mục "/path/to/save/file/":
private void downloadFile(String downloadUrl, String fullFilePath) throws IOException, ServiceException { System.out.println("Downloading file from: " + downloadUrl); MediaContent mc = new MediaContent(); mc.setUri(downloadUrl); MediaSource ms = service.getMedia(mc); InputStream inStream = null; FileOutputStream outStream = null; try { inStream = ms.getInputStream(); outStream = new FileOutputStream(fullFilePath); int c; while ((c = inStream.read()) != -1) { outStream.write(c); } } finally { if (inStream != null) { inStream.close(); } if (outStream != null) { outStream.flush(); outStream.close(); } } } public void downloadAttachment(AttachmentEntry entry, String directory) throws IOException, ServiceException { String url = ((OutOfLineContent) entry.getContent()).getUri(); downloadFile(url, directory + entry.getTitle().getPlainText()); // Use entry's title for the save filename } ContentFeed contentFeed = client.getFeed( new URL(buildContentFeedUrl() + "?kind=attachment&max-results=1"), ContentFeed.class); downloadAttachment(contentFeed.getEntries(AttachmentEntry.class).get(0), "/path/to/save/file/"); System.out.println("Downloaded.");
Nguồn cấp dữ liệu ACL
Tổng quan về quyền chia sẻ (ACL)
Mỗi mục 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ể, 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). Các 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 "Người 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 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 – 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 của một nhóm trên Google Groups, ví dụ: "group@domain.com".
- domain – tên miền G Suite, ví dụ: "domain.com".
- default – Chỉ có một phạm vi có thể có 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 mà bất kỳ người dùng nào có theo mặc định trên một trang web công khai.
Lưu ý: Bạn không thể đặt giá trị gAcl:role cho miền 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 AclFeed và AclEntry để kiểm soát quyền chia sẻ của một trang web và có thể tìm nạp các lớp này 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, 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 một 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ẻ chỉ có thể thực hiện đượ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ẻ một trang web trên Google Sites bằng API, ứng dụng của bạn cần tạo một AclEntry mới và POST trang web đó cho máy chủ.
Sau đây là ví dụ về cách thêm "user@example.com" làm reader trên trang web:
AclRole role = new AclRole("reader"); AclScope scope = new AclScope(AclScope.Type.USER, "user@example.com"); AclEntry aclEntry = addAclRole(role, scope, entry); public AclEntry addAclRole(AclRole role, AclScope scope, SiteEntry siteEntry) throws IOException, MalformedURLException, ServiceException { AclEntry aclEntry = new AclEntry(); aclEntry.setRole(role); aclEntry.setScope(scope); Link aclLink = siteEntry.getLink(SitesAclFeedLink.Rel.ACCESS_CONTROL_LIST, Link.Type.ATOM); return client.insert(new URL(aclLink.getHref()), aclEntry); }
Hãy xem phần Tổng quan về nguồn cấp dữ liệu ACL để biết các giá trị AclScope và AclRoles có thể có.
Chia sẻ ở cấp nhóm và miền
Tương tự như chia sẻ trang web với một người dùng, bạn có thể chia sẻ trang web với một nhóm trên Google hoặc miền G Suite.
Chia sẻ với địa chỉ email của nhóm:
AclScope scope = new AclScope(AclScope.Type.GROUP, "group_name@example.com");
Chia sẻ với toàn bộ miền:
AclScope scope = new AclScope(AclScope.Type.DOMAIN, "example.com");
Chế độ 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 thể chia sẻ với domain2.com. Những 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, sửa đổi quyền theo ý 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ụ aclEntry trước đây 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.
Xoá quyền chia sẻ
Để xoá quyền chia sẻ, trước tiên, hãy truy xuất AclEntry, sau đó gọi phương thức delete() của quyền đó:
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.
Chủ đề đặc biệt
Lấy lại nguồn cấp dữ liệu hoặc mục
Nếu muốn truy xuất một nguồn cấp dữ liệu hoặc mục 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 nếu danh sách hoặc mục đó đã thay đổi kể từ lần gần nhất bạn truy xuất.
Để thực hiện loại truy xuất có điều kiện này, cả phương thức getFeed() và 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ụ này thực hiện một thao tác truy xuất có điều kiện cho một mục nhập trang web nội dung:
String feedUrl = "https://sites.google.com/feeds/content/site/siteName/123456789"; WebPageEntry entry = client.getEntry(new URL(feedUrl), WebPageEntry.class, "\"GVQHSARDQyp7ImBq\"");
Khi nhận được yêu cầu này, máy chủ sẽ kiểm tra xem mục mà bạn yêu cầu có cùng ETag với ETag mà bạn đã chỉ định hay không. Nếu ETag khớp, thì mục đó chưa thay đổi và máy chủ sẽ trả về một ngoại lệ HTTP 304 NotModifiedException.
Nếu ETag không khớp, thì tức là mục đã được sửa đổi kể từ lần gần đây nhất bạn yêu cầu và máy chủ sẽ trả về mục đó.
Để biết thêm thông tin về ETag, hãy xem hướng dẫn tham khảo về API Dữ liệu của Google.