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

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

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

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

مخاطب

این سند برای توسعه‌دهندگانی در نظر گرفته شده است که می‌خواهند برنامه‌های کلاینتی بنویسند که با استفاده از کتابخانه کلاینت جاوای داده‌های گوگل (Google Data Java Client Library) با سایت‌های گوگل تعامل داشته باشند.

شروع به کار

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

نصب کتابخانه

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

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

پس از نصب .jars، باید موارد زیر را در پروژه خود وارد کنید:

  1. java/lib/gdata-sites-2.0.jar - نسخه ۲.۰ اینجا برای نسخه ۱.۴ از API کلاسیک Sites در نظر گرفته شده است.
  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 که از طریق تب Source قابل دسترسی است، موجود است. SitesDemo.java به کاربر اجازه می‌دهد تعدادی عملیات انجام دهد که نحوه استفاده از API کلاسیک Sites را نشان می‌دهد.

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

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

نکته : برای راه‌اندازی سریع افزونه Eclipse ما، به مقاله «استفاده از Eclipse با 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 کلاسیک Sites است:

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

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

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

احراز هویت با استفاده از API کلاسیک Sites

کتابخانه کلاینت جاوا می‌تواند برای کار با فیدهای عمومی یا خصوصی استفاده شود. Sites Data API بسته به مجوزهای Sites و عملیاتی که می‌خواهید انجام دهید، دسترسی به فیدهای خصوصی و عمومی را فراهم می‌کند. به عنوان مثال، ممکن است بتوانید فید محتوای یک سایت عمومی را بخوانید اما نتوانید آن را به‌روزرسانی کنید - کاری که نیاز به یک کلاینت احراز هویت شده دارد. این کار را می‌توان از طریق احراز هویت نام کاربری/رمز عبور ClientLogin ، AuthSub یا OAuth انجام داد.

برای اطلاعات بیشتر در مورد AuthSub، OAuth و ClientLogin، لطفاً به بررسی اجمالی احراز هویت APIهای داده گوگل مراجعه کنید.

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

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

احراز هویت AuthSub برای برنامه‌های وب باید توسط برنامه‌های کلاینت که نیاز به احراز هویت کاربران خود در حساب‌های گوگل دارند، استفاده شود. اپراتور نیازی به دسترسی به نام کاربری و رمز عبور کاربر Google Sites ندارد - فقط یک توکن AuthSub مورد نیاز است.

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

درخواست توکن یکبار مصرف

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

  • آدرس اینترنتی بعدی - آدرس اینترنتی که گوگل پس از ورود کاربر به حساب کاربری و اعطای دسترسی، آن را به آن هدایت می‌کند؛ در مثال بالا 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 در برنامه نصب شده خود را مشاهده کنید

برای استفاده از ClientLogin ، متد setUserCredentials() از شیء SitesService را که از GoogleService به ارث رسیده است، فراخوانی کنید. آدرس ایمیل و رمز عبور کاربری را که کلاینت شما از طرف او درخواست‌ها را ارسال می‌کند، مشخص کنید. برای مثال:

SitesService client = new SitesService("yourCo-yourAppName-v1");
client.setUserCredentials("example@gmail.com", "pa$$word");

نکته : پس از اینکه برنامه شما برای اولین بار با موفقیت کاربر را احراز هویت کرد، توکن احراز هویت را در پایگاه داده خود ذخیره کنید تا برای استفاده‌های بعدی قابل بازیابی باشد. نیازی نیست در هر بار اجرای برنامه، رمز عبور را از کاربر بخواهید. برای اطلاعات بیشتر به بخش «فراخوانی توکن احراز هویت» مراجعه کنید.

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

بازگشت به بالا

فید سایت

فید سایت می‌تواند برای فهرست کردن سایت‌های گوگلی که یک کاربر مالک آنهاست یا مجوزهای مشاهده آنها را دارد، استفاده شود. همچنین می‌تواند برای تغییر نام یک سایت موجود استفاده شود. برای دامنه‌های G Suite، می‌توان از آن برای ایجاد و/یا کپی کردن کل یک سایت نیز استفاده کرد.

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

برای پرس و جو در مورد فید سایت، یک HTTP GET به آدرس فید سایت ارسال کنید:

https://sites.google.com/feeds/site/site/

در کلاینت جاوا، می‌توانید از کلاس‌های 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("");
  }
}

قطعه کد بالا عنوان سایت، نام سایت و قالب سایت را چاپ می‌کند. getter های دیگری نیز برای دسترسی به ویژگی‌های اضافی در feed در دسترس هستند.

ایجاد سایت‌های جدید

توجه : این ویژگی فقط برای دامنه‌های G Suite در دسترس است.

سایت‌های جدید را می‌توان با ایجاد یک SiteEntry جدید و فراخوانی متد insert() کلاینت در فید سایت، آماده‌سازی کرد.

این مثال یک سایت کاملاً جدید با قالب 'slate' (تنظیم اختیاری) ایجاد می‌کند و نام سایت (الزامی) و توضیحات (اختیاری) را ارائه می‌دهد:

public String getSiteFeedUrl() {
  String domain = "example.com";
  return "https://sites.google.com/feeds/site/" + domain + "/";
}

public SiteEntry createSite(String title, String summary, String theme, String tag)
    throws MalformedURLException, IOException, ServiceException {
  SiteEntry entry = new SiteEntry();
  entry.setTitle(new PlainTextConstruct(title));
  entry.setSummary(new PlainTextConstruct(summary));

  Theme tt = new Theme();
  tt.setValue(theme);
  entry.setTheme(tt);

  entry.getCategories().add(new Category(TagCategory.Scheme.TAG, tag, null));

  return client.insert(new URL(getSiteFeedUrl()), entry);
}

SiteEntry newSiteEntry = createSite("My Site Title", "summary for site", "slate", "tag");

درخواست فوق یک سایت جدید تحت دامنه example.com از G Suite ایجاد می‌کند. بنابراین، آدرس اینترنتی سایت 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);

نکات مهم:

  • فقط سایت‌ها و قالب‌های سایتی که کاربر احراز هویت شده دارد، قابل کپی هستند.
  • یک قالب سایت را می‌توان کپی کرد. یک سایت در صورتی یک قالب است که گزینه «انتشار این سایت به عنوان یک قالب» در صفحه تنظیمات سایت‌های گوگل علامت زده شده باشد.
  • شما می‌توانید یک سایت را از دامنه دیگری کپی کنید، البته تا زمانی که به عنوان مالک در سایت منبع ذکر شده باشید.

به‌روزرسانی متادیتای یک سایت

برای تغییر نام یک سایت، تغییر قالب، برچسب دسته‌بندی یا خلاصه آن، ابتدا باید 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();

نگاشت آدرس‌های وب

نگاشت آدرس‌های وب به کاربران سایت‌ها این امکان را می‌دهد که دامنه‌های خود را به یک سایت گوگل نگاشت کنند. برای مثال، می‌توان از 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 را مشخص کنند. اگر این پارامتر وجود نداشته باشد، webAddressMapping ها در ورودی‌های سایت (GET) بازگردانده نمی‌شوند یا هنگام به‌روزرسانی/حذف نگاشت‌های (PUT) از یک ورودی در نظر گرفته نمی‌شوند.

برای افزودن، به‌روزرسانی یا حذف یک نگاشت، کافیست هنگام ایجاد سایت‌های جدید یا به‌روزرسانی فراداده‌های سایت ، چنین پیوندی را مشخص، تغییر یا حذف کنید. پارامتر with-mappings=true باید در URL فید سایت گنجانده شود. توجه: برای به‌روزرسانی نگاشت‌های آدرس، باید مدیر سایت یا در صورت میزبانی سایت با 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

در کلاینت جاوا، از کلاس 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 احراز هویت شود. به بخش احراز هویت در سرویس Sites مراجعه کنید.

بازگشت به بالا

فید نسخه‌ها

برای دریافت تاریخچه‌ی ویرایش‌های هر ورودی محتوا، یک 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 احراز هویت شود. به بخش احراز هویت در سرویس Sites مراجعه کنید.

بازگشت به بالا

فید محتوا

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

فید محتوا، آخرین محتوای یک سایت را فهرست می‌کند. با ارسال یک 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 احراز هویت شود. به بخش احراز هویت در سرویس Sites مراجعه کنید.

نمونه‌های پرس‌وجوی فید محتوا

شما می‌توانید با استفاده از برخی از پارامترهای استاندارد پرس‌وجوی Google Data API و پارامترهای خاص Sites API کلاسیک، در فید محتوا جستجو کنید. برای اطلاعات بیشتر و فهرست کامل پارامترهای پشتیبانی‌شده، به راهنمای مرجع مراجعه کنید.

نکته : مثال‌های این بخش از متد buildContentFeedUrl() در بازیابی Content Feed استفاده می‌کنند.

بازیابی انواع ورودی خاص

برای دریافت فقط یک نوع خاص از ورودی، از پارامتر 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());
}

بازیابی صفحه از طریق مسیر

اگر مسیر نسبی یک صفحه را در سایت گوگل می‌دانید، می‌توانید از پارامتر path برای دریافت آن صفحه خاص استفاده کنید. این مثال صفحه واقع در http://sites.google.com/ site / siteName /path/to/the/page را برمی‌گرداند:

ContentQuery query = new ContentQuery(new URL(buildContentFeedUrl()));
query.setPath("/path/to/the/page");
ContentFeed contentFeed = client.getFeed(query, ContentFeed.class);
for (BaseContentEntry<?> entry : contentFeed.getEntries()) {
  System.out.println(" title: " + entry.getTitle().getPlainText());
}

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

اگر شناسه‌ی ورودی محتوای یک صفحه را می‌دانید (مثلاً "1234567890" در مثال زیر)، می‌توانید از پارامتر parent برای دریافت تمام ورودی‌های فرزند آن (در صورت وجود) استفاده کنید:

ContentQuery query = new ContentQuery(new URL(buildContentFeedUrl()));
query.setParent("1234567890");
ContentFeed contentFeed = client.getFeed(query, ContentFeed.class);

برای پارامترهای اضافی، به راهنمای مرجع مراجعه کنید.

بازگشت به بالا



ایجاد محتوا

توجه: قبل از ایجاد محتوا برای سایت، مطمئن شوید که سایت خود را در کلاینت تنظیم کرده‌اید.
client.site = "siteName";

محتوای جدید (صفحات وب، صفحات فهرست، صفحات فایل کابینت، صفحات اعلان و غیره) را می‌توان با ارسال یک HTTP POST به فید محتوا ایجاد کرد:

https://sites.google.com/feeds/content/site/siteName

برای فهرستی از انواع گره‌های پشتیبانی، به پارامتر kind در راهنمای مرجع مراجعه کنید.

ایجاد آیتم‌ها/صفحات جدید

این مثال یک webpage جدید در زیر لایه بالای سایت ایجاد می‌کند، مقداری XHTML برای بدنه صفحه در نظر می‌گیرد و عنوان عنوان را روی «عنوان صفحه وب جدید» تنظیم می‌کند:

private void setContentBlob(BaseContentEntry<?> entry, String pageContent) {
  XmlBlob xml = new XmlBlob();
  xml.setBlob(pageContent);
  entry.setContent(new XhtmlTextConstruct(xml));
}

public WebPageEntry createWebPage(String title, String content)
    throws MalformedURLException, IOException, ServiceException {
  WebPageEntry entry = new WebPageEntry();
  entry.setTitle(new PlainTextConstruct(title));

  setContentBlob(entry, content); // Entry's HTML content

  return client.insert(new URL(buildContentFeedUrl()), entry);
}

WebPageEntry createdEntry = createWebPage("New Webpage Title", "<b>HTML content</b>");
System.out.println("Created! View at " + createdEntry.getHtmlLink().getHref());

اگر درخواست موفقیت‌آمیز باشد، createdEntry حاوی یک کپی از ورودی ایجاد شده در سرور خواهد بود.

ایجاد آیتم‌ها/صفحات تحت مسیرهای URL سفارشی

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

این مثال یک صفحه جدید filecabinet با عنوان «ذخیره‌سازی فایل» ایجاد می‌کند، اما صفحه را با آدرس 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 یک صفحه استفاده می‌کند:

  1. <sites:pageName> در صورت وجود. باید شرایط az, AZ, 0-9, -, _ را برآورده کند.
  2. <atom:title> ، اگر pageName وجود نداشته باشد، نباید تهی باشد. نرمال‌سازی به معنای حذف و تبدیل فاصله‌های خالی به '-' و حذف کاراکترهایی است که az, AZ, 0-9, -, _ مطابقت ندارند.

ایجاد زیرصفحه‌ها

برای ایجاد زیرصفحه‌ها (فرزندان) در زیر صفحه والد، باید لینک والد را در ورودی تنظیم کنید. ویژگی href لینک را به لینک خود گره والد اختصاص دهید.

public AnnouncementEntry postAnnouncement(String title, String content, AnnouncementsPageEntry parentPage)
    throws MalformedURLException, IOException, ServiceException {
  AnnouncementEntry entry = new AnnouncementEntry();
  entry.setTitle(new PlainTextConstruct(title));

  setContentBlob(entry, content); // Entry's HTML content

  // Set the entry's parent link to create the announcement under that page.
  entry.addLink(SitesLink.Rel.PARENT, Link.Type.ATOM, parentPage.getSelfLink().getHref());

  return client.insert(new URL(buildContentFeedUrl()), entry);
}

ContentFeed contentFeed = client.getFeed(new URL(buildContentFeedUrl() + "?kind=announcementspage"), ContentFeed.class);

AnnouncementEntry createdEntry = postAnnouncement("Party!!", "My place, this weekend", contentFeed.getEntries().get(0));
System.out.println("New post by " + createdEntry.getAuthors().get(0).getName());

مثال بالا یک announcement جدید در زیر اولین صفحه اعلانات موجود در فید محتوای کاربر ایجاد می‌کند. عنوان اعلان روی «مهمانی!!» و محتوای آن روی «جای من، این آخر هفته» تنظیم شده است.

قالب‌های صفحه

ایجاد قالب‌های صفحه

فرآیند ایجاد یک الگوی صفحه مشابه ایجاد آیتم‌ها/صفحات جدید و ایجاد زیرصفحه‌ها است. تفاوت در اضافه کردن category با عبارت و برچسب تنظیم شده به ترتیب روی 'http://schemas.google.com/g/2005#template' و 'template' است.

این مثال یک قالب webpage جدید ایجاد می‌کند.

// The template webpage entry.
WebPageEntry entry = new WebPageEntry();

// Set title and content.
entry.setTitle(new PlainTextConstruct("Page template title"));
XmlBlob xml = new XmlBlob();
xml.setBlob("Content for page template");
entry.setContent(new XhtmlTextConstruct(xml));

// Set the template category
Category TEMPLATE_CATEGORY = new Category(TemplateCategory.Scheme.LABELS,
    TemplateCategory.Term.TEMPLATE, TemplateCategory.Label.TEMPLATE);
entry.getCategories().add(TEMPLATE_CATEGORY);

// Insert the template webpage entry.
WebPageEntry createdEntry = client.insert(new URL("https://sites.google.com/feeds/content/site/siteName"), entry);

ایجاد صفحات از یک الگو

مشابه ایجاد قالب‌های صفحه، می‌توانید با قرار دادن یک <link> با rel='http://schemas.google.com/sites/2008#template' که به پیوند خودِ یک قالب صفحه اشاره می‌کند، یک صفحه جدید از یک قالب ایجاد کنید.

این مثال یک الگوی جدید filecabinet ایجاد می‌کند و سپس یک صفحه جدید filecabinet از آن الگو نمونه‌سازی می‌کند.

URL feedUrl = new URL("https://sites.google.com/feeds/content/site/siteName");

// 1. Create file cabinet page template
FileCabinetPageEntry inputTemplateEntry = new FileCabinetPageEntry();
inputTemplateEntry.setTitle(new PlainTextConstruct("File cabinet page template title"));
XmlBlob xml = new XmlBlob();
xml.setBlob("Content for page template");
inputTemplateEntry.setContent(new XhtmlTextConstruct(xml));

// Set the template category
Category TEMPLATE_CATEGORY = new Category(TemplateCategory.Scheme.LABELS,
    TemplateCategory.Term.TEMPLATE, TemplateCategory.Label.TEMPLATE);
inputTemplateEntry.getCategories().add(TEMPLATE_CATEGORY);

// 2. Create file cabinet page template instance
FileCabinetPageEntry templateEntry = client.insert(feedUrl, inputTemplateEntry);

// Specify link to the page template
FileCabinetPageEntry templateInstanceEntry = new FileCabinetPageEntry();
templateInstanceEntry.setTitle(new PlainTextConstruct("File cabinet template instance"));
templateInstanceEntry.addLink(new Link(SitesLink.Rel.TEMPLATE, Link.Type.ATOM, templateEntry.getSelfLink().getHref()));

FileCabinetPageEntry createdFileCabinetFromTemplate =  client.insert(feedUrl, templateInstanceEntry);

نکته : علیرغم اینکه یک الگو یک <category> تعریف می‌کند، اضافه کردن آن به ورودی شما همچنان الزامی است. همچنین توجه داشته باشید که اگر عنصر <content> را اضافه کنید، سرور آن را رد خواهد کرد.

آپلود فایل‌ها

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

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

پیوست‌های وب

پیوست‌های وب نوع خاصی از پیوست‌ها هستند. اساساً، آن‌ها لینک‌هایی به فایل‌های دیگر در وب هستند که می‌توانید به فهرست‌های فایل کابینت خود اضافه کنید. این ویژگی مشابه روش آپلود «افزودن فایل از طریق URL» در رابط کاربری سایت‌های گوگل است.

توجه : پیوست‌های وب فقط می‌توانند در یک فایل کابینت ایجاد شوند. آنها را نمی‌توان در انواع دیگر صفحات بارگذاری کرد.

این مثال یک WebAttachmentEntry را در اولین FileCabinetPageEntry موجود در فید محتوای کاربر ایجاد می‌کند. عنوان و توضیحات (اختیاری) آن به ترتیب روی «GoogleLogo» و «nice colors» تنظیم شده‌اند.

public WebAttachmentEntry uploadWebAttachment(String contentUrl, FileCabinetPageEntry filecabinet,
    String title, String description) throws MalformedURLException, IOException, ServiceException {
  MediaContent content = new MediaContent();
  content.setUri(contentUrl);

  WebAttachmentEntry webAttachment = new WebAttachmentEntry();
  webAttachment.setTitle(new PlainTextConstruct(title));
  webAttachment.setSummary(new PlainTextConstruct(description));
  webAttachment.setContent(content);
  webAttachment.addLink(SitesLink.Rel.PARENT, Link.Type.ATOM,
      filecabinet.getSelfLink().getHref());

  return client.insert(new URL(buildContentFeedUrl()), webAttachment);
}

ContentFeed contentFeed = client.getFeed(new URL(buildContentFeedUrl() + "?kind=filecabinet"), ContentFeed.class);
FileCabinetPageEntry parentPage = contentFeed.getEntries(FileCabinetPageEntry.class).get(0);

WebAttachmentEntry webAttachment =
    uploadWebAttachment("http://www.google.com/images/logo.gif", parentPage, "Google's Logo", "nice colors");
System.out.println("Web attachment created!");

POST لینکی در فایل کابینت کاربر ایجاد می‌کند که به تصویر 'http://www.google.com/images/logo.gif' اشاره دارد.

بازگشت به بالا



به‌روزرسانی محتوا

به‌روزرسانی فراداده و/یا محتوای html یک صفحه

فراداده‌ها (عنوان، نام صفحه و غیره) و محتوای صفحه از هر نوع BaseContentEntry را می‌توان با استفاده از متد update() مربوط به ورودی ویرایش کرد. این متد یک درخواست HTTP PUT به لینک edit ورودی ارسال می‌کند.

در زیر مثالی از به‌روزرسانی ListPageEntry با تغییرات زیر آمده است:

  • عنوان به «عنوان به‌روزرسانی‌شده» تغییر یافته است
  • محتوای HTML صفحه به «<p>محتوای HTML به‌روزرسانی‌شده</p>» به‌روزرسانی می‌شود.
  • عنوان ستون اول لیست به «مالک» تغییر می‌کند.
ContentFeed contentFeed = client.getFeed(
    new URL(buildContentFeedUrl() + "?kind=listpage"), ContentFeed.class);
ListPageEntry listPage = contentFeed.getEntries(ListPageEntry.class).get(0); // Update first list page found

// Update title
listPage.setTitle(new PlainTextConstruct("Updated Title"));

// Update HTML content
XmlBlob xml = new XmlBlob();
xml.setBlob("<p>Updated HTML Content</p>");
listPage.setContent(new XhtmlTextConstruct(xml));

// Change first column's heading
listPage.getData().getColumns().get(0).setName("Owner");

// listPage.setPageName(new PageName("new-page-path"));  // You can also change the page's URL path

ListPageEntry updatedEntry = listPage.update();

System.out.println("ListPage updated!");

به‌روزرسانی محتوای فایل پیوست

برای AttachmentEntry ، می‌توانید محتوا را با تنظیم MediaSource ورودی و سپس استفاده از متد updateMedia(boolean) آن ورودی، به‌روزرسانی کنید.

این مثال محتوای یک پیوست موجود را به‌روزرسانی می‌کند:

public AttachmentEntry updateFile(AttachmentEntry entry, File newFile)
    throws IOException, ServiceException {
  // See Uploading Attachments for the definition of mediaTypes.
  entry.setMediaSource(new MediaFileSource(newFile, mediaTypes.getContentType(newFile)));
  return entry.updateMedia(false);
}

این مثال یک درخواست HTTP PUT به لینک edit-media ورودی ارسال می‌کند. AttachmentEntry برگردانده شده شامل محتوای به‌روزرسانی شده خواهد بود.

به‌روزرسانی فراداده + محتوای پیوست

شما می‌توانید با استفاده از متد updateMedia() فراداده‌های یک فایل پیوست و محتوای آن را در یک فراخوانی واحد به‌روزرسانی کنید. می‌توانید فقط محتوای فایل، فراداده‌ها یا هر دو را به‌روزرسانی کنید.

این مثال عنوان پیوست را به 'New Title' تغییر می‌دهد، توضیحات آن را به‌روزرسانی می‌کند و محتوای فایل آن را با یک فایل 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");

بازگشت به بالا



حذف محتوا

برای حذف یک صفحه یا آیتم از سایت گوگل، ابتدا ورودی محتوا را بازیابی کنید، سپس تابع delete() مربوط به آن ورودی را فراخوانی کنید.

entry.delete();

همچنین می‌توانید با ارسال لینک edit ورودی و مقدار ETag به متد delete() کلاس سرویس، از آن استفاده کنید:

client.delete(entry.getEditLink().getHref(), "*"); // Note: using "*" may overwrite another client's changes.

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

بازگشت به بالا



دانلود پیوست‌ها

برای دانلود یک AttachmentEntry ، یک درخواست HTTP GET به لینک src محتوای ورودی ارسال کنید.

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

نقش‌ها

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

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

محدوده‌ها

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

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

نکته : دامنه‌ها نمی‌توانند مقدار gAcl:role را روی دسترسی "owner" تنظیم کنند، آنها فقط می‌توانند خواننده یا نویسنده باشند.

بازیابی فید 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 فعال باشد و غیره).

برای اشتراک‌گذاری یک سایت گوگل با استفاده از 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» مراجعه کنید.

اشتراک‌گذاری در سطح گروه و دامنه

مشابه اشتراک‌گذاری سایت با یک کاربر ، می‌توانید سایتی را در یک گروه گوگل یا دامنه G Suite به اشتراک بگذارید.

اشتراک‌گذاری در یک آدرس ایمیل گروهی:

AclScope scope = new AclScope(AclScope.Type.GROUP, "group_name@example.com");

اشتراک‌گذاری در کل یک دامنه:

AclScope scope = new AclScope(AclScope.Type.DOMAIN, "example.com");

اشتراک‌گذاری در سطح دامنه فقط برای دامنه‌های G Suite و فقط برای دامنه‌ای که سایت در آن میزبانی می‌شود، پشتیبانی می‌شود. برای مثال، http://sites.google.com/a/domain1.com/siteA فقط می‌تواند کل سایت را با domain1.com به اشتراک بگذارد، نه با domain2.com. سایت‌هایی که در دامنه G Suite میزبانی نمی‌شوند (مثلاً http://sites.google.com/site/siteB) نمی‌توانند دامنه‌ها را دعوت کنند.

اصلاح مجوزهای اشتراک‌گذاری

برای دسترسی به یک مجوز اشتراک‌گذاری موجود در یک سایت، ابتدا AclEntry مورد نظر را دریافت کنید، مجوز را به دلخواه تغییر دهید و سپس متد update() مربوط به AclEntry را برای تغییر ACL روی سرور فراخوانی کنید.

این مثال، مثال aclEntry قبلی ما از بخش اشتراک‌گذاری سایت را با به‌روزرسانی 'user@example.com' به عنوان یک writer (همکار) اصلاح می‌کند:

aclEntry.setRole(new AclRole("writer"));
AclEntry updatedAclEntry = aclEntry.update();

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

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

حذف مجوزهای اشتراک‌گذاری

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

aclEntry.delete();

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

برای اطلاعات بیشتر در مورد ETag ها، به راهنمای مرجع 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 مشابه با ETag مشخص شده توسط شما است یا خیر. اگر ETag ها مطابقت داشته باشند، آیتم تغییر نکرده است و سرور یا خطای HTTP 304 NotModifiedException را برمی‌گرداند که منجر به بروز خطا می‌شود.

اگر ETag ها مطابقت نداشته باشند، یعنی آیتم از آخرین باری که درخواست کرده‌اید تغییر کرده است و سرور آیتم را برمی‌گرداند.

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

بازگشت به بالا