Важно: Этот документ был написан до 2012 года. Описанные в этом документе параметры аутентификации (OAuth 1.0, AuthSub и ClientLogin) были официально признаны устаревшими с 20 апреля 2012 года и больше недоступны. Мы рекомендуем вам как можно скорее перейти на OAuth 2.0 .
API данных Google Sites позволяет клиентским приложениям получать доступ к контенту на сайте Google , публиковать его и изменять. Ваше клиентское приложение также может запрашивать список последних действий, получать историю изменений и загружать вложения.
Помимо предоставления справочной информации о возможностях API данных сайтов, это руководство содержит примеры взаимодействия с API с помощью клиентской библиотеки Java . Инструкции по настройке клиентской библиотеки см. в разделе «Начало работы с клиентской библиотекой Google Data Java» . Если вас интересует более подробная информация о базовом протоколе, используемом клиентской библиотекой Java для взаимодействия с классическим API сайтов, см. руководство по протоколам .
Аудитория
Этот документ предназначен для разработчиков, которые хотят создавать клиентские приложения, взаимодействующие с Google Sites с использованием Java-клиентской библиотеки Google Data .
Начиная
Google Sites использует учетные записи Google или G Suite для аутентификации. Если у вас уже есть учетная запись, все готово. В противном случае вы можете создать новую учетную запись .
Установка библиотеки
Инструкции по настройке и установке клиентской библиотеки см. в разделе «Начало работы с клиентской библиотекой Google Data Java» . Если вы используете Eclipse, в этой статье также объясняется, как настроить проект с помощью плагина Google Data APIs для Eclipse . Вот что вам понадобится для начала:
- Установите Java версии 1.5 или выше.
- Загрузите клиентскую библиотеку (последнюю версию
gdata-src.java.zip). - Загрузите список зависимостей
- Скачайте примеры приложений (последнюю версию
gdata-samples.java.zip).
После установки JAR-файлов вам потребуется добавить в свой проект следующие компоненты:
-
java/lib/gdata-sites-2.0.jar- Версия 2.0, представленная здесь, предназначена для версии 1.4 классического API сайтов. -
java/lib/gdata-core-1.0.jar -
java/lib/gdata-client-1.0.jar -
java/lib/gdata-spreadsheet-3.0.jar(если работаете со страницами-списками / элементами списка)
Также обязательно добавьте необходимые JAR-файлы ( gdata-media-1.0.jar , mail.jar и google-collect....jar ).
Запуск тестового приложения
Полноценный рабочий пример приложения находится в подкаталоге /java/sample/sites загруженного архива gdata-samples.java.zip . Исходный код также доступен в репозитории SVN по адресу /trunk/java/sample/sites/, доступ к которому осуществляется через вкладку «Исходный код». Файл SitesDemo.java позволяет пользователю выполнять ряд операций, демонстрирующих использование классического API Sites.
Обратите внимание, что для запуска примера вам потребуется добавить файл java/sample/util/lib/sample-util.jar .
Начало собственного проекта
Совет : Для быстрой настройки нашего плагина для Eclipse ознакомьтесь со статьей «Использование Eclipse с Google Data API» .
В зависимости от потребностей вашего приложения вам потребуется несколько импортов. Мы рекомендуем начать со следующих импортов:
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.*;
Далее вам также потребуется настроить объект SitesService , который будет представлять собой клиентское подключение к классическому API сайтов:
SitesService client = new SitesService("yourCo-yourAppName-v1");
Аргумент applicationName должен иметь следующий формат: company-applicationname-version . Этот параметр используется для целей логирования.
Примечание : В остальной части этого руководства предполагается, что вы создали SitesService в переменной client .
Аутентификация через классический API сайтов
Клиентская библиотека Java может использоваться для работы как с общедоступными, так и с частными лентами данных. API данных сайтов предоставляет доступ к частным и общедоступным лентам данных в зависимости от прав доступа сайта и выполняемой операции. Например, вы можете читать ленту контента общедоступного сайта, но не можете вносить в нее изменения — для этого потребуется аутентифицированный клиент. Это можно сделать с помощью аутентификации по имени пользователя/паролю ClientLogin , AuthSub или OAuth .
Для получения более подробной информации об AuthSub, OAuth и ClientLogin, пожалуйста, ознакомьтесь с обзором аутентификации Google Data API .
Совет : API поддерживает SSL (HTTPS). Если вы используете AuthSub/OAuth, убедитесь, что указали область http s ://sites.google.com/feeds/ чтобы запрашивать каналы через SSL. Также обратите внимание, что для доменов G Suite параметр «Требовать SSL» в панели управления администрирования учитывается API. Вы можете принудительно настроить все запросы к API на использование HTTPS, вызвав client.useSsl();
AuthSub для веб-приложений
Аутентификация AuthSub для веб-приложений должна использоваться клиентскими приложениями, которым необходимо аутентифицировать своих пользователей в учетных записях Google. Оператору не требуется доступ к имени пользователя и паролю пользователя Google Sites — необходим только токен AuthSub.
Ознакомьтесь с инструкциями по интеграции AuthSub в ваше веб-приложение.
Запросить одноразовый токен
Когда пользователь впервые посещает ваше приложение, ему необходимо пройти аутентификацию. Обычно разработчики выводят текст и ссылку, направляющую пользователя на страницу подтверждения AuthSub для аутентификации и запроса доступа к его документам. Клиентская библиотека Google Data Java предоставляет функцию для генерации этого URL-адреса. Приведенный ниже код создает ссылку на страницу 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);
Если вы хотите аутентифицировать пользователей в домене, размещенном на платформе 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);
Метод getRequestUrl() принимает несколько параметров (соответствующих параметрам запроса, используемым обработчиком AuthSubRequest ):
- Следующий URL — это URL, на который Google перенаправит пользователя после того, как он войдет в свою учетную запись и предоставит доступ; в приведенном выше примере
http://www.example.com/welcome.jsp - Область действия —
https://sites.google.com/feeds/в приведенном выше примере. - Логическое значение, указывающее, будет ли токен использоваться в зарегистрированном режиме или нет; в приведенном выше примере
false - Второе логическое значение указывает, будет ли токен впоследствии обменен на токен сессии или нет; в приведенном выше примере
true
Обновление до токена сессии
См. раздел «Использование AuthSub с клиентскими библиотеками Google Data API» .
Получение информации о токене сессии
См. раздел «Использование AuthSub с клиентскими библиотеками Google Data API» .
Отзыв токена сессии
См. раздел «Использование AuthSub с клиентскими библиотеками Google Data API» .
OAuth для веб-приложений или стационарных/мобильных приложений.
OAuth можно использовать в качестве альтернативы AuthSub и он предназначен для веб-приложений. OAuth похож на использование безопасного и зарегистрированного режима AuthSub тем, что все запросы данных должны быть подписаны цифровой подписью, и вам необходимо зарегистрировать свой домен.
Ознакомьтесь с инструкциями по интеграции OAuth в установленное приложение.
Получение токена запроса
См. раздел «Использование OAuth с клиентскими библиотеками Google Data API» .
Авторизация токена запроса
См. раздел «Использование OAuth с клиентскими библиотеками Google Data API» .
Обновление до токена доступа
См. раздел «Использование OAuth с клиентскими библиотеками Google Data API» .
Вход для клиента (для установленных/мобильных приложений)
ClientLogin следует использовать в установленных или мобильных приложениях, которым необходимо аутентифицировать пользователей в учетных записях Google. При первом запуске ваше приложение запрашивает у пользователя имя пользователя и пароль. При последующих запросах используется токен аутентификации.
Ознакомьтесь с инструкциями по интеграции ClientLogin в установленное приложение.
Для использования ClientLogin вызовите метод setUserCredentials() объекта SitesService , унаследованного от GoogleService . Укажите адрес электронной почты и пароль пользователя, от имени которого ваш клиент отправляет запросы. Например:
SitesService client = new SitesService("yourCo-yourAppName-v1"); client.setUserCredentials("example@gmail.com", "pa$$word");
Совет : После того, как ваше приложение успешно аутентифицирует пользователя в первый раз, сохраните токен аутентификации в базе данных, чтобы использовать его позже. Нет необходимости запрашивать у пользователя пароль при каждом запуске приложения. Дополнительную информацию см. в разделе «Использование токена аутентификации» .
Для получения дополнительной информации об использовании ClientLogin в ваших Java-приложениях см. раздел «Использование ClientLogin с клиентскими библиотеками Google Data API» .
Лента новостей сайта
Лента сайтов позволяет отображать сайты Google, которыми владеет пользователь или на которые у него есть права просмотра. Также её можно использовать для изменения названия существующего сайта. Для доменов G Suite её можно использовать для создания и/или копирования всего сайта.
Сайты для размещения объявлений
Для запроса к ленте сайта отправьте HTTP GET по URL-адресу ленты сайта:
https://sites.google.com/feeds/site/site/ В Java-клиенте для работы с лентой новостей сайта можно использовать классы SiteFeed и SiteEntry :
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(""); } }
Приведённый выше фрагмент кода выводит заголовок сайта, название сайта и тему оформления сайта. Для доступа к дополнительным свойствам в фиде доступны и другие геттеры.
Создание новых сайтов
Примечание : Эта функция доступна только для доменов G Suite.
Новые сайты можно создать, разместив новую SiteEntry и вызвав метод insert() клиента для фида сайта.
В этом примере создается совершенно новый сайт с темой оформления «slate» (необязательная настройка), и указываются название сайта (обязательно) и описание (необязательно):
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");
Приведенный выше запрос создаст новый сайт в домене G Suite example.com . Таким образом, URL сайта будет выглядеть следующим образом: https://sites.google.com/a/example.com/my-site-title.
Если сайт успешно создан, сервер ответит объектом SiteEntry , заполненным элементами, добавленными сервером: ссылкой на сайт, ссылкой на ACL-ленту сайта, названием сайта, заголовком, кратким описанием и так далее.
Копирование сайта
Примечание : Эта функция доступна только для доменов G Suite.
Копирование сайта аналогично созданию нового сайта. Разница заключается в том, что вам нужно добавить в новую SiteEntry ссылку, содержащую ссылку на сайт, который нужно скопировать. Вот пример копирования сайта, созданного в разделе «Создание новых сайтов» :
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);
Важные моменты:
- Копировать можно только сайты и шаблоны сайтов, принадлежащие авторизованному пользователю.
- Шаблон сайта также можно скопировать. Сайт считается шаблоном, если в настройках Google Sites установлен флажок «Опубликовать этот сайт как шаблон».
- Вы можете скопировать сайт с другого домена, при условии, что вы указаны в качестве владельца на исходном сайте.
Обновление метаданных сайта
Чтобы переименовать сайт, изменить его тему оформления, тег категории или описание, вам сначала нужно получить SiteEntry , содержащий нужный сайт, изменить одно или несколько его свойств, а затем вызвать метод update() SiteEntry . В этом примере изменяется тема оформления предыдущего сайта и переименовывается новый сайт:
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();
Сопоставление веб-адресов
Сопоставление веб-адресов позволяет пользователям сайтов сопоставлять свои собственные домены с сайтом Google. Например, вместо http://sites.google.com/a/domain.com/mysite можно использовать http://www.mydomainsite.com . В зависимости от того, где размещен ваш сайт, вы можете вручную изменить сопоставление веб-адресов сайта. Дополнительную информацию см. в статье нашего справочного центра .
Получение сопоставления веб-адресов сайта
Чтобы получить сопоставление веб-адресов для сайта, загрузите запись/ленту сайта, используя параметр 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()); } }
Существующие сопоставления будут отображаться как link с атрибутом rel='webAddressMapping'. Например, в приведенном выше примере есть три объекта webAddressMapping , указывающие на сайт http://sites.google.com/site/ myOtherTestSite .
Изменение сопоставления веб-адресов
Примечание : При работе с сопоставлением веб-адресов во всех операциях GET/POST/PUT необходимо указывать параметр with-mappings=true . Если этот параметр отсутствует, webAddressMapping не будет возвращаться в записях сайта (GET) и не будет учитываться при обновлении/удалении (PUT) сопоставлений из записи.
Чтобы добавить, обновить или удалить сопоставление адресов, просто укажите, измените или удалите такую ссылку при создании новых сайтов или обновлении метаданных сайта . Параметр with-mappings=true должен быть включен в URI фида сайта. Примечание: для обновления сопоставлений адресов необходимо быть администратором сайта или администратором домена в случае сайта, размещенного в G Suite.
Например, приведенный ниже запрос обновляет сопоставление http://www.mysitemapping.com на http://www.my-new-sitemapping.com и удаляет http://www.mysitemapping2.com , исключая ссылку из записи:
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();
Обратите внимание, что сопоставление веб-адресов также можно указать при создании/копировании сайта.
Лента активности
Вы можете получить информацию о последних изменениях на сайте, просмотрев ленту активности. Каждая запись в ленте активности содержит сведения об изменениях, внесенных на сайт.
Для запроса ленты активности отправьте HTTP GET по URL-адресу ленты активности:
https://sites.google.com/feeds/activity/site/siteName
В Java-клиенте используйте класс ActivityFeed для возврата объектов 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()); } }
Примечание : Для доступа к этому каналу необходимо быть соавтором или владельцем сайта. Ваш клиент должен пройти аутентификацию, используя токен AuthSub, OAuth или ClientLogin. См. раздел «Аутентификация в сервисе сайтов» .
Лента изменений
Чтобы получить историю изменений для любой записи контента, отправьте HTTP GET по ссылке на версию записи:
https://sites.google.com/feeds/revision/site/siteName/CONTENT_ENTRY_ID
В этом примере выполняется запрос к ленте контента, а затем извлекается лента версий для первой записи контента:
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()); } }
Примечание: Для доступа к этому каналу необходимо быть соавтором или владельцем сайта. Ваш клиент должен пройти аутентификацию с помощью токена AuthSub, OAuth или ClientLogin. См. раздел «Аутентификация в сервисе сайтов» .
Лента контента
Получение ленты контента
Лента контента отображает последние публикации сайта. Доступ к ней можно получить, отправив HTTP GET на URL-адрес ленты контента:
https://sites.google.com/feeds/content/site/siteName
| Параметры подачи | Описание |
|---|---|
site | " site " или домен вашего хостинга G Suite (например, example.com ). |
siteName | Имя веб-пространства вашего сайта; оно содержится в URL-адресе сайта (например, mySite ). |
Пример получения ленты контента:
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 ContentFeed содержащий ответ от сервера. Каждая запись contentFeed представляет собой отдельную страницу или элемент на сайте пользователя. ContentFeed будет содержать объекты различных типов, все они унаследованы от BaseContentEntry : ListItemEntry , ListPageEntry , AttachmentEntry , WebAttachmentEntry , FileCabinetPageEntry , AnnouncementsPageEntry , AnnouncementEntry , WebPageEntry , CommentEntry .
Вот пример отображения различных типов записей в ContentFeed . Каждый тип записи содержит разные свойства, но не все из них здесь отображаются.
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()); } }
Примечание: Для доступа к этому каналу может потребоваться аутентификация, а может и нет, в зависимости от прав доступа на сайте. Если сайт не является общедоступным, ваш клиент должен пройти аутентификацию, используя токен AuthSub, OAuth или ClientLogin. См. раздел «Аутентификация в сервисе сайтов» .
Примеры запросов к контентным лентам
Вы можете осуществлять поиск по ленте контента, используя некоторые стандартные параметры запроса Google Data API, а также параметры, специфичные для классического Sites API. Для получения более подробной информации и полного списка поддерживаемых параметров см. Справочное руководство .
Примечание : В примерах этого раздела используется метод buildContentFeedUrl() из раздела «Получение ленты контента» .
Получение определенных типов записей
Чтобы получить только записи определенного типа, используйте параметр kind . В этом примере возвращаются только записи 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()); }
Чтобы вернуть несколько типов записей, разделите каждый kind запятой. В этом примере возвращаются записи filecabinet и 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()); }
Получение страницы по пути
Если вам известен относительный путь страницы в Google Сайте, вы можете использовать параметр path для получения этой конкретной страницы. В этом примере будет возвращена страница, расположенная по 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()); }
Получение всех записей на родительской странице
Если вам известен идентификатор элемента контента страницы (например, "1234567890" в приведенном ниже примере), вы можете использовать параметр parent , чтобы получить все его дочерние элементы (если таковые имеются):
ContentQuery query = new ContentQuery(new URL(buildContentFeedUrl())); query.setParent("1234567890"); ContentFeed contentFeed = client.getFeed(query, ContentFeed.class);
Дополнительные параметры см. в Справочном руководстве .
Создание контента
Примечание: Прежде чем создавать контент для сайта, убедитесь, что вы настроили свой сайт в клиенте. client.site = "siteName";
Новый контент (веб-страницы, страницы со списками, страницы файлового хранилища, страницы объявлений и т. д.) можно создать, отправив HTTP POST на ленту контента:
https://sites.google.com/feeds/content/site/siteName
Список поддерживаемых типов узлов см. в параметре kind в Справочном руководстве .
Создание новых элементов/страниц
В этом примере создается новая webpage в корневом каталоге сайта, в тело страницы добавляется XHTML-код, а заголовок страницы устанавливается как «Новый заголовок веб-страницы»:
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());
Если запрос будет успешным, createdEntry будет содержаться копия записи, созданной на сервере.
Создание элементов/страниц по пользовательским URL-адресам
По умолчанию, в предыдущем примере страница будет создана по адресу http://sites.google.com/ site / siteName /new-webpage-title будет иметь заголовок «Новый заголовок веб-страницы». То есть, <atom:title> нормализуется до new-webpage-title для URL-адреса. Чтобы настроить путь URL-адреса страницы, можно задать элемент <sites:pageName> .
В этом примере создается новая страница filecabinet с заголовком «Хранилище файлов», но страница создается по URL- http://sites.google.com/ site / siteName /files (вместо http://sites.google.com/ site / siteName /file-storage путем указания элемента <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());
Сервер использует следующие правила приоритета для именования URL-адресов страниц:
-
<sites:pageName>, если присутствует. Должно удовлетворять условиямaz, AZ, 0-9, -, _. -
<atom:title>не должен быть пустым, если pageName отсутствует. Нормализация заключается в удалении пробелов и сворачивании их в '-', а также удалении символов, не соответствующихaz, AZ, 0-9, -, _.
Создание подстраниц
Для создания дочерних страниц (подстраниц) под родительской страницей необходимо указать родительскую ссылку в соответствующем поле. Атрибут href ссылки должен соответствовать ссылке на родительский узел.
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());
В приведенном выше примере создается новое announcement на первой странице объявлений в ленте контента пользователя. Заголовок объявления устанавливается как «Вечеринка!!», а содержимое — как «У меня дома, в эти выходные».
Шаблоны страниц
Создание шаблонов страниц
Процесс создания шаблона страницы аналогичен созданию новых элементов/страниц и подстраниц . Разница заключается в добавлении category с указанием термина и метки, соответствующих значениям 'http://schemas.google.com/g/2005#template' и 'template' соответственно.
В этом примере создается новый шаблон webpage .
// 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);
Создание страниц на основе шаблона
Подобно созданию шаблонов страниц, вы можете создать новую страницу на основе шаблона, добавив ссылку <link> с атрибутом rel='http://schemas.google.com/sites/2008#template', указывающую на ссылку на страницу шаблона.
В этом примере создается новый шаблон filecabinet , а затем на основе этого шаблона создается новый экземпляр страницы filecabinet .
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);
Примечание : Несмотря на то, что шаблон определяет <category> , включение её в вашу запись всё равно обязательно. Также обратите внимание, что если вы включите элемент <content> , сервер его отклонит.
Загрузка файлов
Как и в Google Sites, API поддерживает загрузку вложений на страницу файлового хранилища или на родительскую страницу.
Для загрузки вложения в родительский элемент отправьте HTTP POST запрос на URL-адрес ленты контента:
https://sites.google.com/feeds/content/site/siteName
Все типы вложений должны загружаться на родительскую страницу. Поэтому необходимо установить родительскую ссылку в объекте AttachmentEntry или WebAttachmentEntry , который вы пытаетесь загрузить. Дополнительную информацию см. в разделе «Создание подстраниц» .
Загрузка вложений
В этом примере PDF-файл загружается в первую запись FileCabinetPageEntry , найденную в ленте контента пользователя. Вложение создается с заголовком «Начало работы» и (необязательным) описанием «HR-пакет».
MimetypesFileTypeMap mediaTypes = new MimetypesFileTypeMap(); mediaTypes.addMimeTypes("application/msword doc"); mediaTypes.addMimeTypes("application/vnd.ms-excel xls"); mediaTypes.addMimeTypes("application/pdf pdf"); mediaTypes.addMimeTypes("text/richtext rtx"); // ... See a more complete list of mime types in the SitesHelper.java public AttachmentEntry uploadAttachment(File file, BasePageEntry<?> parentPage, String title, String description) throws IOException, ServiceException { AttachmentEntry newAttachment = new AttachmentEntry(); newAttachment.setMediaSource(new MediaFileSource(file, mediaTypes.getContentType(file))); newAttachment.setTitle(new PlainTextConstruct(title)); newAttachment.setSummary(new PlainTextConstruct(description)); newAttachment.addLink(SitesLink.Rel.PARENT, Link.Type.ATOM, parentPage.getSelfLink().getHref()); return client.insert(new URL(buildContentFeedUrl()), newAttachment); } ContentFeed contentFeed = client.getFeed(new URL(buildContentFeedUrl() + "?kind=filecabinet"), ContentFeed.class); FileCabinetPageEntry parentPage = contentFeed.getEntries(FileCabinetPageEntry.class).get(0); AttachmentEntry attachment = uploadAttachment( new File("/path/to/your/file.pdf"), parentPage, "Getting Started", "HR packet"); System.out.println("Uploaded!");
В случае успешной загрузки, attachment будет использована копия созданной записи.
Загрузка вложения в папку
Чтобы загрузить вложение в существующую папку в элементе FileCabinetPageEntry , укажите категорию с атрибутом 'term', установленным на имя папки. Например, добавьте следующую строку в uploadAttachment() :
newAttachment.getCategories().add(new Category("http://schemas.google.com/sites/2008#folder", "FolderName"));
Вложения в веб-браузер
Веб-вложения — это особый вид вложений. По сути, это ссылки на другие файлы в интернете, которые вы можете добавить в список файлов в своем файловом хранилище. Эта функция аналогична методу загрузки «Добавить файл по URL» в пользовательском интерфейсе Google Sites.
Примечание : Вложения к веб-страницам можно создавать только в рамках файлового хранилища. Их нельзя загружать на страницы других типов.
В этом примере создается объект WebAttachmentEntry под первым объектом FileCabinetPageEntry , найденным в ленте контента пользователя. Его заголовок и (необязательное) описание устанавливаются на значения «GoogleLogo» и «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 в файловом хранилище пользователя создается ссылка, указывающая на изображение по адресу 'http://www.google.com/images/logo.gif'.
Обновление контента
Обновление метаданных и/или HTML-содержимого страницы
Метаданные (заголовок, имя страницы и т. д.) и содержимое страницы любого типа BaseContentEntry можно редактировать, используя метод update() этой записи. При этом будет отправлен HTTP PUT запрос по ссылке edit записи.
Ниже приведён пример обновления элемента ListPageEntry со следующими изменениями:
- Заголовок изменен на «Обновленный заголовок».
- HTML-содержимое страницы обновлено до '<p>Обновленное HTML-содержимое</p>'
- Заголовок первого столбца списка изменен на «Владелец».
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!");
Обновление содержимого вложенного файла.
Для AttachmentEntry вы также можете обновить содержимое, задав MediaSource для записи, а затем используя метод updateMedia(boolean) этой записи.
В этом примере будет обновлено содержимое существующего вложения:
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); }
В примере отправляется HTTP PUT запрос по ссылке edit-media записи. Возвращаемое значение AttachmentEntry будет содержать обновленное содержимое.
Обновление метаданных и содержимого вложений.
Вы можете обновить метаданные и содержимое вложения в одном вызове, используя метод updateMedia() . Можно обновить либо только содержимое файла, либо метаданные, либо и то, и другое.
В этом примере заголовок вложения изменяется на «Новый заголовок», обновляется его описание и содержимое файла заменяется новым .zip-файлом. Поскольку запрос содержит новое содержимое файла, используется updateMedia() объекта AttachmentEntry .
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");
Удаление контента
Чтобы удалить страницу или элемент с сайта Google, сначала получите доступ к содержимому, а затем вызовите метод delete() для этого элемента.
entry.delete();
Также можно использовать метод delete() класса сервиса, передав ему ссылку edit записи и значение ETag:
client.delete(entry.getEditLink().getHref(), "*"); // Note: using "*" may overwrite another client's changes.
Если запись была успешно удалена, сервер отвечает HTTP-кодом 200 OK .
Загрузка вложений
Для загрузки объекта AttachmentEntry отправьте HTTP GET запрос по ссылке src содержимого объекта AttachmentEntry.
В этом примере первая найденная в ленте контента пользователя запись AttachmentEntry загружается в каталог "/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.");
ACL Feed
Обзор разрешений на совместное использование (ACL)
Каждая запись ACL в ленте ACL представляет собой роль доступа определенного объекта: пользователя, группы пользователей, домена или доступа по умолчанию (общедоступный сайт). Записи будут отображаться только для объектов с явным доступом — одна запись будет отображаться для каждого адреса электронной почты на панели «Люди с доступом» на экране общего доступа в пользовательском интерфейсе Google Sites. Таким образом, администраторы домена не будут отображаться, даже если у них есть неявный доступ к сайту.
Роли
Элемент `role` представляет собой уровень доступа, которым может обладать сущность. Элемент gAcl:role может иметь четыре возможных значения:
- читатель — зритель (эквивалентно доступу только для чтения).
- писатель — соавтор (эквивалентно доступу на чтение/запись).
- Владелец — как правило, администратор сайта (эквивалентно праву на чтение/запись).
Области применения
Элемент scope представляет собой сущность, имеющую данный уровень доступа. Существует четыре возможных типа элемента gAcl:scope :
- user — значение адреса электронной почты, например, "user@gmail.com".
- группа — это адрес электронной почты группы Google, например, "group@domain.com".
- домен — доменное имя G Suite, например, "domain.com".
- default — Существует только одна возможная область видимости типа "default", которая не имеет значения (например
<gAcl:scope type="default">). Эта конкретная область видимости контролирует доступ, который любой пользователь имеет по умолчанию на общедоступном сайте.
Примечание : для доменов нельзя установить значение gAcl:role со значением доступа "владелец", они могут иметь только права на чтение или запись.
Получение данных из ACL-канала
Классы AclFeed и AclEntry можно использовать для управления правами доступа к контенту на сайте, и их данные можно получить с помощью метода getFeed() класса сервиса.
В следующем примере извлекается лента ACL для заданного сайта и выводятся разрешения для каждой 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');
Если вы работаете с записями в SiteFeed , каждая SiteEntry содержит ссылку на свою ленту ACL. Например, этот фрагмент кода получает ленту ACL для записи SiteEntry :
String aclLink = siteEntry.getLink(SitesAclFeedLink.Rel.ACCESS_CONTROL_LIST, Link.Type.ATOM).getHref(); AclFeed aclFeed = client.getFeed(new URL(aclLink), AclFeed.class);
Совместное использование сайта
Примечание : Некоторые списки контроля доступа (ACL) для общего доступа могут быть доступны только в том случае, если домен настроен на разрешение таких прав (например, если включен общий доступ за пределами домена для доменов G Suite и т. д.).
Для предоставления доступа к сайту Google через API вашему клиенту необходимо создать новый объект AclEntry и POST его на сервер методом POST.
Вот пример, который добавляет пользователя 'user@example.com' в качестве reader на сайт:
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); }
Возможные значения параметров AclScope и AclRoles см. в разделе «Обзор каналов ACL» .
Совместное использование на уровне групп и доменов.
Подобно тому, как вы предоставляете доступ к сайту одному пользователю , вы можете предоставить доступ к сайту в рамках группы Google или домена G Suite.
Разрешить отправку письма на групповой адрес электронной почты:
AclScope scope = new AclScope(AclScope.Type.GROUP, "group_name@example.com");
Совместное использование со всем доменом:
AclScope scope = new AclScope(AclScope.Type.DOMAIN, "example.com");
Совместное использование на уровне домена поддерживается только для доменов G Suite и только для того домена, на котором размещен сайт. Например, http://sites.google.com/a/domain1.com/siteA может предоставить общий доступ ко всему сайту только домену domain1.com, а не domain2.com. Сайты, не размещенные на домене G Suite (например, http://sites.google.com/site/siteB), не могут приглашать домены.
Изменение прав доступа
Для изменения существующих разрешений доступа на сайте сначала получите соответствующий объект AclEntry , измените разрешение по своему усмотрению, а затем вызовите метод update() объекта AclEntry , чтобы изменить список контроля доступа (ACL) на сервере.
В этом примере изменен наш предыдущий пример aclEntry из раздела «Совместное использование сайта» : вместо 'user@example.com' теперь указан writer (соавтор):
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);
Для получения дополнительной информации об ETags см. справочное руководство по API данных Google .
Удаление разрешений на совместное использование
Чтобы удалить разрешение на совместное использование, сначала получите AclEntry , а затем вызовите его метод delete() :
aclEntry.delete(); // Could also use the client's delete method // client.delete(new URL(aclEntry.getEditLink().getHref()), aclEntry);
Для получения дополнительной информации об ETags см. справочное руководство по API данных Google .
Специальные темы
Повторное получение ленты или записи
Если вы хотите получить доступ к ленте или записи, которые вы уже получали ранее, вы можете повысить эффективность, указав серверу отправлять список или запись только в том случае, если они изменились с момента последнего получения.
Для выполнения такого рода условного получения данных методы getFeed() и getEntry() предоставляют дополнительный аргумент, принимающий значение ETag или объект DateTime для заголовка If-Modified-Since . Доступ к etag записи можно получить из entry.getEtag() .
В этом примере выполняется условное получение записи веб-страницы с контентом:
String feedUrl = "https://sites.google.com/feeds/content/site/siteName/123456789"; WebPageEntry entry = client.getEntry(new URL(feedUrl), WebPageEntry.class, "\"GVQHSARDQyp7ImBq\"");
Когда сервер получает этот запрос, он проверяет, совпадает ли ETag с указанным вами ETag для запрошенного элемента. Если ETag совпадают, значит, элемент не изменился, и сервер возвращает исключение HTTP 304 NotModifiedException .
Если ETags не совпадают, значит, элемент был изменен с момента вашего последнего запроса, и сервер возвращает элемент.
Для получения дополнительной информации об ETags см. справочное руководство по API данных Google .