راهنمای زبان جاوا

مهم: این سند قبل‌از سال ۲۰۱۲ نوشته شده است. گزینه‌های اصالت‌سنجی شرح‌داده‌شده در این سند (OAuth 1.0،‏ AuthSub، و ClientLogin) از تاریخ ۲۰ آوریل ۲۰۱۲ رسمی منسوخ شده‌اند و دیگر دردسترس نیستند. توصیه می‌کنیم در اسرع وقت به OAuth 2.0 انتقال دهید.

«میانای برنامه‌سازی کاربردی داده‌های Google Sites» به برنامه‌های مشتری اجازه می‌دهد به محتوای سایت Google دسترسی داشته باشند، آن را منتشر کنند، و تغییر دهند. برنامه کلاینت شما همچنین می‌تواند فهرست فعالیت‌های اخیر را درخواست کند، سابقه بازبینی را واکشی کند، و پیوست‌ها را بارگیری کند.

این راهنما علاوه‌بر ارائه اطلاعاتی درباره قابلیت‌های «میانای برنامه‌سازی کاربردی داده‌های سایت‌ها»، نمونه‌هایی از تعامل با این میانای برنامه‌سازی کاربردی بااستفاده از کتابخانه مشتری Java ارائه می‌دهد. برای دریافت راهنمایی درباره راه‌اندازی کتابخانه کارخواه، به شروع کار با کتابخانه کارخواه جاوا Google Data مراجعه کنید. اگر علاقه‌مندید درباره پروتکل زیربنایی که کتابخانه کارخواه Java برای تعامل با «میانای برنامه‌سازی کاربردی کلاسیک سایت‌ها» استفاده می‌کند بیشتر بدانید، لطفاً راهنمای پروتکل را ببینید.

مخاطبان

این سند برای توسعه‌دهندگانی درنظر گرفته شده است که می‌خواهند برنامه‌های کارخواه بنویسند که با «سایت‌ساز Google» بااستفاده از کتابخانه کارخواه جاوا Google Data تعامل داشته باشد.

درحال شروع کردن

‫Google Sites از «حساب‌های Google» یا حساب‌های G Suite برای اصالت‌سنجی استفاده می‌کند. اگر ازقبل حساب دارید، همه چیز آماده است. درغیراین‌صورت، می‌توانید حساب جدیدی ایجاد کنید.

درحال نصب کتابخانه

برای دریافت راهنمایی درباره راه‌اندازی و نصب کتابخانه کارخواه، به شروع کار با کتابخانه کارخواه جاوا داده‌های Google مراجعه کنید. اگر از Eclipse استفاده می‌کنید، آن مقاله همچنین توضیح می‌دهد که چگونه پروژه خود را بااستفاده از افزایه Google Data APIs Eclipse راه‌اندازی کنید. برای شروع، به موارد زیر نیاز دارید:

  1. ‫Java نسخه ۱.۵ یا بالاتر را نصب کنید
  2. بارگیری کتابخانه مشتری (جدیدترین نسخه gdata-src.java.zip)
  3. فهرست وابستگی‌ها را بارگیری کنید
  4. برنامه‌های نمونه (جدیدترین نسخه gdata-samples.java.zip) را بارگیری کنید

پس‌از نصب فایل‌های .jar، باید موارد زیر را به پروژه‌تان اضافه کنید:

  1. ‫java/lib/gdata-sites-2.0.jar - نسخه ۲.۰ در اینجا برای نسخه ۱.۴ «میانای برنامه‌سازی کاربردی» کلاسیک «سایت‌ها» درنظر گرفته شده است.
  2. java/lib/gdata-core-1.0.jar
  3. java/lib/gdata-client-1.0.jar
  4. ‫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 قرار دارد. منبع در /trunk/java/sample/sites/ در مخزن SVN که از زبانه «منبع» قابل‌دسترسی است نیز دردسترس است. SitesDemo.java به کاربر اجازه می‌دهد تعدادی عملیات انجام دهد که نحوه استفاده از «میانای برنامه‌سازی کاربردی کلاسیک» را نشان می‌دهد.

توجه داشته باشید که برای اجرای نمونه باید java/sample/util/lib/sample-util.jar را اضافه کنید.

شروع پروژه خودتان

نکته: برای راه‌اندازی سریع با افزایه Eclipse ما، مقاله استفاده از Eclipse با Google Data APIs را ببینید.

بسته به نیازهای برنامه‌تان، به چندین وارد کردن نیاز خواهید داشت. توصیه می‌کنیم با وارد کردن موارد زیر شروع کنید:

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 راه‌اندازی کنید که نشان‌دهنده اتصال کارخواه به «میانای برنامه‌سازی کاربردی کلاسیک سایت‌ها» است:

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

آرگومان applicationName باید از قالب زیر پیروی کند: company-applicationname-version. این پارامتر برای اهداف گزارش‌گیری استفاده می‌شود.

توجه: بقیه این راهنما فرض می‌کند که SitesService را در متغیر client ایجاد کرده‌اید.

اصالت‌سنجی در «میانای برنامه‌سازی کاربردی کلاسیک سایت‌ها»

از کتابخانه مشتری Java می‌توان برای کار با فیدهای عمومی یا خصوصی استفاده کرد. «میانای برنامه‌سازی کاربردی داده‌های سایت‌ها» بسته به اجازه‌های «سایت‌ها» و عملیاتی که می‌خواهید انجام دهید، دسترسی به فیدهای خصوصی و عمومی را فراهم می‌کند. برای مثال، ممکن است بتوانید فید محتوای «سایت» عمومی را بخوانید اما نتوانید آن را به‌روزرسانی کنید - کاری که نیاز به مشتری اصیل دارد. این کار را می‌توان ازطریق اصالت‌سنجی نام کاربری/گذرواژه ClientLogin، AuthSub، یا OAuth انجام داد.

لطفاً برای اطلاعات بیشتر درباره AuthSub،‏ OAuth، و ClientLogin، به نمای کلی اصالت‌سنجی Google Data APIs مراجعه کنید.

نکته: این API از SSL (HTTPS) پشتیبانی می‌کند. اگر از AuthSub/OAuth استفاده می‌کنید، حتماً محدوده https://sites.google.com/feeds/ را مشخص کنید تا بتوانید فیدها را ازطریق SSL درخواست کنید. همچنین توجه داشته باشید که برای دامنه‌های G Suite، تنظیم «ملزم به SSL» در پانل کنترل سرپرست توسط API رعایت می‌شود. با فراخوانی client.useSsl(); می‌توانید همه درخواست‌های API را مجبور کنید ازطریق HTTPS ارسال شوند.

‫AuthSub برای برنامه‌های وب

برنامه‌های مشتری که نیاز دارند کاربران خود را در حساب‌های Google اصالت‌سنجی کنند باید از اصالت‌سنجی AuthSub برای برنامه‌های وب استفاده کنند. کاربر به دسترسی به نام کاربری و گذرواژه کاربر «سایت‌های Google» نیاز ندارد - فقط یک AuthSub token لازم است.

مشاهده دستورالعمل‌های ادغام AuthSub در برنامه وب

درخواست کد تک‌مصرف

وقتی کاربر برای اولین‌بار از برنامه شما بازدید می‌کند، باید اصالت‌سنجی کند. معمولاً توسعه‌دهندگان مقداری نوشتار و پیوندی را چاپ می‌کنند که کاربر را به صفحه تأیید AuthSub هدایت می‌کند تا کاربر را اصالت‌سنجی کند و دسترسی به اسناد او را درخواست کند. کتابخانه مشتری Google Data Java تابعی برای تولید این نشانی وب ارائه می‌دهد. کد زیر پیوندی به صفحه 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) را می‌پذیرد:

  • نشانی وب بعدی — نشانی وبی که 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 در برنامه‌های Java، به استفاده از ClientLogin با کتابخانه‌های کارخواه Google Data API مراجعه کنید.

برگشتن به بالا

فید سایت

از فید سایت می‌توان برای فهرست کردن «سایت‌های Google» که کاربر مالک آن‌ها است یا اجازه مشاهده آن‌ها را دارد استفاده کرد. همچنین می‌توان از آن برای اصلاح نام سایت موجود استفاده کرد. برای دامنه‌های G Suite، از آن می‌توان برای ایجاد و/یا کپی کردن کل سایت نیز استفاده کرد.

فهرست کردن سایت‌ها

برای پُرسمان کردن فید سایت، GET اچ‌تی‌تی‌پی را به نشانی وب فید سایت ارسال کنید:

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 ایجاد می‌کند. بنابراین، نشانی وب سایت 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://www.mydomainsite.com می‌تواند به‌جای http://sites.google.com/a/domain.com/mysite استفاده شود. بسته به جایی که سایتتان میزبانی می‌شود، می‌توانید نگاشت‌های نشانی وب سایت را به‌صورت دستی تغییر دهید. برای اطلاعات بیشتر، مقاله مرکز راهنمایی ما را ببینید.

درحال واکشی تخصیص‌های نشانی وب سایت

برای برگرداندن نگاشت‌های نشانی وب برای یک سایت، ورودی/فید سایت را با پارامتر 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 باید در نشانی وب فید سایت گنجانده شود. توجه: برای به‌روزرسانی کردن نشانی‌های نگاشت، باید سرپرست سایت یا سرپرست دامنه باشید (درصورت میزبانی سایت در 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();

توجه داشته باشید، نگاشت‌های نشانی وب را می‌توان در زمان ایجاد/کپی کردن سایت نیز مشخص کرد.

برگشتن به بالا

فید فعالیت‌ها

با واکشی کردن فید فعالیت می‌توانید فعالیت اخیر (تغییرات) «سایت» را واکشی کنید. هر ورودی در فید فعالیت حاوی اطلاعاتی درباره تغییری است که در «سایت» ایجاد شده است.

برای پُرسمان فید فعالیت‌ها، یک GET HTTP به نشانی وب فید فعالیت‌ها ارسال کنید:

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 اصالت‌سنجی کند. به اصالت‌سنجی در سرویس «سایت‌ها» مراجعه کنید.

برگشتن به بالا

فید محتوا

درحال بازیابی فید محتوا

فید محتوا جدیدترین محتوای «سایت» را فهرست می‌کند. با ارسال GET HTTP به نشانی وب فید محتوا می‌توان به آن دسترسی داشت:

https://sites.google.com/feeds/content/site/siteName
پارامتر فیدشرح
site‫«site» یا دامنه دامنه میزبانی‌شده G Suite شما (برای نمونه example.com).
siteNameنام فضای وب سایت شما؛ در نشانی وب سایت یافت می‌شود (برای نمونه، 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());
}

درحال بازیابی همه ورودی‌های زیر صفحه اصلی

اگر شناسه ورودی محتوای صفحه‌ای را می‌دانید (مثلاً «۱۲۳۴۵۶۷۸۹۰» در مثال زیر)، می‌توانید از پارامتر 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 حاوی نسخه‌ای از ورودی ایجادشده در سرور خواهد بود.

ساختن عناصر/صفحه‌ها در مسیرهای نشانی وب سفارشی

به‌طور پیش‌فرض، مثال قبلی در نشانی وب http://sites.google.com/site/siteName/new-webpage-title ایجاد می‌شود و عنوان صفحه آن «عنوان صفحه وب جدید» خواهد بود. یعنی <atom:title> برای نشانی وب به new-webpage-title عادی‌سازی می‌شود. برای سفارشی‌سازی مسیر نشانی وب صفحه، می‌توانید عنصر <sites:pageName> را تنظیم کنید.

این مثال صفحه filecabinet جدیدی با عنوان «ذخیره‌سازی فایل» ایجاد می‌کند، اما با مشخص کردن عنصر <sites:pageName>، صفحه را در نشانی وب http://sites.google.com/site/siteName/files (به‌جای http://sites.google.com/site/siteName/file-storage) ایجاد می‌کند.

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());

سرور از قوانین اولویت زیر برای نام‌گذاری مسیر نشانی وب صفحه استفاده می‌کند:

  1. ‫<sites:pageName>، درصورت وجود. باید a-z, A-Z, 0-9, -, _ را برآورده کند.
  2. ‫<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» و «الگو» به‌ترتیب است.

این مثال الگوی 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 را به نشانی وب فید محتوا ارسال کنید:

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، دسته‌ای با مشخصه «واژه» تنظیم‌شده روی نام پوشه اضافه کنید. برای مثال، این خط را در uploadAttachment() اضافه کنید:

newAttachment.getCategories().add(new Category("http://schemas.google.com/sites/2008#folder", "FolderName"));

پیوست‌های وب

پیوست‌های وب انواع خاصی از پیوست‌ها هستند. اساساً، آن‌ها پیوندهایی به فایل‌های دیگر در وب هستند که می‌توانید به فهرستگان فایل‌کابینت خود اضافه کنید. این ویژگی مشابه روش بارگذاری «افزودن فایل با نشانی وب» در واسط کاربر «سایت‌ساز 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() ورودی ویرایش کرد. این کار درخواست اچ‌تی‌تی‌پی 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);
}

این مثال درخواست 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.

اگر ورودی باموفقیت حذف شود، سرور با 200 OK‏ HTTP پاسخ می‌دهد.

برگشتن به بالا



درحال بارگیری پیوست‌ها

برای بارگیری AttachmentEntry، درخواست 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)

هر ورودی ACL در فید ACL نشان‌دهنده نقش دسترسی یک نهاد خاص است، خواه کاربر، گروه کاربران، دامنه، یا دسترسی پیش‌فرض (که یک سایت عمومی است). ورودی‌ها فقط برای نهادهایی با دسترسی صریح نشان داده می‌شود - یک ورودی برای هر نشانی ایمیل در پانل «افراد دارای دسترسی» در صفحه هم‌رسانی واسط کاربر Google Sites نشان داده می‌شود. بنابراین، سرپرستان دامنه نشان داده نخواهند شد، حتی اگر دسترسی ضمنی به سایت داشته باشند.

نقش‌ها

عنصر نقش نشان‌دهنده سطح دسترسی است که یک نهاد می‌تواند داشته باشد. چهار مقدار ممکن برای عنصر gAcl:role وجود دارد:

  • خواننده — یک بیننده (معادل دسترسی فقط خواندنی).
  • نویسنده — یک همیار (معادل دسترسی خواندن/نوشتن).
  • مالک — معمولاً سرپرست سایت (معادل دسترسی خواندن/نوشتن).

دوربین تفنگ

عنصر محدوده نشان‌دهنده نهادی است که این سطح دسترسی را دارد. چهار نوع ممکن برای عنصر gAcl:scope وجود دارد:

  • کاربر — مقدار نشانی ایمیل، برای نمونه «user@gmail.com».
  • گروه — نشانی ایمیل «گروه Google»، برای نمونه «group@domain.com».
  • دامنه — نام دامنه G Suite، برای نمونه «domain.com».
  • پیش‌فرض — فقط یک محدوده ممکن از نوع «پیش‌فرض» وجود دارد که مقدار ندارد (برای نمونه <gAcl:scope type="default">). این محدوده خاص دسترسی را که هر کاربر به‌طور پیش‌فرض در سایت عمومی دارد کنترل می‌کند.

توجه: دامنه‌ها نمی‌توانند مقدار gAcl:role <0x0A> را روی دسترسی «مالک» تنظیم کنند، آن‌ها فقط می‌توانند خواننده یا نویسنده باشند.

درحال بازیابی فید 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);

هم‌رسانی سایت

توجه: برخی‌از فهرست‌های کنترل دسترسی هم‌رسانی فقط درصورتی امکان‌پذیر است که دامنه برای اجازه دادن به چنین اجازه‌هایی پیکربندی شده باشد (برای نمونه، اگر هم‌رسانی خارج از دامنه برای دامنه‌های 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);

برای اطلاعات بیشتر درباره ETags، به راهنمای مرجع Google Data APIs مراجعه کنید.

درحال برداشتن اجازه‌های هم‌رسانی

برای برداشتن اجازه هم‌رسانی، ابتدا AclEntry را بازیابی کنید، سپس روش delete() آن را فراخوانی کنید:

aclEntry.delete();

// Could also use the client's delete method
// client.delete(new URL(aclEntry.getEditLink().getHref()), aclEntry);

برای اطلاعات بیشتر درباره ETags، به راهنمای مرجع Google Data APIs مراجعه کنید.

برگشتن به بالا

موضوعات ویژه

دوباره بازیابی کردن فید یا ورودی

اگر می‌خواهید فید یا ورودی‌ای را که قبلاً بازیابی کرده‌اید بازیابی کنید، می‌توانید با گفتن به سرور که فهرست یا ورودی را فقط درصورتی ارسال کند که از آخرین باری که آن را بازیابی کرده‌اید تغییر کرده باشد، کارایی را بهبود دهید.

برای انجام این نوع بازیابی شرطی، هر دو روش getFeed() و getEntry() آرگومان اضافه‌ای ارائه می‌دهند که مقدار ETag یا شیء DateTime را برای سرایند If-Modified-Since می‌پذیرد. می‌توانید از entry.getEtag() به etag ورودی دسترسی پیدا کنید.

این مثال بازیابی شرطی را برای ورودی صفحه وب محتوا انجام می‌دهد:

String feedUrl = "https://sites.google.com/feeds/content/site/siteName/123456789";
WebPageEntry entry = client.getEntry(new URL(feedUrl), WebPageEntry.class, "\"GVQHSARDQyp7ImBq\"");

وقتی سرور این درخواست را دریافت می‌کند، بررسی می‌کند که آیا مورد درخواستی شما همان ETag را دارد که شما مشخص کرده‌اید یا نه. اگر ETags مطابقت داشته باشند، یعنی مورد تغییر نکرده است و سرور یا استثنای HTTP 304 NotModifiedException برمی‌گرداند یا استثنایی ایجاد می‌شود.

اگر ETags مطابقت نداشته باشند، یعنی مورد از آخرین باری که آن را درخواست کرده‌اید اصلاح شده است و سرور مورد را برمی‌گرداند.

برای اطلاعات بیشتر درباره ETags، به راهنمای مرجع Google Data APIs مراجعه کنید.

برگشتن به بالا