Quan trọng: Tài liệu này được viết trước năm 2012. Các tuỳ chọn xác thực được mô tả trong tài liệu này (OAuth 1.0, AuthSub và ClientLogin) đã chính thức không được dùng nữa kể từ ngày 20 tháng 4 năm 2012 và không còn hoạt động nữa. Bạn nên chuyển sang OAuth 2.0 càng sớm càng tốt.
API dữ liệu của Google Sites cho phép các ứng dụng khách truy cập, xuất bản và sửa đổi nội dung trong một trang web tạo bằng Google Sites. Ứng dụng khách của bạn cũng có thể yêu cầu danh sách hoạt động gần đây, tìm nạp lịch sử sửa đổi và tải tệp đính kèm xuống.
Ngoài việc cung cấp một số thông tin cơ bản về chức năng của Sites Data API, hướng dẫn này còn đưa ra các ví dụ về cách tương tác với API bằng thư viện ứng dụng Java. Để được trợ giúp thiết lập thư viện ứng dụng, hãy xem Bắt đầu sử dụng Thư viện ứng dụng Java dữ liệu của Google. Nếu bạn muốn tìm hiểu thêm về giao thức cơ bản mà thư viện ứng dụng Java sử dụng để tương tác với API Sites cũ, vui lòng xem hướng dẫn về giao thức.
Đối tượng người xem
Tài liệu này dành cho các nhà phát triển muốn viết các ứng dụng khách tương tác với Google Sites bằng Thư viện ứng dụng Java dữ liệu của Google.
Bắt đầu
Google Sites sử dụng Tài khoản Google hoặc tài khoản G Suite để xác thực. Nếu đã có tài khoản, thì bạn đã hoàn tất. Nếu không, bạn có thể tạo một tài khoản mới.
Cài đặt thư viện
Để được trợ giúp thiết lập và cài đặt thư viện ứng dụng, hãy xem Bắt đầu với Thư viện ứng dụng Java dữ liệu của Google. Nếu bạn đang sử dụng Eclipse, bài viết đó cũng giải thích cách thiết lập dự án của bạn bằng trình bổ trợ Eclipse của Google Data API. Dưới đây là những việc bạn cần làm để bắt đầu:
- 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 ứng dụng mẫu xuống (phiên bản mới nhất của
gdata-samples.java.zip
)
Sau khi cài đặt tệp .jar, bạn cần thêm những nội dung sau vào dự án:
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ũ.java/lib/gdata-core-1.0.jar
java/lib/gdata-client-1.0.jar
java/lib/gdata-spreadsheet-3.0.jar
(nếu làm việc với các trang danh sách / mục danh sách)
Ngoài ra, hãy nhớ thêm các tệp phần phụ thuộc (gdata-media-1.0.jar
, mail.jar
và google-collect....jar
).
Chạy ứng dụng mẫu
Ứng dụng mẫu đang hoạt động đầy đủ nằm trong thư mục con /java/sample/sites
của tệp tải xuống gdata-samples.java.zip
.
Nguồn này cũng có tại /trunk/java/sample/sites/ trong kho lưu trữ SVN có thể truy cập được từ thẻ Nguồn. SitesDemo.java
cho phép người dùng thực hiện một số thao tác minh hoạ cách sử dụng API của Sites cũ.
Lưu ý là bạn sẽ phải thêm java/sample/util/lib/sample-util.jar
để chạy mẫu.
Bắt đầu dự án của riêng bạn
Mẹo: Hãy xem bài viết Sử dụng Eclipse với các API dữ liệu của Google để thiết lập nhanh bằng trình bổ trợ Eclipse.
Bạn sẽ cần nhập nhiều lần, tuỳ thuộc vào nhu cầu của ứng dụng. Bạn nên bắt đầu với các lệnh nhập sau:
import com.google.gdata.client.*; import com.google.gdata.client.sites.*; import com.google.gdata.data.*; import com.google.gdata.data.acl.*; import com.google.gdata.data.media.*; import com.google.gdata.data.sites.*; import com.google.gdata.data.spreadsheet.*; // If working with listpages / listitems import com.google.gdata.util.*;
Tiếp theo, bạn cũng cần thiết lập một đối tượng SitesService
, đại diện cho kết nối ứng dụng với API Sites cũ:
SitesService client = new SitesService("yourCo-yourAppName-v1");
Đối số applicationName
phải tuân theo định dạng: company-applicationname-version
. Thông số này được dùng cho mục đích ghi nhật ký.
Lưu ý: Phần còn lại của hướng dẫn này giả định rằng bạn đã tạo một SitesService
trong biến client
.
Xác thực với API Sites cũ
Bạn có thể sử dụng thư viện ứng dụng Java để làm việc với nguồn cấp dữ liệu công khai hoặc riêng tư. API Dữ liệu trang web cho phép bạn truy cập vào nguồn cấp dữ liệu riêng tư và công khai, tuỳ thuộc vào quyền của Sites và thao tác mà bạn đang cố gắng thực hiện. Ví dụ: bạn có thể đọc nguồn cấp dữ liệu nội dung của một trang web công khai nhưng không được cập nhật trang đó – một hoạt động yêu cầu ứng dụng phải được xác thực. Bạn có thể thực hiện việc này thông qua quy trình xác thực tên người dùng/mật khẩu ClientLogin, AuthSub hoặc OAuth.
Vui lòng xem Tổng quan về xác thực API dữ liệu của Google để biết thêm thông tin về AuthSub, OAuth và ClientLogin.
Lưu ý: API hỗ trợ SSL (HTTPS). Nếu bạn đang sử dụng AuthSub/OAuth, hãy nhớ chỉ định phạm vi của https://sites.google.com/feeds/
để yêu cầu nguồn cấp dữ liệu qua SSL. Ngoài ra, xin lưu ý rằng đối với
các miền G Suite, API sẽ tuân thủ chế độ cài đặt "Yêu cầu SSL" trong bảng điều khiển quản trị. Bạn có thể buộc tất cả các yêu cầu API chuyển qua HTTPS bằng cách gọi client.useSsl();
.
AuthSub dành cho các ứng dụng web
Xác thực AuthSub cho ứng dụng web nên được sử dụng bởi các ứng dụng khách cần xác thực người dùng của họ đối với tài khoản Google. Toán tử không cần quyền truy cập vào tên người dùng và mật khẩu cho người dùng Google Sites mà chỉ cần mã thông báo AuthSub.
Xem hướng dẫn kết hợp AuthSub vào ứng dụng web của bạn
Yêu cầu mã thông báo dùng một lần
Khi người dùng truy cập vào ứng dụng của bạn lần đầu tiên, họ cần xác thực. Thông thường, nhà phát triển in một số văn bản và đường liên kết đưa người dùng đến trang phê duyệt AuthSub để xác thực người dùng và yêu cầu quyền truy cập vào tài liệu của họ. Thư viện ứng dụng Java dữ liệu của Google cung cấp hàm tạo URL này. Mã bên dưới thiết lập một đường liên kết đến trang AuthSubRequest.
import com.google.gdata.client.*; String nextUrl = "http://www.example.com/welcome.jsp"; String scope = "https://sites.google.com/feeds/"; boolean secure = true; boolean session = true; String authSubUrl = AuthSubUtil.getRequestUrl(nextUrl, scope, secure, session);
Nếu bạn muốn xác thực người dùng trên miền do G Suite lưu trữ:
import com.google.gdata.client.*; String hostedDomain = "example.com"; String nextUrl = "http://www.example.com/welcome.jsp"; String scope = "https://sites.google.com/feeds/"; // SSL is also supported boolean secure = true; boolean session = true; String authSubUrl = AuthSubUtil.getRequestUrl(hostedDomain, nextUrl, scope, secure, session);
Phương thức getRequestUrl()
nhận một vài tham số (tương ứng với các tham số truy vấn mà trình xử lý AuthSubRequest sử dụng):
- URL tiếp theo – URL mà Google sẽ chuyển hướng đến
sau khi người dùng đăng nhập vào tài khoản của họ và cấp quyền truy cập;
http://www.example.com/welcome.jsp
trong ví dụ trên - phạm vi –
https://sites.google.com/feeds/
trong ví dụ ở trên - một boolean cho biết liệu mã thông báo có được dùng ở chế độ đã đăng ký hay không;
false
trong ví dụ trên - một giá trị boolean thứ hai để cho biết liệu sau đó mã thông báo này có được trao đổi lấy mã thông báo phiên hay không;
true
trong ví dụ trên
Nâng cấp lên mã thông báo phiên
Xem Sử dụng AuthSub với thư viện ứng dụng Google Data API.
Truy xuất thông tin về mã phiên
Xem Sử dụng AuthSub với thư viện ứng dụng Google Data API.
Thu hồi mã phiên
OAuth cho web hoặc ứng dụng đã cài đặt/thiết bị di động
Có thể sử dụng OAuth làm giải pháp thay thế cho AuthSub và dành cho các ứng dụng web. OAuth tương tự như việc sử dụng chế độ bảo mật và đăng ký của AuthSub, trong đó tất cả các yêu cầu dữ liệu phải có chữ ký số và bạn phải đăng ký miền của mình.
Xem hướng dẫn kết hợp OAuth vào ứng dụng đã cài đặt
Đang tìm nạp mã thông báo yêu cầu
Xem bài viết Sử dụng OAuth với thư viện ứng dụng Google Data API.
Uỷ quyền mã thông báo yêu cầu
Xem bài viết Sử dụng OAuth với thư viện ứng dụng Google Data API.
Nâng cấp lên mã truy cập
Xem bài viết Sử dụng OAuth với thư viện ứng dụng Google Data API.
ClientLogin cho ứng dụng đã cài đặt/dành cho thiết bị di động
Bạn nên sử dụng ClientLogin cho các ứng dụng đã cài đặt hoặc dành cho thiết bị di động cần xác thực người dùng trong Tài khoản Google. Trong lần chạy đầu tiên, ứng dụng sẽ nhắc người dùng nhập tên người dùng/mật khẩu của họ. Trong các yêu cầu tiếp theo, mã thông báo xác thực sẽ được tham chiếu.
Xem hướng dẫn kết hợp ClientLogin vào ứng dụng đã cài đặt
Để sử dụng ClientLogin, hãy gọi phương thức setUserCredentials()
của đối tượng SitesService
. Đối tượng này được kế thừa từ GoogleService
. Chỉ định địa chỉ email và mật khẩu của người dùng mà khách hàng của bạn thay mặt gửi yêu cầu. Ví dụ:
SitesService client = new SitesService("yourCo-yourAppName-v1"); client.setUserCredentials("example@gmail.com", "pa$$word");
Mẹo: Sau khi ứng dụng xác thực thành công người dùng lần đầu tiên, hãy lưu trữ mã xác thực trong cơ sở dữ liệu để gọi lại để dùng sau. Không cần nhắc người dùng về mật khẩu của họ trong mỗi lần bạn chạy ứng dụng. Hãy xem phần Gọi lại mã thông báo xác thực để biết thêm thông tin.
Để biết thêm thông tin về cách sử dụng ClientLogin trong các ứng dụng Java, hãy xem phần Sử dụng ClientLogin với thư viện ứng dụng API dữ liệu của Google.
Nguồn cấp dữ liệu trang web
Nguồn cấp dữ liệu trang web có thể dùng để liệt kê các trang web tạo bằng Google Sites mà người dùng sở hữu hoặc có quyền xem. Bạn cũng có thể dùng URL này để sửa đổi tên của một trang web hiện có. Đối với các miền G Suite, bạn cũng có thể dùng dịch vụ này để tạo và/hoặc sao chép toàn bộ trang web.
Trang web danh sách
Để truy vấn nguồn cấp dữ liệu trang web, hãy gửi một HTTP GET
đến URL nguồn cấp dữ liệu trang web:
https://sites.google.com/feeds/site/site/
Trong ứng dụng Java, hãy sử dụng các lớp 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à chủ đề của trang web. Bạn có thể dùng các phương thức getter khác để truy cập vào các thuộc tính khác trong nguồn cấp dữ liệu.
Tạo trang web mới
Lưu ý: Tính năng này chỉ dành cho các miền G Suite.
Bạn có thể cấp phép cho các trang web mới bằng cách tạo một SiteEntry
mới và gọi phương thức insert()
của ứng dụng trên nguồn cấp dữ liệu trang web.
Ví dụ này tạo một trang web hoàn toàn mới với chủ đề "phương tiện chặn" (cài đặt không bắt buộc) và cung cấp tên trang web (bắt buộc) cũng như nội dung mô tả (không bắt buộc):
public String getSiteFeedUrl() { String domain = "example.com"; return "https://sites.google.com/feeds/site/" + domain + "/"; } public SiteEntry createSite(String title, String summary, String theme, String tag) throws MalformedURLException, IOException, ServiceException { SiteEntry entry = new SiteEntry(); entry.setTitle(new PlainTextConstruct(title)); entry.setSummary(new PlainTextConstruct(summary)); Theme tt = new Theme(); tt.setValue(theme); entry.setTheme(tt); entry.getCategories().add(new Category(TagCategory.Scheme.TAG, tag, null)); return client.insert(new URL(getSiteFeedUrl()), entry); } SiteEntry newSiteEntry = createSite("My Site Title", "summary for site", "slate", "tag");
Yêu cầu trên sẽ tạo một trang web mới trong miền G Suite example.com
.
Do đó, URL của trang web này sẽ là https://sites.google.com/a/example.com/my-site-title.
Nếu trang web được tạo thành công, máy chủ sẽ phản hồi bằng một đối tượng SiteEntry
, chứa các phần tử do máy chủ thêm vào: đường liên kết đến trang web, đường liên kết đến nguồn cấp dữ liệu acl của trang web, tên trang web, tiêu đề, thông tin tóm tắt, v.v.
Sao chép trang web
Lưu ý: Tính năng này chỉ dành cho các miền G Suite.
Sao chép một trang web cũng tương tự như việc tạo một trang web mới. Điểm khác biệt là bạn cần đặt một đường liên kết trên SiteEntry
mới bao gồm đường liên kết tự liên kết của trang web cần sao chép.
Sau đây là ví dụ về việc sao chép trang web được tạo trong phần Tạo trang web mới:
public SiteEntry copySite(String title, String summary, String sourceHref) throws MalformedURLException, IOException, ServiceException { SiteEntry entry = new SiteEntry(); entry.setTitle(new PlainTextConstruct(title)); entry.setSummary(new PlainTextConstruct(summary)); entry.addLink(SitesLink.Rel.SOURCE, Link.Type.ATOM, sourceHref); return client.insert(new URL(getSiteFeedUrl()), entry); } String sourceHref = newSiteEntry.getLink(SitesLink.Rel.SOURCE, Link.Type.ATOM).getHref(); SiteEntry myTwin = copySite("Duplicate Site", "A copy", sourceHref);
Lưu ý quan trọng:
- Chỉ những trang web và mẫu trang web mà người dùng đã xác thực mới có thể sao chép.
- Bạn cũng có thể sao chép mẫu trang web. Trang web được xem là một mẫu nếu chế độ cài đặt "Xuất bản trang web này dưới dạng mẫu" được chọn trong trang cài đặt Google Sites.
- Bạn có thể sao chép trang web từ một miền khác, trong khi chờ bạn được liệt kê là chủ sở hữu trên trang web nguồn.
Cập nhật siêu dữ liệu của trang web
Để đổi tên một trang web, thay đổi giao diện, thẻ danh mục hoặc bản tóm tắt của trang web đó, trước tiên, bạn cần tìm nạp SiteEntry
chứa trang web đó, sửa đổi một hoặc nhiều thuộc tính rồi gọi phương thức update()
của SiteEntry
.
Ví dụ này sửa đổi giao diện của trang web trước và đổi tên trang web:
myTwin.setTitle(new PlainTextConstruct("better-title")); Theme theme = myTwin.getTheme(); theme.setValue('iceberg'); myTwin.setTheme(theme); myTwin.getCategories().add(new Category(TagCategory.Scheme.TAG, "newTag", null)); SiteEntry updatedSiteEntry = myTwin.update(); System.out.println(updatedSiteEntry.getTitle().getPlainText();
Liên kết địa chỉ web
Tính năng ánh xạ địa chỉ web cho phép người dùng Sites ánh xạ miền của riêng họ đến một trang web tạo bằng Google Sites. Ví dụ: bạn có thể sử dụng http://www.mydomainsite.com
thay cho http://sites.google.com/a/domain.com/mysite
. Tuỳ thuộc vào nơi lưu trữ trang web, bạn có thể sửa đổi mối liên kết địa chỉ web của trang web theo cách thủ công. Hãy xem bài viết trong trung tâm trợ giúp của chúng tôi để biết thêm thông tin.
Tìm nạp ánh xạ địa chỉ web của một trang web
Để trả về mục ánh xạ địa chỉ web cho một trang web, hãy tìm nạp mục nhập/nguồn cấp dữ liệu trang web bằng tham số with-mappings=true
:
SiteQuery query = new SiteQuery(new URL("https://sites.google.com/feeds/site/siteName")); query.setWithMappings(true); SiteFeed feed = service.getFeed(query, SiteFeed.class); for (SiteEntry entry : feed.getEntries()) { System.out.println("Mappings for '" + entry.getSiteName().getValue() + "':"); for (Link link : entry.getWebAddressMappingLinks()) { System.out.println(" " + link.getHref()); } }
Các mối liên kết hiện có sẽ hiển thị dưới dạng link
với rel='webAddressMapping'. Ví dụ: trong ví dụ trên, có ba webAddressMapping
trỏ đến trang web http://sites.google.com/site/myOtherTestSite
.
Sửa đổi ánh xạ địa chỉ web
Lưu ý: Tất cả các thao tác GET/POST/PUT đều phải chỉ định tham số with-mappings=true
khi làm việc với liên kết địa chỉ web. Nếu không có tham số này, webAddressMapping
sẽ không được trả về trong các mục nhập trang web (GET) hoặc được xem xét khi cập nhật/xoá các liên kết (PUT) khỏi một mục nhập.
Để thêm, cập nhật hoặc xoá mối liên kết, bạn chỉ cần chỉ định, thay đổi hoặc xoá đường liên kết đó khi tạo trang web mới hoặc cập nhật siêu dữ liệu của trang web. Tham số with-mappings=true
phải được đưa vào URI nguồn cấp dữ liệu trang web.
Lưu ý: để cập nhật mối liên kết địa chỉ, bạn cần phải là quản trị viên trang web hoặc quản trị viên miền trong trường hợp trang web được lưu trữ trên G Suite.
Ví dụ: yêu cầu bên dưới sẽ cập nhật ánh xạ http://www.mysitemapping.com
thành http://www.my-new-sitemapping.com
và xoá http://www.mysitemapping2.com
bằng cách rời khỏi mục liên kết:
SiteEntry entry = client.getEntry(new URL("https://sites.google.com/feeds/site/site/siteName?with-mappings=true"), SiteEntry.class); // Modify mappings (remove all mappings, add some of them again, add modified mappings) entry.removeLinks(SitesLink.Rel.WEBADDRESSMAPPING, Link.Type.HTML); entry.addLink(SitesLink.Rel.WEBADDRESSMAPPING, Link.Type.HTML, "http://www.my-new-sitemapping.com"); // Update the entry with the mappings. entry.update();
Lưu ý: Bạn cũng có thể chỉ định mục ánh xạ địa chỉ web tại thời điểm tạo/sao chép một trang web.
Danh sách hoạt động
Bạn có thể tìm nạp hoạt động gần đây (các thay đổi) của một Trang web bằng cách tìm nạp nguồn cấp dữ liệu hoạt động. Mỗi mục trong nguồn cấp dữ liệu hoạt động chứa thông tin về một thay đổi đối với Trang web.
Để truy vấn nguồn cấp dữ liệu hoạt động, hãy gửi một GET
HTTP đến URL của nguồn cấp dữ liệu hoạt động:
https://sites.google.com/feeds/activity/site/siteName
Trong ứng dụng Java, hãy dùng lớp ActivityFeed
để trả về các đối tượng ActivityEntry
:
public String buildActivityFeedUrl() { String domain = "site"; // OR if the Site is hosted on G Suite, your domain (e.g. example.com) String siteName = "mySite"; return "https://sites.google.com/feeds/activity/" + domain + "/" + siteName + "/"; } public void getActivityFeed() throws IOException, ServiceException { ActivityFeed activityFeed = client.getFeed(new URL(buildActivityFeedUrl()), ActivityFeed.class); for (BaseActivityEntry<?> entry : activityFeed.getEntries()){ System.out.println(entry.getSummary().getPlainText()); System.out.println(" revisions link: " + entry.getRevisionLink().getHref()); } }
Lưu ý: Để truy cập vào nguồn cấp dữ liệu này, bạn phải là cộng tác viên hoặc chủ sở hữu của Trang web. Khách hàng của bạn phải xác thực bằng mã thông báo AuthSub, OAuth hoặc ClientLogin. Hãy xem phần Xác thực với dịch vụ Sites.
Nguồn cấp dữ liệu bản sửa đổi
Để tìm nạp nhật ký sửa đổi cho bất kỳ mục nhập nội dung nào, hãy gửi một HTTP GET
đến đường liên kết sửa đổi của mục nhập:
https://sites.google.com/feeds/revision/site/siteName/CONTENT_ENTRY_ID
Ví dụ này truy vấn nguồn cấp nội dung, sau đó tìm nạp nguồn cấp dữ liệu sửa đổi cho mục nội dung đầu tiên:
ContentFeed contentFeed = client.getFeed(new URL(buildContentFeedUrl()), ContentFeed.class); URL revisionFeedUrl = new URL(contentFeed.getEntries().get(0).getRevisionLink().getHref()); // use first entry public void getRevisionFeed(String revisionFeedUrl) throws IOException, ServiceException { RevisionFeed revisionFeed = client.getFeed(revisionFeedUrl, RevisionFeed.class); for (BaseContentEntry<?> entry : revisionFeed.getEntries()){ System.out.println(entry.getTitle().getPlainText()); System.out.println(" updated: " + entry.getUpdated().toUiString() + " by " + entry.getAuthors().get(0).getEmail()); System.out.println(" revision #: " + entry.getRevision().getValue()); } }
Lưu ý: Để truy cập vào nguồn cấp dữ liệu này, bạn phải là cộng tác viên hoặc chủ sở hữu của Trang web. Khách hàng của bạn phải xác thực bằng mã thông báo AuthSub, OAuth hoặc ClientLogin. Hãy xem phần Xác thực với dịch vụ Sites.
Nguồn cấp nội dung
Truy xuất nguồn cấp nội dung
Nguồn cấp nội dung liệt kê nội dung mới nhất của một Trang web. Bạn có thể truy cập công cụ này bằng cách gửi HTTP GET
đến URL nguồn cấp nội dung:
https://sites.google.com/feeds/content/site/siteName
Thông số nguồn cấp dữ liệu | Nội dung mô tả |
---|---|
site | "site " hoặc miền của miền do G Suite lưu trữ (ví dụ: example.com ). |
siteName | Tên trang web của bạn; được tìm thấy trong URL của trang web (ví dụ: mySite ). |
Ví dụ về cách tìm nạp nguồn cấp nội dung:
public String buildContentFeedUrl() { String domain = "site"; // OR if the Site is hosted on G Suite, your domain (e.g. example.com) String siteName = "mySite"; return "https://sites.google.com/feeds/content/" + domain + "/" + siteName + "/"; } ContentFeed contentFeed = client.getFeed(new URL(buildContentFeedUrl()), ContentFeed.class);
Kết quả contentFeed
là một đối tượng ContentFeed
chứa phản hồi từ máy chủ. Mỗi mục nhập của contentFeed
đại diện cho một trang hoặc mục khác nhau trong Trang web của người dùng. ContentFeed
sẽ chứa nhiều loại đối tượng, tất cả đều kế thừa từ BaseContentEntry
: ListItemEntry
, ListPageEntry
, AttachmentEntry
, WebAttachmentEntry
, FileCabinetPageEntry
, AnnouncementsPageEntry
, AnnouncementEntry
, WebPageEntry
, CommentEntry
.
Dưới đây là ví dụ về cách liệt kê các loại mục trong ContentFeed
.
Mỗi loại mục nhập chứa các thuộc tính khác nhau, nhưng không phải tất cả mục đều được in ở đây.
public String getContentBlob(BaseContentEntry<?> entry) { return ((XhtmlTextConstruct) entry.getTextContent().getContent()).getXhtml().getBlob(); } // Extracts an entry's numeric ID. private String getEntryId(String selfLink) { return selfLink.substring(selfLink.lastIndexOf("/") + 1); } public void printContentEntries(ContentFeed contentFeed) { System.out.println("Listing all WebPageEntry:"); for (WebPageEntry entry : contentFeed.getEntries(WebPageEntry.class)) { System.out.println(" title: " + entry.getTitle().getPlainText()); System.out.println(" id: " + getEntryId(entry)); if (entry.getParentLink() != null) { System.out.println(" parent id: " + getEntryId(entry.getParentLink().getHref())); } System.out.println(" author: " + entry.getAuthors().get(0).getEmail()); System.out.println(" content: " + getContentBlob(entry)); } System.out.println("Listing all ListPageEntry:"); for (ListPageEntry entry : contentFeed.getEntries(ListPageEntry.class)) { System.out.println(" title: " + entry.getTitle().getPlainText()); System.out.println(" id: " + getEntryId(entry)); for (Column col : entry.getData().getColumns()) { System.out.print(" [" + col.getIndex() + "] " + col.getName() + "\t"); } } for (ListItemEntry entry : contentFeed.getEntries(ListItemEntry.class)) { for (Field field : entry.getFields()) { System.out.print(" [" + field.getIndex() + "] " + field.getValue() + "\t"); } System.out.println("\n"); } System.out.println("Listing all FileCabinetPageEntry:"); for (FileCabinetPageEntry entry : contentFeed.getEntries(FileCabinetPageEntry.class)) { System.out.println(" title: " + entry.getTitle().getPlainText()); System.out.println(" id: " + getEntryId(entry)); System.out.println(" content: " + getContentBlob(entry)); } System.out.println("Listing all CommentEntry:"); for (CommentEntry entry : contentFeed.getEntries(CommentEntry.class)) { System.out.println(" in-reply-to: " + entry.getInReplyTo().toString()); System.out.println(" content: " + getContentBlob(entry)); } System.out.println("Listing all AnnouncementsPageEntry:"); for (AnnouncementsPageEntry entry : contentFeed.getEntries(AnnouncementsPageEntry.class)) { System.out.println(" title: " + entry.getTitle().getPlainText()); System.out.println(" id: " + getEntryId(entry)); System.out.println(" content: " + getContentBlob(entry)); } System.out.println("Listing all AnnouncementEntry:"); for (AnnouncementEntry entry : contentFeed.getEntries(AnnouncementEntry.class)) { System.out.println(" title: " + entry.getTitle().getPlainText()); System.out.println(" id: " + getEntryId(entry)); if (entry.getParentLink() != null) { System.out.println(" parent id: " + getEntryId(entry.getParentLink().getHref())); } System.out.println(" draft?: " + entry.isDraft()); System.out.println(" content: " + getContentBlob(entry)); } System.out.println("Listing all AttachmentEntry:"); for (AttachmentEntry entry : contentFeed.getEntries(AttachmentEntry.class)) { System.out.println(" title: " + entry.getTitle().getPlainText()); System.out.println(" id: " + getEntryId(entry)); if (entry.getParentLink() != null) { System.out.println(" parent id: " + getEntryId(entry.getParentLink().getHref())); } if (entry.getSummary() != null) { System.out.println(" description: " + entry.getSummary().getPlainText()); } System.out.println(" revision: " + entry.getRevision().getValue()); MediaContent content = (MediaContent) entry.getContent(); System.out.println(" src: " + content.getUri()); System.out.println(" content type: " + content.getMimeType().getMediaType()); } System.out.println("Listing all WebAttachmentEntry:"); for (WebAttachmentEntry entry : contentFeed.getEntries(WebAttachmentEntry.class)) { System.out.println(" title: " + entry.getTitle().getPlainText()); System.out.println(" id: " + getEntryId(entry)); if (entry.getParentLink() != null) { System.out.println(" parent id: " + getEntryId(entry.getParentLink().getHref())); } if (entry.getSummary() != null) { System.out.println(" description: " + entry.getSummary().getPlainText()); } System.out.println(" src: " + ((MediaContent) entry.getContent()).getUri()); } }
Lưu ý: Nguồn cấp dữ liệu này có thể yêu cầu hoặc không yêu cầu xác thực, tuỳ thuộc vào quyền chia sẻ của Trang web. Nếu Trang web không công khai, ứng dụng khách của bạn phải xác thực bằng cách sử dụng mã thông báo AuthSub, OAuth hoặc ClientLogin. Hãy xem phần Xác thực dịch vụ Sites.
Ví dụ về truy vấn nguồn cấp nội dung
Bạn có thể tìm kiếm nguồn cấp nội dung bằng cách sử dụng một số tham số truy vấn API Dữ liệu của Google chuẩn và các tham số truy vấn dành riêng cho API Sites cũ. Để biết thêm thông tin chi tiết và danh sách đầy đủ các tham số được hỗ trợ, hãy xem Hướng dẫn tham khảo.
Lưu ý: Các ví dụ trong phần này sử dụng phương thức buildContentFeedUrl()
trong bài viết Truy xuất nguồn cấp nội dung.
Truy xuất các loại mục nhập cụ thể
Để chỉ tìm nạp một loại mục cụ thể, hãy sử dụng tham số kind
. Ví dụ này chỉ trả về các mục nhập attachment
:
ContentQuery query = new ContentQuery(new URL(buildContentFeedUrl())); query.setKind("webpage"); ContentFeed contentFeed = client.getFeed(query, ContentFeed.class); for (AttachmentEntry entry : contentFeed.getEntries(AttachmentEntry.class)) { System.out.println(entry.getTitle().getPlainText()); }
Để trả về nhiều loại mục nhập, hãy phân tách từng kind
bằng dấu ",". Ví dụ này trả về các mục nhập 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 trang theo đường dẫn
Nếu biết đường dẫn tương đối của một trang trong trang web tạo bằng Google Sites, bạn có thể sử dụng tham số path
để tìm nạp trang cụ thể đó.
Ví dụ này sẽ trả về trang tại http://sites.google.com/site/siteName/path/to/the/page
:
ContentQuery query = new ContentQuery(new URL(buildContentFeedUrl())); query.setPath("/path/to/the/page"); ContentFeed contentFeed = client.getFeed(query, ContentFeed.class); for (BaseContentEntry<?> entry : contentFeed.getEntries()) { System.out.println(" title: " + entry.getTitle().getPlainText()); }
Truy xuất tất cả các mục trong trang gốc
Nếu biết mã mục nhập nội dung của một trang (ví dụ: "1234567890" trong ví dụ bên dưới), bạn có thể sử dụng tham số parent
để tìm nạp tất cả các mục con của trang đó (nếu có):
ContentQuery query = new ContentQuery(new URL(buildContentFeedUrl())); query.setParent("1234567890"); ContentFeed contentFeed = client.getFeed(query, ContentFeed.class);
Để biết thêm các thông số khác, hãy xem Hướng dẫn tham khảo.
Sáng tạo nội dung
Lưu ý: Trước khi tạo nội dung cho một trang web, hãy đảm bảo rằng bạn đã thiết lập trang web đó trong ứng dụng khách.client.site = "siteName";
Bạn có thể tạo nội dung mới (trang web, trang danh sách, trang trang tổ chức tệp, trang thông báo, v.v.) bằng cách gửi HTTP POST
đến nguồn cấp nội dung:
https://sites.google.com/feeds/content/site/siteName
Để biết danh sách các loại nút hỗ trợ, hãy xem tham số kind
trong Hướng dẫn tham khảo.
Tạo mục / trang mới
Ví dụ sau đây sẽ tạo một webpage
mới trong cấp cao nhất của Trang web, bao gồm một số ngôn ngữ viết tắt cho phần nội dung của trang và đặt tiêu đề thành "Tiêu đề trang web mới":
private void setContentBlob(BaseContentEntry<?> entry, String pageContent) { XmlBlob xml = new XmlBlob(); xml.setBlob(pageContent); entry.setContent(new XhtmlTextConstruct(xml)); } public WebPageEntry createWebPage(String title, String content) throws MalformedURLException, IOException, ServiceException { WebPageEntry entry = new WebPageEntry(); entry.setTitle(new PlainTextConstruct(title)); setContentBlob(entry, content); // Entry's HTML content return client.insert(new URL(buildContentFeedUrl()), entry); } WebPageEntry createdEntry = createWebPage("New Webpage Title", "<b>HTML content</b>"); System.out.println("Created! View at " + createdEntry.getHtmlLink().getHref());
Nếu yêu cầu thành công, createdEntry
sẽ chứa bản sao của mục nhập đã tạo trên máy chủ.
Tạo mục/trang trong đường dẫn URL tuỳ chỉnh
Theo mặc định, ví dụ trước sẽ được tạo trong URL http://sites.google.com/site/siteName/new-webpage-title
và có tiêu đề trang là "Tiêu đề trang web mới". Tức là <atom:title>
được chuẩn hoá thành new-webpage-title
cho URL.
Để tuỳ chỉnh đường dẫn URL của một trang, bạn có thể thiết lập phần tử <sites:pageName>
.
Ví dụ này tạo một trang filecabinet
mới có tiêu đề "Bộ nhớ tệp", nhưng sẽ tạo trang trong URL http://sites.google.com/site/siteName/files
(thay vì http://sites.google.com/site/siteName/file-storage
) bằng cách chỉ định phần tử <sites:pageName>
.
public FileCabinetPageEntry createFileCabinetPage(String title, String content, String customPageName) throws MalformedURLException, IOException, ServiceException { FileCabinetPageEntry entry = new FileCabinetPageEntry(); entry.setTitle(new PlainTextConstruct(title)); setContentBlob(entry, content); // Entry's HTML content entry.setPageName(new PageName(customPageName)); // Upload to a custom page path return client.insert(new URL(buildContentFeedUrl()), entry); } FileCabinetPageEntry createdEntry = createFileCabinetPage("File Storage", "<b>HTML content</b>", "files"); System.out.println("Created! View at " + createdEntry.getHtmlLink().getHref());
Máy chủ sử dụng các quy tắc ưu tiên sau đây để đặt tên đường dẫn URL của một trang:
<sites:pageName>
, nếu có. Phải đáp ứnga-z, A-Z, 0-9, -, _
.<atom:title>
, không được để trống nếu không có pageName. Theo cách chuẩn hoá, bạn sẽ cắt bỏ + thu gọn khoảng trắng thành "*" và xoá các ký tự không khớp vớia-z, A-Z, 0-9, -, _
.
Tạo trang con
Để tạo trang con (con) trong trang mẹ, bạn phải đặt đường liên kết đến trang cha trong mục nhập. Thuộc tính href
của đường liên kết đến đường liên kết tự liên kết của nút mẹ.
public AnnouncementEntry postAnnouncement(String title, String content, AnnouncementsPageEntry parentPage) throws MalformedURLException, IOException, ServiceException { AnnouncementEntry entry = new AnnouncementEntry(); entry.setTitle(new PlainTextConstruct(title)); setContentBlob(entry, content); // Entry's HTML content // Set the entry's parent link to create the announcement under that page. entry.addLink(SitesLink.Rel.PARENT, Link.Type.ATOM, parentPage.getSelfLink().getHref()); return client.insert(new URL(buildContentFeedUrl()), entry); } ContentFeed contentFeed = client.getFeed(new URL(buildContentFeedUrl() + "?kind=announcementspage"), ContentFeed.class); AnnouncementEntry createdEntry = postAnnouncement("Party!!", "My place, this weekend", contentFeed.getEntries().get(0)); System.out.println("New post by " + createdEntry.getAuthors().get(0).getName());
Ví dụ trên sẽ tạo một announcement
mới trong trang thông báo đầu tiên có trong nguồn cấp nội dung của người dùng. Tiêu đề thông báo được đặt thành "Party!!" và nội dung là "Địa điểm của tôi, cuối tuần này".
Mẫu trang
Tạo mẫu trang
Quy trình tạo mẫu trang giống như quy trình tạo mục/trang mới và tạo trang con.Điểm khác biệt là việc thêm category
có thuật ngữ và nhãn được đặt tương ứng là "http://schemas.google.com/g/2005#template" và "template".
Ví dụ này sẽ tạo một mẫu webpage
mới.
// The template webpage entry. WebPageEntry entry = new WebPageEntry(); // Set title and content. entry.setTitle(new PlainTextConstruct("Page template title")); XmlBlob xml = new XmlBlob(); xml.setBlob("Content for page template"); entry.setContent(new XhtmlTextConstruct(xml)); // Set the template category Category TEMPLATE_CATEGORY = new Category(TemplateCategory.Scheme.LABELS, TemplateCategory.Term.TEMPLATE, TemplateCategory.Label.TEMPLATE); entry.getCategories().add(TEMPLATE_CATEGORY); // Insert the template webpage entry. WebPageEntry createdEntry = client.insert(new URL("https://sites.google.com/feeds/content/site/siteName"), entry);
Tạo trang từ mẫu
Tương tự như việc tạo mẫu trang, bạn có thể tạo bản sao trang mới từ một mẫu bằng cách bao gồm <link>
với rel='http://schemas.google.com/sites/2008#template' trỏ đến tự liên kết của mẫu trang.
Ví dụ này tạo một mẫu filecabinet
mới, sau đó tạo bản sao trang filecabinet
mới từ mẫu đó.
URL feedUrl = new URL("https://sites.google.com/feeds/content/site/siteName"); // 1. Create file cabinet page template FileCabinetPageEntry inputTemplateEntry = new FileCabinetPageEntry(); inputTemplateEntry.setTitle(new PlainTextConstruct("File cabinet page template title")); XmlBlob xml = new XmlBlob(); xml.setBlob("Content for page template"); inputTemplateEntry.setContent(new XhtmlTextConstruct(xml)); // Set the template category Category TEMPLATE_CATEGORY = new Category(TemplateCategory.Scheme.LABELS, TemplateCategory.Term.TEMPLATE, TemplateCategory.Label.TEMPLATE); inputTemplateEntry.getCategories().add(TEMPLATE_CATEGORY); // 2. Create file cabinet page template instance FileCabinetPageEntry templateEntry = client.insert(feedUrl, inputTemplateEntry); // Specify link to the page template FileCabinetPageEntry templateInstanceEntry = new FileCabinetPageEntry(); templateInstanceEntry.setTitle(new PlainTextConstruct("File cabinet template instance")); templateInstanceEntry.addLink(new Link(SitesLink.Rel.TEMPLATE, Link.Type.ATOM, templateEntry.getSelfLink().getHref())); FileCabinetPageEntry createdFileCabinetFromTemplate = client.insert(feedUrl, templateInstanceEntry);
Lưu ý: Mặc dù một mẫu xác định <category>
nhưng bạn vẫn bắt buộc phải có một mẫu trong mục nhập của mình. Ngoài ra, xin lưu ý rằng nếu bạn thêm phần tử <content>
, máy chủ sẽ từ chối phần tử đó.
Đang tải tệp lên
Cũng giống như trong Google Sites, API hỗ trợ tải tệp đính kèm lên trang tổ chức tệp hoặc trang mẹ.
Để tải tệp đính kèm lên tài khoản mẹ, hãy gửi yêu cầu HTTP POST
đến URL nguồn cấp nội dung:
https://sites.google.com/feeds/content/site/siteName
Tất cả các loại tệp đính kèm phải được tải lên trang gốc. Do đó, bạn đã đặt đường liên kết mẹ trên đối tượng AttachmentEntry
hoặc WebAttachmentEntry
mà bạn đang cố gắng tải lên. Hãy xem phần Tạo trang con để biết thêm thông tin.
Đang tải tệp đính kèm lên
Ví dụ này sẽ tải một tệp PDF lên FileCabinetPageEntry
đầu tiên có trong nguồn cấp nội dung của người dùng.
Tài liệu đính kèm này được tạo với tiêu đề "Bắt đầu" và phần mô tả (không bắt buộc), "Gói nhân sự".
MimetypesFileTypeMap mediaTypes = new MimetypesFileTypeMap(); mediaTypes.addMimeTypes("application/msword doc"); mediaTypes.addMimeTypes("application/vnd.ms-excel xls"); mediaTypes.addMimeTypes("application/pdf pdf"); mediaTypes.addMimeTypes("text/richtext rtx"); // ... See a more complete list of mime types in the SitesHelper.java public AttachmentEntry uploadAttachment(File file, BasePageEntry<?> parentPage, String title, String description) throws IOException, ServiceException { AttachmentEntry newAttachment = new AttachmentEntry(); newAttachment.setMediaSource(new MediaFileSource(file, mediaTypes.getContentType(file))); newAttachment.setTitle(new PlainTextConstruct(title)); newAttachment.setSummary(new PlainTextConstruct(description)); newAttachment.addLink(SitesLink.Rel.PARENT, Link.Type.ATOM, parentPage.getSelfLink().getHref()); return client.insert(new URL(buildContentFeedUrl()), newAttachment); } ContentFeed contentFeed = client.getFeed(new URL(buildContentFeedUrl() + "?kind=filecabinet"), ContentFeed.class); FileCabinetPageEntry parentPage = contentFeed.getEntries(FileCabinetPageEntry.class).get(0); AttachmentEntry attachment = uploadAttachment( new File("/path/to/your/file.pdf"), parentPage, "Getting Started", "HR packet"); System.out.println("Uploaded!");
Nếu tải lên thành công, attachment
sẽ chứa một bản sao của mục đính kèm đã tạo.
Tải tệp đính kèm lên thư mục
Để tải tệp đính kèm lên một thư mục hiện có trong FileCabinetPageEntry
, hãy thêm một danh mục có thuộc tính "term" được đặt thành tên của thư mục.
Ví dụ: thêm dòng này vào uploadAttachment()
:
newAttachment.getCategories().add(new Category("http://schemas.google.com/sites/2008#folder", "FolderName"));
Tệp đính kèm trên web
Tệp đính kèm trên web là loại tệp đính kèm đặc biệt. Về cơ bản, chúng là các đường liên kết đến các tệp khác trên web mà bạn có thể thêm vào danh sách trang tổ chức tệp của mình. Tính năng này tương tự như phương pháp tải lên "Thêm tệp bằng URL" trong giao diện người dùng Google Sites.
Lưu ý: Bạn chỉ có thể tạo tệp đính kèm trên web trong trang tổ chức tệp. Bạn không thể tải các tệp này lên các loại trang khác.
Ví dụ này tạo một WebAttachmentEntry
trong FileCabinetPageEntry
đầu tiên có trong nguồn cấp nội dung của người dùng.
Tiêu đề và nội dung mô tả (không bắt buộc) của biểu trưng được đặt lần lượt thành "GoogleBiểu trưng" và "màu sắc đẹp".
public WebAttachmentEntry uploadWebAttachment(String contentUrl, FileCabinetPageEntry filecabinet, String title, String description) throws MalformedURLException, IOException, ServiceException { MediaContent content = new MediaContent(); content.setUri(contentUrl); WebAttachmentEntry webAttachment = new WebAttachmentEntry(); webAttachment.setTitle(new PlainTextConstruct(title)); webAttachment.setSummary(new PlainTextConstruct(description)); webAttachment.setContent(content); webAttachment.addLink(SitesLink.Rel.PARENT, Link.Type.ATOM, filecabinet.getSelfLink().getHref()); return client.insert(new URL(buildContentFeedUrl()), webAttachment); } ContentFeed contentFeed = client.getFeed(new URL(buildContentFeedUrl() + "?kind=filecabinet"), ContentFeed.class); FileCabinetPageEntry parentPage = contentFeed.getEntries(FileCabinetPageEntry.class).get(0); WebAttachmentEntry webAttachment = uploadWebAttachment("http://www.google.com/images/logo.gif", parentPage, "Google's Logo", "nice colors"); System.out.println("Web attachment created!");
POST
tạo một đường liên kết trong trang tổ chức tệp của người dùng trỏ đến hình ảnh tại "http://www.google.com/images/logo.gif".
Cập nhật nội dung
Cập nhật siêu dữ liệu và/hoặc nội dung html của trang
Bạn có thể chỉnh sửa siêu dữ liệu (tiêu đề, tên trang, v.v.) và nội dung trang thuộc bất kỳ loại BaseContentEntry
nào bằng phương thức update()
của mục nhập. Thao tác này sẽ gửi một yêu cầu HTTP PUT
đến đường liên kết edit
của mục nhập.
Dưới đây là ví dụ về cách cập nhật ListPageEntry
với các thay đổi sau:
- Tiêu đề đã được sửa đổi thành "Tiêu đề đã cập nhật"
- Nội dung HTML của trang được cập nhật thành '<p>Nội dung HTML đã cập nhật</p>'
- Tiêu đề cột đầu tiên của danh sách đã thay đổi thành "Chủ sở hữu"
ContentFeed contentFeed = client.getFeed( new URL(buildContentFeedUrl() + "?kind=listpage"), ContentFeed.class); ListPageEntry listPage = contentFeed.getEntries(ListPageEntry.class).get(0); // Update first list page found // Update title listPage.setTitle(new PlainTextConstruct("Updated Title")); // Update HTML content XmlBlob xml = new XmlBlob(); xml.setBlob("<p>Updated HTML Content</p>"); listPage.setContent(new XhtmlTextConstruct(xml)); // Change first column's heading listPage.getData().getColumns().get(0).setName("Owner"); // listPage.setPageName(new PageName("new-page-path")); // You can also change the page's URL path ListPageEntry updatedEntry = listPage.update(); System.out.println("ListPage updated!");
Đang cập nhật nội dung tệp đính kèm
Đối với AttachmentEntry
, bạn cũng có thể cập nhật nội dung bằng cách đặt MediaSource
của mục nhập rồi sử dụng phương thức updateMedia(boolean)
của mục nhập đó.
Ví dụ này sẽ cập nhật nội dung của một tệp đính kèm hiện có:
public AttachmentEntry updateFile(AttachmentEntry entry, File newFile) throws IOException, ServiceException { // See Uploading Attachments for the definition of mediaTypes. entry.setMediaSource(new MediaFileSource(newFile, mediaTypes.getContentType(newFile))); return entry.updateMedia(false); }
Ví dụ này gửi yêu cầu HTTP PUT
đến đường liên kết edit-media
của mục nhập. AttachmentEntry
được trả về sẽ chứa nội dung đã cập nhật.
Cập nhật siêu dữ liệu và nội dung của tệp đính kèm
Bạn có thể cập nhật siêu dữ liệu của tệp đính kèm và nội dung của tệp đính kèm đó trong cùng một lệnh gọi bằng cách sử dụng phương thức updateMedia()
.
Bạn có thể chỉ cập nhật nội dung tệp, siêu dữ liệu hoặc cả hai.
Ví dụ này thay đổi tiêu đề của tệp đính kèm thành "Tiêu đề mới", cập nhật mô tả của tệp và thay thế nội dung tệp bằng một tệp .zip mới.
Vì yêu cầu chứa nội dung tệp mới, nên updateMedia()
của AttachmentEntry
sẽ được sử dụng.
public AttachmentEntry updateAttachment(AttachmentEntry entry, File newFile, String newTitle, String newDescription) throws IOException, ServiceException { // See Uploading Attachments for the definition of mediaTypes. entry.setMediaSource(new MediaFileSource(newFile, mediaTypes.getContentType(newFile))); entry.setTitle(new PlainTextConstruct(newTitle)); entry.setSummary(new PlainTextConstruct(newDescription)); return entry.updateMedia(true); } ContentFeed contentFeed = client.getFeed( new URL(buildContentFeedUrl() + "?kind=attachment&max-results=1"), ContentFeed.class); AttachmentEntry attachment = contentFeed.getEntries(AttachmentEntry.class).get(0); // Update first attachment found AttachmentEntry updatedAttachment = updateAttachment(attachment, new File("/path/to/file.zip"), "New Title", "better stuff");
Xoá nội dung
Để xoá một trang hoặc một mục khỏi một trang web tạo bằng Google Sites, trước tiên hãy truy xuất mục nhập nội dung, sau đó gọi delete()
của mục nhập đó.
entry.delete();
Bạn cũng có thể sử dụng phương thức delete()
của lớp dịch vụ bằng cách truyền vào đó đường liên kết edit
và giá trị ETag của mục nhập:
client.delete(entry.getEditLink().getHref(), "*"); // Note: using "*" may overwrite another client's changes.
Nếu xoá mục nhập thành công, máy chủ sẽ phản hồi bằng một HTTP 200 OK
.
Đang tải tệp đính kèm xuống
Để tải một AttachmentEntry
xuống, hãy gửi một yêu cầu HTTP GET
đến đường liên kết content src của mục nhập.
Ví dụ này tải AttachmentEntry
đầu tiên có trong nguồn cấp nội dung của người dùng xuống thư mục "/path/to/save/file/":
private void downloadFile(String downloadUrl, String fullFilePath) throws IOException, ServiceException { System.out.println("Downloading file from: " + downloadUrl); MediaContent mc = new MediaContent(); mc.setUri(downloadUrl); MediaSource ms = service.getMedia(mc); InputStream inStream = null; FileOutputStream outStream = null; try { inStream = ms.getInputStream(); outStream = new FileOutputStream(fullFilePath); int c; while ((c = inStream.read()) != -1) { outStream.write(c); } } finally { if (inStream != null) { inStream.close(); } if (outStream != null) { outStream.flush(); outStream.close(); } } } public void downloadAttachment(AttachmentEntry entry, String directory) throws IOException, ServiceException { String url = ((OutOfLineContent) entry.getContent()).getUri(); downloadFile(url, directory + entry.getTitle().getPlainText()); // Use entry's title for the save filename } ContentFeed contentFeed = client.getFeed( new URL(buildContentFeedUrl() + "?kind=attachment&max-results=1"), ContentFeed.class); downloadAttachment(contentFeed.getEntries(AttachmentEntry.class).get(0), "/path/to/save/file/"); System.out.println("Downloaded.");
Nguồn cấp dữ liệu ACL
Tổng quan về quyền chia sẻ (ACL)
Mỗi mục nhập ACL trong nguồn cấp dữ liệu ACL đại diện cho vai trò truy cập của một thực thể cụ thể, có thể là người dùng, nhóm người dùng, miền hoặc quyền truy cập mặc định (là trang web công khai). Các mục nhập sẽ chỉ được hiển thị cho các thực thể có quyền truy cập rõ ràng – một mục nhập sẽ hiển thị cho mỗi địa chỉ email trong bảng điều khiển "Người có quyền truy cập" trên màn hình chia sẻ của giao diện người dùng Google Sites. Do đó, quản trị viên miền sẽ không hiển thị, mặc dù họ có quyền truy cập ngầm định vào một trang web.
Vai trò
Phần tử vai trò thể hiện cấp truy cập mà một thực thể có thể có. Phần tử gAcl:role
có thể có bốn giá trị:
- người đọc – người xem (tương đương với quyền chỉ có thể đọc).
- tác giả – một cộng tác viên (tương đương với quyền đọc/ghi).
- chủ sở hữu — thường là quản trị viên trang web (tương đương với quyền đọc/ghi).
Kính ngắm
Phần tử phạm vi đại diện cho thực thể có cấp truy cập này. Có thể có 4 loại phần tử gAcl:scope
:
- user — giá trị địa chỉ email, ví dụ: "user@gmail.com".
- group — địa chỉ email của Google Group, ví dụ: "group@domain.com".
- domain — tên miền G Suite, ví dụ như "domain.com".
- default – Chỉ có thể có một phạm vi thuộc loại "mặc định" không có giá trị (ví dụ:
<gAcl:scope type="default">
). Phạm vi cụ thể này kiểm soát quyền truy cập của bất kỳ người dùng nào theo mặc định trên trang web công khai.
Lưu ý: Miền không được có giá trị gAcl:role
được đặt thành quyền truy cập "chủ sở hữu", chúng chỉ có thể là người đọc hoặc người ghi.
Truy xuất nguồn cấp dữ liệu ACL
Các lớp AclFeed
và AclEntry
có thể được dùng để kiểm soát quyền chia sẻ của một trang web và có thể được tìm nạp bằng phương thức getFeed()
của lớp dịch vụ.
Ví dụ sau tìm nạp nguồn cấp dữ liệu ACL cho một trang web nhất định và in ra quyền của từng AclEntry
:
public String getAclFeedUrl(String siteName) { String domain = "site"; // OR if the Site is hosted on G Suite, your domain (e.g. example.com) return "https://sites.google.com/feeds/acl/site/" + domain + "/" + siteName + "/"; } public void getAclFeed(String siteName) throws IOException, ServiceException { AclFeed aclFeed = client.getFeed(new URL(getAclFeedUrl(siteName)), AclFeed.class); for (AclEntry entry : aclFeed.getEntries()) { System.out.println(entry.getScope().getValue() + " (" + entry.getScope().getType() + ") : " + entry.getRole().getValue()); } } getAclFeed('my-site-name');
Nếu bạn đang làm việc với các mục nhập trong SiteFeed, mỗi SiteEntry
chứa một đường liên kết đến nguồn cấp dữ liệu ACL của nó.
Ví dụ: đoạn mã này tìm nạp nguồn cấp dữ liệu acl của SiteEntry
:
String aclLink = siteEntry.getLink(SitesAclFeedLink.Rel.ACCESS_CONTROL_LIST, Link.Type.ATOM).getHref(); AclFeed aclFeed = client.getFeed(new URL(aclLink), AclFeed.class);
Chia sẻ trang web
Lưu ý: Bạn chỉ có thể sử dụng một số ACL chia sẻ nhất định nếu miền được định cấu hình để cho phép các quyền đó (ví dụ: nếu bạn bật tính năng chia sẻ bên ngoài miền cho các miền G Suite, v.v.).
Để chia sẻ một trang web tạo bằng Google Sites bằng API này, ứng dụng của bạn cần tạo một AclEntry
mới và POST
nó đến máy chủ.
Sau đây là ví dụ về cách thêm "user@example.com" làm reader
trên trang web:
AclRole role = new AclRole("reader"); AclScope scope = new AclScope(AclScope.Type.USER, "user@example.com"); AclEntry aclEntry = addAclRole(role, scope, entry); public AclEntry addAclRole(AclRole role, AclScope scope, SiteEntry siteEntry) throws IOException, MalformedURLException, ServiceException { AclEntry aclEntry = new AclEntry(); aclEntry.setRole(role); aclEntry.setScope(scope); Link aclLink = siteEntry.getLink(SitesAclFeedLink.Rel.ACCESS_CONTROL_LIST, Link.Type.ATOM); return client.insert(new URL(aclLink.getHref()), aclEntry); }
Xem phần Tổng quan về nguồn cấp dữ liệu ACL để biết các giá trị AclScope
và AclRoles
có thể có.
Chia sẻ ở cấp nhóm và cấp miền
Tương tự như việc chia sẻ trang web với một người dùng, bạn có thể chia sẻ trang web trên một nhóm Google hoặc miền G Suite.
Đang chia sẻ với địa chỉ email của nhóm:
AclScope scope = new AclScope(AclScope.Type.GROUP, "group_name@example.com");
Chia sẻ với toàn bộ miền:
AclScope scope = new AclScope(AclScope.Type.DOMAIN, "example.com");
Chúng tôi chỉ hỗ trợ chia sẻ ở cấp miền cho các miền G Suite và chỉ cho miền mà trang web được lưu trữ. Ví dụ: http://sites.google.com/a/domain1.com/siteA chỉ có thể chia sẻ toàn bộ Trang web với domain1.com, không phải domain2.com. Các trang web không được lưu trữ trên miền G Suite (ví dụ: http://sites.google.com/site/siteB) không thể mời các miền.
Sửa đổi quyền chia sẻ
Đối với quyền chia sẻ hiện có trên một Trang web, trước tiên, hãy tìm nạp AclEntry
được đề cập, sửa đổi quyền theo ý muốn, sau đó gọi phương thức update()
của AclEntry
để sửa đổi Danh sách kiểm soát quyền truy cập (ACL) trên máy chủ.
Ví dụ này sửa đổi ví dụ trước về aclEntry
trong phần Chia sẻ một trang web, bằng cách cập nhật "user@example.com" thành writer
(cộng tác viên):
aclEntry.setRole(new AclRole("writer")); AclEntry updatedAclEntry = aclEntry.update(); // Could also use the client's update method // client.update(new URL(aclEntry.getEditLink().getHref()), aclEntry);
Để biết thêm thông tin về ETag, hãy xem hướng dẫn tham khảo API dữ liệu của Google.
Đang xoá quyền chia sẻ
Để xoá quyền chia sẻ, trước tiên hãy truy xuất AclEntry
rồi gọi phương thức delete()
:
aclEntry.delete(); // Could also use the client's delete method // client.delete(new URL(aclEntry.getEditLink().getHref()), aclEntry);
Để biết thêm thông tin về ETag, hãy xem hướng dẫn tham khảo API dữ liệu của Google.
Chủ đề đặc biệt
Truy xuất lại nguồn cấp dữ liệu hoặc mục nhập
Nếu muốn truy xuất một nguồn cấp dữ liệu hoặc mục nhập mà bạn đã truy xuất trước đó, bạn có thể cải thiện tính hiệu quả bằng cách yêu cầu máy chủ chỉ gửi danh sách hoặc mục nhập nếu danh sách hoặc mục nhập đó đã thay đổi kể từ lần gần nhất bạn truy xuất.
Để thực hiện loại truy xuất có điều kiện này, cả hai phương thức getFeed()
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 thẻ của mục nhập từ entry.getEtag()
.
Ví dụ sau thực hiện truy xuất có điều kiện cho mục nhập trang web nội dung:
String feedUrl = "https://sites.google.com/feeds/content/site/siteName/123456789"; WebPageEntry entry = client.getEntry(new URL(feedUrl), WebPageEntry.class, "\"GVQHSARDQyp7ImBq\"");
Khi nhận được yêu cầu này, máy chủ sẽ kiểm tra xem mục mà bạn yêu cầu có cùng ETag với ETag mà bạn đã chỉ định hay không. Nếu ETag khớp, thì mục đó sẽ không thay đổi và máy chủ sẽ trả về một ngoại lệ HTTP 304 NotModifiedException
.
Nếu ETag không khớp, thì mục này đã được sửa đổi kể từ lần cuối cùng bạn yêu cầu và máy chủ sẽ trả về mục.
Để biết thêm thông tin về ETag, hãy xem hướng dẫn tham khảo API dữ liệu của Google.