Важно! Этот документ был написан до 2012 г. Варианты аутентификации, описанные в этом документе (OAuth 1.0, AuthSub и ClientLogin), официально устарели с 20 апреля 2012 г. и больше не поддерживаются. Мы рекомендуем вам как можно скорее перейти на OAuth 2.0.
Google Sites Data API позволяет клиентским приложениям получать доступ к контенту на сайте Google, публиковать его и изменять. Клиентское приложение также может запрашивать список недавних действий, получать историю изменений и скачивать прикрепленные файлы.
В этом руководстве не только рассказывается о возможностях Sites Data API, но и приводятся примеры взаимодействия с API с помощью клиентской библиотеки Java. Инструкции по настройке клиентской библиотеки можно найти в статье Как начать работу с клиентской библиотекой Google Data для Java. Если вы хотите узнать больше о протоколе, который используется клиентской библиотекой Java для взаимодействия с классическим Sites API, ознакомьтесь с руководством по протоколу.
Аудитория
Этот документ предназначен для разработчиков, которые хотят создавать клиентские приложения, взаимодействующие с Google Сайтами с помощью клиентской библиотеки Google Data для Java.
Начало работы
Для аутентификации в Google Сайтах используются аккаунты 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 классического Sites API.java/lib/gdata-core-1.0.jarjava/lib/gdata-client-1.0.jarjava/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 позволяет пользователю выполнять различные операции, демонстрирующие, как использовать классический Sites API.
Примечание. Чтобы запустить пример, вам нужно будет добавить 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.
Как выполнять аутентификацию для Sites API
Клиентскую библиотеку Java можно использовать для работы с общедоступными и частными фидами. Sites Data API предоставляет доступ к частным и общедоступным фидам в зависимости от разрешений Сайтов и операции, которую вы пытаетесь выполнить. Например, вы можете читать фид контента общедоступного сайта, но не сможете его изменить, так как для этого требуется аутентифицированный клиент. Это можно сделать с помощью аутентификации по имени пользователя и паролю ClientLogin, AuthSub или OAuth.
Подробнее об аутентификации в API данных Google…
Совет. API поддерживает SSL (HTTPS). Если вы используете AuthSub/OAuth, обязательно укажите область действия https://sites.google.com/feeds/, чтобы запрашивать фиды через SSL. Обратите внимание, что для доменов G Suite API учитывает параметр "Требовать SSL" на панели управления администратора. Вы можете принудительно использовать HTTPS для всех запросов API, вызвав client.useSsl();.
AuthSub для веб-приложений
Аутентификация AuthSub для веб-приложений должна использоваться клиентскими приложениями, которым необходимо аутентифицировать пользователей в аккаунтах Google. Оператору не нужен доступ к имени пользователя и паролю пользователя Google Сайтов – требуется только токен 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):
- next – 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 для установленных и мобильных приложений
ClientLogin следует использовать в установленных или мобильных приложениях, которым необходимо аутентифицировать пользователей в аккаунтах Google. При первом запуске приложение запрашивает у пользователя имя и пароль. В последующих запросах указывается токен аутентификации.
Как добавить ClientLogin в установленное приложение
Чтобы использовать ClientLogin, вызовите метод setUserCredentials() объекта SitesService, который наследуется от GoogleService. Укажите адрес электронной почты и пароль пользователя, от имени которого клиент отправляет запросы. Пример:
SitesService client = new SitesService("yourCo-yourAppName-v1"); client.setUserCredentials("example@gmail.com", "pa$$word");
Совет. После того как приложение успешно аутентифицирует пользователя в первый раз, сохраните токен аутентификации в базе данных, чтобы использовать его в дальнейшем. Вам не нужно запрашивать пароль пользователя при каждом запуске приложения. Подробнее о том, как отозвать токен авторизации…
Подробнее о том, как использовать 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() клиента в фиде сайта.
В этом примере создается новый сайт с темой "сланец" (необязательный параметр), а также указывается название сайта (обязательный параметр) и описание (необязательный параметр):
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 Сайтов установлен флажок "Опубликовать этот сайт как шаблон".
- Вы можете скопировать сайт из другого домена, если являетесь владельцем исходного сайта.
обновление метаданных сайта;
Чтобы переименовать сайт, изменить его тему, тег категории или описание, сначала нужно получить объект 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. Если параметр отсутствует, значение webAddressMappings не будет возвращаться в записях сайта (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
По умолчанию предыдущий пример будет создан по 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>, если есть. Должно соответствоватьa-z, A-Z, 0-9, -, _.<atom:title>– не может быть пустым, если не указан параметр pageName. Нормализация заключается в том, чтобы удалить пробелы и заменить их на дефисы, а также удалить символы, не соответствующие регулярному выражениюa-z, A-Z, 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 Сайтах, API поддерживает загрузку прикрепленных файлов на страницу типа "картотека" или родительскую страницу.
Чтобы загрузить прикрепленный файл в родительский объект, отправьте HTTP-запрос POST на URL фида контента:
https://sites.google.com/feeds/content/site/siteName
Все типы прикрепленных файлов должны быть загружены на родительскую страницу. Поэтому вы задаете родительскую ссылку для объекта AttachmentEntry или WebAttachmentEntry, который пытаетесь загрузить. Подробнее о том, как создавать подстраницы…
Загрузка прикрепленных файлов…
В этом примере PDF-файл загружается в первый объект FileCabinetPageEntry, найденный в фиде контента пользователя.
Прикрепленный файл будет создан с названием "Начало работы" и описанием "Пакет документов для отдела кадров" (необязательно).
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 Сайтов.
Примечание. Веб-прикрепленные файлы можно создавать только в картотеке. Их нельзя загружать на страницы других типов.
В этом примере создается 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>Updated HTML Content</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 по ссылке на источник контента записи.
В этом примере первое изображение 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
Обзор разрешений на предоставление доступа (списков контроля доступа)
Каждая запись в фиде ACL представляет роль доступа определенного объекта: пользователя, группы пользователей, домена или доступа по умолчанию (общедоступного сайта). Записи будут показываться только для объектов с явным доступом – по одной записи для каждого адреса электронной почты на панели "Пользователи с доступом" на экране предоставления доступа в интерфейсе Google Сайтов. Поэтому администраторы домена не будут показаны, даже если у них есть неявный доступ к сайту.
Роли
Элемент role представляет уровень доступа, который может быть у объекта. Элемент gAcl:role может принимать четыре значения:
- Читатель – пользователь с правами просмотра (эквивалент доступа только для чтения).
- writer – соавтор (эквивалент доступа для чтения и записи).
- Владелец – обычно администратор сайта (эквивалентно доступу на чтение и запись).
Области действия
Элемент области действия представляет объект, которому назначен этот уровень доступа. Существует четыре возможных типа элемента gAcl:scope:
- user – значение адреса электронной почты, например user@gmail.com.
- group – адрес электронной почты группы Google, например group@domain.com.
- domain – доменное имя 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 его на сервер.
Вот пример того, как добавить адрес электронной почты 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, чтобы изменить список контроля доступа на сервере.
В этом примере мы изменили предыдущий пример с разметкой типа 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);
Подробнее о тегах ETag…
Как отменить разрешения на доступ
Чтобы удалить разрешение на доступ, сначала получите объект AclEntry, а затем вызовите его метод delete():
aclEntry.delete(); // Could also use the client's delete method // client.delete(new URL(aclEntry.getEditLink().getHref()), aclEntry);
Подробнее о тегах ETag…
Специальные темы
повторно получить фид или запись;
Если вы хотите получить фид или запись, которые уже получали ранее, можно повысить эффективность, указав серверу отправлять список или запись только в том случае, если они изменились с момента последнего получения.
Для условного получения данных методы 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.
Если теги ETag не совпадают, значит объект был изменен с момента последнего запроса, и сервер возвращает объект.
Подробнее о тегах ETag…