مهم: این سند قبل از سال 2012 نوشته شده است. گزینه های احراز هویت شرح داده شده در این سند (OAuth 1.0، AuthSub، و ClientLogin) از 20 آوریل 2012 به طور رسمی منسوخ شده اند و دیگر در دسترس نیستند. ما شما را تشویق می کنیم که در اسرع وقت به OAuth 2.0 مهاجرت کنید.
Google Sites Data API به برنامه های کاربردی سرویس گیرنده اجازه می دهد تا به محتوای یک سایت Google دسترسی داشته باشند، منتشر کنند، و آن را تغییر دهند. برنامه مشتری شما همچنین میتواند فهرستی از فعالیتهای اخیر، واکشی سابقه بازبینی و دانلود پیوستها را درخواست کند.
این راهنما علاوه بر ارائه پیشزمینهای در مورد قابلیتهای Sites Data API، مثالهایی برای تعامل با API با استفاده از کتابخانه سرویس گیرنده جاوا ارائه میدهد. برای راهنمایی در تنظیم کتابخانه سرویس گیرنده، به شروع به کار با کتابخانه Google Data Java Client مراجعه کنید. اگر علاقه مند به درک بیشتر در مورد پروتکل اساسی هستید که توسط کتابخانه سرویس گیرنده جاوا برای تعامل با Sites API کلاسیک استفاده می شود، لطفاً راهنمای پروتکل را ببینید.
مخاطب
این سند برای توسعه دهندگانی در نظر گرفته شده است که می خواهند برنامه های مشتری را بنویسند که با استفاده از کتابخانه Google Data Java Client با Google Sites تعامل دارند.
شروع کردن
Google Sites از حسابهای Google یا حسابهای G Suite برای احراز هویت استفاده میکند. اگر از قبل یک حساب کاربری دارید، همه چیز آماده است. در غیر این صورت، می توانید یک حساب کاربری جدید ایجاد کنید .
نصب کتابخانه
برای راهنمایی در راهاندازی و نصب کتابخانه سرویس گیرنده، شروع به کار با Google Data Java Client Library را ببینید. اگر از Eclipse استفاده می کنید، آن مقاله همچنین نحوه راه اندازی پروژه خود را با استفاده از افزونه Google Data APIs Eclipse توضیح می دهد. در اینجا چیزی است که برای شروع نیاز دارید:
- جاوا 1.5 یا بالاتر را نصب کنید
- دانلود کتابخانه مشتری (آخرین نسخه
gdata-src.java.zip
) - لیست وابستگی ها را دانلود کنید
- دانلود نمونه برنامه ها (آخرین نسخه
gdata-samples.java.zip
)
پس از نصب jars، باید موارد زیر را در پروژه خود بگنجانید:
-
java/lib/gdata-sites-2.0.jar
- نسخه 2.0 در اینجا برای نسخه 1.4 Sites API کلاسیک در نظر گرفته شده است. -
java/lib/gdata-core-1.0.jar
-
java/lib/gdata-client-1.0.jar
-
java/lib/gdata-spreadsheet-3.0.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
به کاربر اجازه می دهد تا تعدادی عملیات را انجام دهد که نحوه استفاده از Sites API کلاسیک را نشان می دهد.
توجه داشته باشید، برای اجرای نمونه باید java/sample/util/lib/sample-util.jar
را وارد کنید.
شروع پروژه خودتان
نکته : برای راهاندازی سریع با افزونه Eclipse، مقاله استفاده از Eclipse با Google Data API را ببینید.
بسته به نیاز برنامه شما، به چندین واردات نیاز دارید. توصیه می کنیم با واردات زیر شروع کنید:
import com.google.gdata.client.*; import com.google.gdata.client.sites.*; import com.google.gdata.data.*; import com.google.gdata.data.acl.*; import com.google.gdata.data.media.*; import com.google.gdata.data.sites.*; import com.google.gdata.data.spreadsheet.*; // If working with listpages / listitems import com.google.gdata.util.*;
در مرحله بعد، شما همچنین باید یک شی SitesService
را تنظیم کنید، که نشان دهنده اتصال مشتری به Sites API کلاسیک است:
SitesService client = new SitesService("yourCo-yourAppName-v1");
آرگومان applicationName
باید از فرمت پیروی کند: company-applicationname-version
. این پارامتر برای اهداف ورود به سیستم استفاده می شود.
توجه : بقیه این راهنما فرض می کند که شما یک SitesService
در client
متغیر ایجاد کرده اید.
احراز هویت با Sites API کلاسیک
کتابخانه سرویس گیرنده جاوا می تواند برای کار با فیدهای عمومی یا خصوصی استفاده شود. Sites Data API بسته به مجوزهای Sites و عملیاتی که میخواهید انجام دهید، دسترسی به فیدهای خصوصی و عمومی را فراهم میکند. برای مثال، ممکن است بتوانید فید محتوای یک سایت عمومی را بخوانید اما بهروزرسانی آن را انجام ندهید - چیزی که نیاز به یک کلاینت تأیید شده دارد. این را می توان از طریق تأیید اعتبار نام کاربری/گذرواژه ClientLogin ، AuthSub یا OAuth انجام داد.
لطفاً برای اطلاعات بیشتر در مورد AuthSub، OAuth و ClientLogin به نمای کلی احراز هویت Google Data APIs مراجعه کنید.
نکته : API از SSL (HTTPS) پشتیبانی می کند. اگر از AuthSub/OAuth استفاده میکنید، حتماً محدوده http s ://sites.google.com/feeds/
را برای درخواست فید از طریق SSL مشخص کنید. همچنین توجه داشته باشید که برای دامنههای G Suite، تنظیمات «نیاز به SSL» در کنترل پنل اداری توسط API رعایت میشود. شما می توانید با فراخوانی client.useSsl();
.
AuthSub برای برنامه های کاربردی وب
AuthSub Authentication برای برنامه های کاربردی وب باید توسط برنامه های مشتری که نیاز به احراز هویت کاربران خود در حساب های Google دارند، استفاده شود. اپراتور نیازی به دسترسی به نام کاربری و رمز عبور کاربر Google Sites ندارد - فقط یک نشانه AuthSub مورد نیاز است.
دستورالعملهای ادغام AuthSub را در برنامه وب خود مشاهده کنید
درخواست یک توکن یکبار مصرف
هنگامی که کاربر برای اولین بار از برنامه شما بازدید می کند، باید احراز هویت کند. به طور معمول، توسعهدهندگان متن و پیوندی را چاپ میکنند که کاربر را به صفحه تأیید AuthSub هدایت میکند تا کاربر را احراز هویت کند و درخواست دسترسی به اسنادش را بدهد. کتابخانه سرویس گیرنده Google Data Java تابعی را برای تولید این URL ارائه می دهد. کد زیر پیوندی را به صفحه AuthSubRequest تنظیم می کند.
import com.google.gdata.client.*; String nextUrl = "http://www.example.com/welcome.jsp"; String scope = "https://sites.google.com/feeds/"; boolean secure = true; boolean session = true; String authSubUrl = AuthSubUtil.getRequestUrl(nextUrl, scope, secure, session);
اگر می خواهید کاربران را در دامنه میزبانی شده G Suite خود احراز هویت کنید:
import com.google.gdata.client.*; String hostedDomain = "example.com"; String nextUrl = "http://www.example.com/welcome.jsp"; String scope = "https://sites.google.com/feeds/"; // SSL is also supported boolean secure = true; boolean session = true; String authSubUrl = AuthSubUtil.getRequestUrl(hostedDomain, nextUrl, scope, secure, session);
متد getRequestUrl()
چندین پارامتر (مرتبط با پارامترهای پرس و جو مورد استفاده توسط AuthSubRequest handler) می گیرد:
- URL بعدی - URL که گوگل پس از ورود کاربر به حساب خود و اعطای دسترسی، به آن تغییر مسیر می دهد.
http://www.example.com/welcome.jsp
در مثال بالا - محدوده —
https://sites.google.com/feeds/
در مثال بالا - یک بولی برای نشان دادن اینکه آیا توکن در حالت ثبت استفاده خواهد شد یا خیر. در مثال بالا
false
- یک بولی دوم برای نشان دادن اینکه آیا توکن بعداً با یک توکن جلسه مبادله خواهد شد یا خیر. در مثال بالا
true
ارتقاء به یک نشانه جلسه
استفاده از AuthSub با Google Data API Client Libraries را ببینید.
بازیابی اطلاعات مربوط به نشانه جلسه
استفاده از AuthSub با Google Data API Client Libraries را ببینید.
لغو نشانه جلسه
استفاده از AuthSub با Google Data API Client Libraries را ببینید.
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 در برنامههای جاوا، به استفاده از ClientLogin با کتابخانههای Google Data API Client مراجعه کنید.
فید سایت
از فید سایت می توان برای فهرست کردن سایت های Google که یک کاربر مالک آن است یا مجوز مشاهده آنها را دارد استفاده کرد. همچنین می توان از آن برای تغییر نام یک سایت موجود استفاده کرد. برای دامنههای G Suite، میتوان از آن برای ایجاد و/یا کپی کل سایت استفاده کرد.
سایت های فهرست بندی
برای پرس و جو از فید سایت، یک HTTP GET
به URL فید سایت ارسال کنید:
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(""); } }
قطعه بالا عنوان سایت، نام سایت و موضوع سایت را چاپ می کند. دریافتکنندههای دیگر برای دسترسی به ویژگیهای اضافی در فید در دسترس هستند.
ایجاد سایت های جدید
توجه : این ویژگی فقط برای دامنههای G Suite در دسترس است.
سایت های جدید را می توان با ایجاد یک SiteEntry
جدید و فراخوانی متد insert()
کلاینت در فید سایت فراهم کرد.
این مثال یک سایت کاملاً جدید با موضوع 'slate' (تنظیم اختیاری) ایجاد می کند و نام سایت (الزامی) و توضیحات (اختیاری) را ارائه می دهد:
public String getSiteFeedUrl() { String domain = "example.com"; return "https://sites.google.com/feeds/site/" + domain + "/"; } public SiteEntry createSite(String title, String summary, String theme, String tag) throws MalformedURLException, IOException, ServiceException { SiteEntry entry = new SiteEntry(); entry.setTitle(new PlainTextConstruct(title)); entry.setSummary(new PlainTextConstruct(summary)); Theme tt = new Theme(); tt.setValue(theme); entry.setTheme(tt); entry.getCategories().add(new Category(TagCategory.Scheme.TAG, tag, null)); return client.insert(new URL(getSiteFeedUrl()), entry); } SiteEntry newSiteEntry = createSite("My Site Title", "summary for site", "slate", "tag");
درخواست بالا یک سایت جدید تحت دامنه G Suite example.com
ایجاد میکند. بنابراین، URL سایت https://sites.google.com/a/example.com/my-site-title خواهد بود.
اگر سایت با موفقیت ایجاد شود، سرور با یک شی SiteEntry
، پر از عناصر اضافه شده توسط سرور پاسخ می دهد: پیوند به سایت، پیوند به فید acl سایت، نام سایت، عنوان، خلاصه، و غیره. .
کپی کردن یک سایت
توجه : این ویژگی فقط برای دامنههای G Suite در دسترس است.
کپی کردن یک سایت مشابه ایجاد یک سایت جدید است. تفاوت این است که شما باید یک لینک در SiteEntry
جدید خود تنظیم کنید که شامل لینک خود سایت برای تکرار باشد. در اینجا نمونه ای از کپی کردن سایت ایجاد شده در بخش ایجاد سایت های جدید آورده شده است:
public SiteEntry copySite(String title, String summary, String sourceHref) throws MalformedURLException, IOException, ServiceException { SiteEntry entry = new SiteEntry(); entry.setTitle(new PlainTextConstruct(title)); entry.setSummary(new PlainTextConstruct(summary)); entry.addLink(SitesLink.Rel.SOURCE, Link.Type.ATOM, sourceHref); return client.insert(new URL(getSiteFeedUrl()), entry); } String sourceHref = newSiteEntry.getLink(SitesLink.Rel.SOURCE, Link.Type.ATOM).getHref(); SiteEntry myTwin = copySite("Duplicate Site", "A copy", sourceHref);
نکات مهم:
- فقط سایت ها و قالب های سایتی که کاربر احراز هویت شده متعلق به آنهاست قابل کپی هستند.
- یک قالب سایت نیز قابل کپی است. اگر تنظیم "انتشار این سایت به عنوان الگو" در صفحه تنظیمات Google Sites علامت زده شود، یک سایت یک الگو است.
- میتوانید یک سایت را از دامنه دیگری کپی کنید، تا زمانی که به عنوان مالک در سایت منبع فهرست شده باشید.
به روز رسانی ابرداده یک سایت
برای تغییر نام یک سایت، تغییر موضوع، تگ دسته یا خلاصه آن، باید ابتدا SiteEntry
حاوی سایت مورد نظر را واکشی کنید، یک یا چند ویژگی را اصلاح کنید و سپس متد SiteEntry
's update()
را فراخوانی کنید. این مثال تم سایت قبلی را تغییر می دهد و نام سایت را تغییر می دهد:
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
را هنگام کار با نگاشت آدرس وب مشخص کنند. اگر پارامتر وجود نداشته باشد، webAddressMapping
s در ورودی های سایت (GET) برگردانده نمی شود یا هنگام به روز رسانی/حذف نگاشت (PUT) از یک ورودی در نظر گرفته نمی شود.
برای افزودن، بهروزرسانی یا حذف یک نقشه، به سادگی چنین پیوندی را هنگام ایجاد سایتهای جدید یا بهروزرسانی ابردادههای یک سایت مشخص، تغییر یا حذف کنید. پارامتر with-mappings=true
باید در URI فید سایت گنجانده شود. توجه: برای بهروزرسانی نگاشتهای آدرس، باید مدیر سایت یا سرپرست دامنه در مورد سایت میزبان G Suite باشید.
به عنوان مثال، درخواست زیر نقشه http://www.mysitemapping.com
را به http://www.my-new-sitemapping.com
به روز می کند و با کنار گذاشتن پیوند، http://www.mysitemapping2.com
را حذف می کند. از مدخل:
SiteEntry entry = client.getEntry(new URL("https://sites.google.com/feeds/site/site/siteName?with-mappings=true"), SiteEntry.class); // Modify mappings (remove all mappings, add some of them again, add modified mappings) entry.removeLinks(SitesLink.Rel.WEBADDRESSMAPPING, Link.Type.HTML); entry.addLink(SitesLink.Rel.WEBADDRESSMAPPING, Link.Type.HTML, "http://www.my-new-sitemapping.com"); // Update the entry with the mappings. entry.update();
توجه داشته باشید، نگاشت آدرس وب نیز می تواند در زمان ایجاد/کپی کردن یک سایت مشخص شود.
فید فعالیت
با واکشی فید فعالیت می توانید فعالیت (تغییرات) اخیر یک سایت را واکشی کنید. هر ورودی در فید فعالیت حاوی اطلاعاتی در مورد تغییری است که در سایت ایجاد شده است.
برای درخواست فید فعالیت، یک HTTP GET
به نشانی اینترنتی فید فعالیت ارسال کنید:
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 احراز هویت کند. به احراز هویت در سرویس سایت ها مراجعه کنید.
فید تجدید نظر
برای واکشی تاریخچه ویرایش برای هر ورودی محتوا، یک HTTP GET
به پیوند بازبینی ورودی ارسال کنید:
https://sites.google.com/feeds/revision/site/siteName/CONTENT_ENTRY_ID
این مثال فید محتوا را پرس و جو می کند و سپس فید بازبینی را برای اولین ورودی محتوا واکشی می کند:
ContentFeed contentFeed = client.getFeed(new URL(buildContentFeedUrl()), ContentFeed.class); URL revisionFeedUrl = new URL(contentFeed.getEntries().get(0).getRevisionLink().getHref()); // use first entry public void getRevisionFeed(String revisionFeedUrl) throws IOException, ServiceException { RevisionFeed revisionFeed = client.getFeed(revisionFeedUrl, RevisionFeed.class); for (BaseContentEntry<?> entry : revisionFeed.getEntries()){ System.out.println(entry.getTitle().getPlainText()); System.out.println(" updated: " + entry.getUpdated().toUiString() + " by " + entry.getAuthors().get(0).getEmail()); System.out.println(" revision #: " + entry.getRevision().getValue()); } }
توجه: دسترسی به این فید مستلزم این است که شما یک همکار یا مالک سایت باشید. مشتری شما باید با استفاده از یک نشانه AuthSub، OAuth یا ClientLogin احراز هویت کند. به احراز هویت در سرویس سایت ها مراجعه کنید.
فید محتوا
بازیابی فید محتوا
فید محتوا آخرین محتوای یک سایت را فهرست می کند. با ارسال HTTP GET
به URL فید محتوا می توان به آن دسترسی داشت:
https://sites.google.com/feeds/content/site/siteName
پارامتر خوراک | توضیحات |
---|---|
site | " site " یا دامنه دامنه میزبانی شده G Suite شما (به عنوان مثال example.com ). |
siteName | نام فضای وب سایت شما؛ در URL سایت یافت می شود (به عنوان مثال mySite ). |
نمونه ای از واکشی فید محتوا:
public String buildContentFeedUrl() { String domain = "site"; // OR if the Site is hosted on G Suite, your domain (e.g. example.com) String siteName = "mySite"; return "https://sites.google.com/feeds/content/" + domain + "/" + siteName + "/"; } ContentFeed contentFeed = client.getFeed(new URL(buildContentFeedUrl()), ContentFeed.class);
contentFeed
حاصل یک شی ContentFeed
است که حاوی پاسخ سرور است. هر ورودی contentFeed
نمایانگر یک صفحه یا آیتم متفاوت در سایت کاربر است. ContentFeed
شامل انواع مختلفی از اشیاء خواهد بود که همگی از BaseContentEntry
به ارث رسیده اند: ListItemEntry
، ListPageEntry
، AttachmentEntry
، WebAttachmentEntry
، FileCabinetPageEntry
، AnnouncementsPageEntry
، AnnouncementEntry
WebPageEntry
CommentEntry
.
در اینجا نمونه ای از فهرست کردن انواع مختلف ورودی ها در ContentFeed
آورده شده است. هر نوع ورودی دارای ویژگی های متفاوتی است، اما همه در اینجا چاپ نمی شوند.
public String getContentBlob(BaseContentEntry<?> entry) { return ((XhtmlTextConstruct) entry.getTextContent().getContent()).getXhtml().getBlob(); } // Extracts an entry's numeric ID. private String getEntryId(String selfLink) { return selfLink.substring(selfLink.lastIndexOf("/") + 1); } public void printContentEntries(ContentFeed contentFeed) { System.out.println("Listing all WebPageEntry:"); for (WebPageEntry entry : contentFeed.getEntries(WebPageEntry.class)) { System.out.println(" title: " + entry.getTitle().getPlainText()); System.out.println(" id: " + getEntryId(entry)); if (entry.getParentLink() != null) { System.out.println(" parent id: " + getEntryId(entry.getParentLink().getHref())); } System.out.println(" author: " + entry.getAuthors().get(0).getEmail()); System.out.println(" content: " + getContentBlob(entry)); } System.out.println("Listing all ListPageEntry:"); for (ListPageEntry entry : contentFeed.getEntries(ListPageEntry.class)) { System.out.println(" title: " + entry.getTitle().getPlainText()); System.out.println(" id: " + getEntryId(entry)); for (Column col : entry.getData().getColumns()) { System.out.print(" [" + col.getIndex() + "] " + col.getName() + "\t"); } } for (ListItemEntry entry : contentFeed.getEntries(ListItemEntry.class)) { for (Field field : entry.getFields()) { System.out.print(" [" + field.getIndex() + "] " + field.getValue() + "\t"); } System.out.println("\n"); } System.out.println("Listing all FileCabinetPageEntry:"); for (FileCabinetPageEntry entry : contentFeed.getEntries(FileCabinetPageEntry.class)) { System.out.println(" title: " + entry.getTitle().getPlainText()); System.out.println(" id: " + getEntryId(entry)); System.out.println(" content: " + getContentBlob(entry)); } System.out.println("Listing all CommentEntry:"); for (CommentEntry entry : contentFeed.getEntries(CommentEntry.class)) { System.out.println(" in-reply-to: " + entry.getInReplyTo().toString()); System.out.println(" content: " + getContentBlob(entry)); } System.out.println("Listing all AnnouncementsPageEntry:"); for (AnnouncementsPageEntry entry : contentFeed.getEntries(AnnouncementsPageEntry.class)) { System.out.println(" title: " + entry.getTitle().getPlainText()); System.out.println(" id: " + getEntryId(entry)); System.out.println(" content: " + getContentBlob(entry)); } System.out.println("Listing all AnnouncementEntry:"); for (AnnouncementEntry entry : contentFeed.getEntries(AnnouncementEntry.class)) { System.out.println(" title: " + entry.getTitle().getPlainText()); System.out.println(" id: " + getEntryId(entry)); if (entry.getParentLink() != null) { System.out.println(" parent id: " + getEntryId(entry.getParentLink().getHref())); } System.out.println(" draft?: " + entry.isDraft()); System.out.println(" content: " + getContentBlob(entry)); } System.out.println("Listing all AttachmentEntry:"); for (AttachmentEntry entry : contentFeed.getEntries(AttachmentEntry.class)) { System.out.println(" title: " + entry.getTitle().getPlainText()); System.out.println(" id: " + getEntryId(entry)); if (entry.getParentLink() != null) { System.out.println(" parent id: " + getEntryId(entry.getParentLink().getHref())); } if (entry.getSummary() != null) { System.out.println(" description: " + entry.getSummary().getPlainText()); } System.out.println(" revision: " + entry.getRevision().getValue()); MediaContent content = (MediaContent) entry.getContent(); System.out.println(" src: " + content.getUri()); System.out.println(" content type: " + content.getMimeType().getMediaType()); } System.out.println("Listing all WebAttachmentEntry:"); for (WebAttachmentEntry entry : contentFeed.getEntries(WebAttachmentEntry.class)) { System.out.println(" title: " + entry.getTitle().getPlainText()); System.out.println(" id: " + getEntryId(entry)); if (entry.getParentLink() != null) { System.out.println(" parent id: " + getEntryId(entry.getParentLink().getHref())); } if (entry.getSummary() != null) { System.out.println(" description: " + entry.getSummary().getPlainText()); } System.out.println(" src: " + ((MediaContent) entry.getContent()).getUri()); } }
توجه: این فید ممکن است نیاز به احراز هویت داشته باشد یا نباشد. بسته به مجوزهای اشتراک گذاری سایت. اگر سایت غیرعمومی است، مشتری شما باید با استفاده از یک نشانه AuthSub، OAuth یا ClientLogin احراز هویت کند. به احراز هویت در سرویس سایت ها مراجعه کنید.
نمونه پرس و جو فید محتوا
میتوانید فید محتوا را با استفاده از برخی از پارامترهای جستجوی استاندارد Google Data API و پارامترهای خاص Sites API کلاسیک جستجو کنید. برای اطلاعات بیشتر و فهرست کامل پارامترهای پشتیبانی شده، به راهنمای مرجع مراجعه کنید.
توجه : مثالهای این بخش از متد buildContentFeedUrl()
در بازیابی فید محتوا استفاده میکنند.
بازیابی انواع ورودی خاص
برای واکشی فقط نوع خاصی از ورودی، از پارامتر kind
استفاده کنید. این مثال فقط ورودی های attachment
را برمی گرداند:
ContentQuery query = new ContentQuery(new URL(buildContentFeedUrl())); query.setKind("webpage"); ContentFeed contentFeed = client.getFeed(query, ContentFeed.class); for (AttachmentEntry entry : contentFeed.getEntries(AttachmentEntry.class)) { System.out.println(entry.getTitle().getPlainText()); }
برای برگرداندن بیش از یک نوع ورودی، هر kind
با "،" جدا کنید. این مثال ورودی های filecabinet
و listpage
را برمی گرداند:
URL url = new URL(buildContentFeedUrl() + "?kind=filecabinet,listpage"); ContentFeed contentFeed = client.getFeed(url, ContentFeed.class); for (FileCabinetPageEntry entry : contentFeed.getEntries(FileCabinetPageEntry.class)) { System.out.println(" title: " + entry.getTitle().getPlainText()); } for (ListPageEntry entry : contentFeed.getEntries(ListPageEntry.class)) { System.out.println(" title: " + entry.getTitle().getPlainText()); }
بازیابی صفحه به مسیر
اگر مسیر نسبی یک صفحه را در سایت گوگل می دانید، می توانید از پارامتر path
برای واکشی آن صفحه خاص استفاده کنید. این مثال صفحه واقع در http://sites.google.com/ site / siteName /path/to/the/page
برمی گرداند:
ContentQuery query = new ContentQuery(new URL(buildContentFeedUrl())); query.setPath("/path/to/the/page"); ContentFeed contentFeed = client.getFeed(query, ContentFeed.class); for (BaseContentEntry<?> entry : contentFeed.getEntries()) { System.out.println(" title: " + entry.getTitle().getPlainText()); }
بازیابی همه ورودی های زیر یک صفحه والد
اگر شناسه ورودی محتوای یک صفحه را میدانید (مثلاً "1234567890" در مثال زیر)، میتوانید از پارامتر parent
برای واکشی همه ورودیهای فرزند آن (در صورت وجود) استفاده کنید:
ContentQuery query = new ContentQuery(new URL(buildContentFeedUrl())); query.setParent("1234567890"); ContentFeed contentFeed = client.getFeed(query, ContentFeed.class);
برای پارامترهای اضافی، به راهنمای مرجع مراجعه کنید.
ایجاد محتوا
توجه: قبل از ایجاد محتوا برای یک سایت، مطمئن شوید که سایت خود را در مشتری تنظیم کرده اید. client.site = "siteName";
محتوای جدید (صفحات وب، صفحات فهرست، صفحات کابینت فایل، صفحات اعلامیه و غیره) را می توان با ارسال یک HTTP POST
به فید محتوا ایجاد کرد:
https://sites.google.com/feeds/content/site/siteName
برای لیستی از انواع گره های پشتیبانی، به پارامتر kind
در راهنمای مرجع مراجعه کنید.
ایجاد آیتم ها / صفحات جدید
این مثال یک webpage
جدید در سطح بالای سایت ایجاد می کند، شامل مقداری XHTML برای بدنه صفحه می شود و عنوان عنوان را روی «عنوان صفحه وب جدید» تنظیم می کند:
private void setContentBlob(BaseContentEntry<?> entry, String pageContent) { XmlBlob xml = new XmlBlob(); xml.setBlob(pageContent); entry.setContent(new XhtmlTextConstruct(xml)); } public WebPageEntry createWebPage(String title, String content) throws MalformedURLException, IOException, ServiceException { WebPageEntry entry = new WebPageEntry(); entry.setTitle(new PlainTextConstruct(title)); setContentBlob(entry, content); // Entry's HTML content return client.insert(new URL(buildContentFeedUrl()), entry); } WebPageEntry createdEntry = createWebPage("New Webpage Title", "<b>HTML content</b>"); System.out.println("Created! View at " + createdEntry.getHtmlLink().getHref());
در صورت موفقیت آمیز بودن درخواست، createdEntry
حاوی یک کپی از ورودی ایجاد شده در سرور خواهد بود.
ایجاد اقلام/صفحات تحت مسیرهای URL سفارشی
بهطور پیشفرض، مثال قبلی تحت نشانی اینترنتی http://sites.google.com/ site / siteName /new-webpage-title
ایجاد میشود و عنوان صفحه «عنوان صفحه وب جدید» دارد. یعنی <atom:title>
به عنوان new-webpage-title
برای URL عادی می شود. برای سفارشی کردن مسیر URL صفحه، می توانید عنصر <sites:pageName>
را تنظیم کنید.
این مثال یک صفحه filecabinet
جدید با عنوان «ذخیرهسازی فایل» ایجاد میکند، اما صفحه را تحت نشانی اینترنتی http://sites.google.com/ site / siteName /files
(بهجای http://sites.google.com/ site / siteName /file-storage
ایجاد میکند. http://sites.google.com/ site / siteName /file-storage
) با تعیین عنصر <sites:pageName>
.
public FileCabinetPageEntry createFileCabinetPage(String title, String content, String customPageName) throws MalformedURLException, IOException, ServiceException { FileCabinetPageEntry entry = new FileCabinetPageEntry(); entry.setTitle(new PlainTextConstruct(title)); setContentBlob(entry, content); // Entry's HTML content entry.setPageName(new PageName(customPageName)); // Upload to a custom page path return client.insert(new URL(buildContentFeedUrl()), entry); } FileCabinetPageEntry createdEntry = createFileCabinetPage("File Storage", "<b>HTML content</b>", "files"); System.out.println("Created! View at " + createdEntry.getHtmlLink().getHref());
سرور از قوانین اولویت زیر برای نامگذاری مسیر URL صفحه استفاده می کند:
-
<sites:pageName>
، در صورت وجود. بایدaz, AZ, 0-9, -, _
برآورده کند. - اگر pageName موجود نباشد،
<atom:title>
نباید تهی باشد. عادی سازی عبارت است از برش + کوچک کردن فضای سفید به "-" و حذف نویسه هایی که با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 است. ' و 'قالب'، به ترتیب.
این مثال یک الگوی 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
، دسته ای را با ویژگی «term» در نام پوشه قرار دهید. به عنوان مثال، این خط را در uploadAttachment()
اضافه کنید:
newAttachment.getCategories().add(new Category("http://schemas.google.com/sites/2008#folder", "FolderName"));
پیوست های وب
پیوست های وب انواع خاصی از پیوست ها هستند. در اصل، آنها پیوندهایی به فایل های دیگر در وب هستند که می توانید آنها را به لیست های کابینت فایل خود اضافه کنید. این ویژگی مشابه روش آپلود «افزودن فایل با URL» در رابط کاربری Google Sites است.
توجه : پیوست های وب را فقط می توان تحت یک کابینت فایل ایجاد کرد. آنها را نمی توان در انواع دیگر صفحات آپلود کرد.
این مثال یک WebAttachmentEntry
در زیر اولین FileCabinetPageEntry
موجود در فید محتوای کاربر ایجاد می کند. عنوان و توضیحات (اختیاری) آن به ترتیب روی «GoogleLogo» و «رنگهای زیبا» تنظیم شده است.
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 صفحه
فراداده (عنوان، pageName، و غیره) و محتوای صفحه از هر نوع BaseContentEntry
را می توان با استفاده از روش update()
ورودی ویرایش کرد. این یک درخواست HTTP PUT
را به پیوند edit
ورودی ارسال می کند.
در زیر نمونه ای از به روز رسانی ListPageEntry
با تغییرات زیر آورده شده است:
- عنوان به "عنوان به روز شده" تغییر یافته است
- محتوای HTML صفحه به "<p>محتوای HTML به روز شده</p>" به روز می شود
- عنوان ستون اول لیست به "مالک" تغییر یافته است.
ContentFeed contentFeed = client.getFeed( new URL(buildContentFeedUrl() + "?kind=listpage"), ContentFeed.class); ListPageEntry listPage = contentFeed.getEntries(ListPageEntry.class).get(0); // Update first list page found // Update title listPage.setTitle(new PlainTextConstruct("Updated Title")); // Update HTML content XmlBlob xml = new XmlBlob(); xml.setBlob("<p>Updated HTML Content</p>"); listPage.setContent(new XhtmlTextConstruct(xml)); // Change first column's heading listPage.getData().getColumns().get(0).setName("Owner"); // listPage.setPageName(new PageName("new-page-path")); // You can also change the page's URL path ListPageEntry updatedEntry = listPage.update(); System.out.println("ListPage updated!");
در حال به روز رسانی محتویات فایل پیوست
برای AttachmentEntry
، میتوانید با تنظیم MediaSource
ورودی و سپس با استفاده از روش updateMedia(boolean)
مدخل، محتوا را بهروزرسانی کنید.
این مثال محتوای یک پیوست موجود را به روز می کند:
public AttachmentEntry updateFile(AttachmentEntry entry, File newFile) throws IOException, ServiceException { // See Uploading Attachments for the definition of mediaTypes. entry.setMediaSource(new MediaFileSource(newFile, mediaTypes.getContentType(newFile))); return entry.updateMedia(false); }
مثال یک درخواست HTTP PUT
را به پیوند edit-media
ورودی می فرستد. AttachmentEntry
بازگشتی حاوی محتوای به روز شده است.
بهروزرسانی فراداده پیوست + محتوا
با استفاده از متد updateMedia()
میتوانید ابرداده پیوست و محتوای آن را در همان فراخوانی بهروزرسانی کنید. اگر می توانید فقط محتوای فایل، ابرداده یا هر دو را به روز کنید.
این مثال عنوان پیوست را به "عنوان جدید" تغییر می دهد، توضیحات آن را به روز می کند و محتوای فایل آن را با یک فایل .zip جدید جایگزین می کند. از آنجایی که درخواست حاوی محتوای فایل جدید است، از updateMedia()
AttachmentEntry
استفاده می شود.
public AttachmentEntry updateAttachment(AttachmentEntry entry, File newFile, String newTitle, String newDescription) throws IOException, ServiceException { // See Uploading Attachments for the definition of mediaTypes. entry.setMediaSource(new MediaFileSource(newFile, mediaTypes.getContentType(newFile))); entry.setTitle(new PlainTextConstruct(newTitle)); entry.setSummary(new PlainTextConstruct(newDescription)); return entry.updateMedia(true); } ContentFeed contentFeed = client.getFeed( new URL(buildContentFeedUrl() + "?kind=attachment&max-results=1"), ContentFeed.class); AttachmentEntry attachment = contentFeed.getEntries(AttachmentEntry.class).get(0); // Update first attachment found AttachmentEntry updatedAttachment = updateAttachment(attachment, new File("/path/to/file.zip"), "New Title", "better stuff");
حذف محتوا
برای حذف یک صفحه یا مورد از یک سایت Google، ابتدا ورودی محتوا را بازیابی کنید، سپس ورودی delete()
را فراخوانی کنید.
entry.delete();
همچنین میتوانید از متد delete()
کلاس سرویس با ارسال پیوند edit
ورودی و مقدار ETag استفاده کنید:
client.delete(entry.getEditLink().getHref(), "*"); // Note: using "*" may overwrite another client's changes.
اگر ورودی با موفقیت حذف شد، سرور با HTTP 200 OK
پاسخ می دهد.
دانلود پیوست ها
برای دانلود AttachmentEntry
، یک درخواست HTTP GET
را به پیوند src محتوای ورودی ارسال کنید.
این مثال اولین AttachmentEntry
یافت شده در فید محتوای کاربر را در دایرکتوری "/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
وجود دارد:
- خواننده - بیننده (معادل دسترسی فقط خواندنی).
- نویسنده - یک همکار (معادل دسترسی خواندن/نوشتن).
- مالک - معمولاً مدیر سایت (معادل دسترسی خواندن/نوشتن).
محدوده ها
عنصر scope نشان دهنده موجودیتی است که این سطح دسترسی را دارد. چهار نوع ممکن از عنصر gAcl:scope
وجود دارد:
- کاربر — یک مقدار آدرس ایمیل، به عنوان مثال "user@gmail.com".
- گروه — یک آدرس ایمیل گروه Google، به عنوان مثال "group@domain.com".
- دامنه — یک نام دامنه G Suite، به عنوان مثال «domain.com».
- پیش فرض — تنها یک محدوده ممکن از نوع "default" وجود دارد که هیچ مقداری ندارد (به عنوان مثال
<gAcl:scope type="default">
). این محدوده خاص دسترسی هر کاربر را به طور پیش فرض در یک سایت عمومی کنترل می کند.
توجه : دامنهها نمیتوانند مقدار gAcl:role
روی دسترسی «مالک» تنظیم کرده باشند، آنها فقط میتوانند خواننده یا نویسنده باشند.
در حال بازیابی فید ACL
کلاسهای AclFeed
و AclEntry
میتوانند برای کنترل مجوزهای اشتراکگذاری سایت مورد استفاده قرار گیرند و با استفاده از متد getFeed()
کلاس سرویس واکشی شوند.
مثال زیر فید ACL را برای یک سایت معین واکشی می کند و مجوزهای هر AclEntry
را چاپ می کند:
public String getAclFeedUrl(String siteName) { String domain = "site"; // OR if the Site is hosted on G Suite, your domain (e.g. example.com) return "https://sites.google.com/feeds/acl/site/" + domain + "/" + siteName + "/"; } public void getAclFeed(String siteName) throws IOException, ServiceException { AclFeed aclFeed = client.getFeed(new URL(getAclFeedUrl(siteName)), AclFeed.class); for (AclEntry entry : aclFeed.getEntries()) { System.out.println(entry.getScope().getValue() + " (" + entry.getScope().getType() + ") : " + entry.getRole().getValue()); } } getAclFeed('my-site-name');
اگر با ورودیهای SiteFeed کار میکنید، هر SiteEntry
حاوی پیوندی به فید ACL خود است. به عنوان مثال، این قطعه فید acl یک SiteEntry
را واکشی می کند:
String aclLink = siteEntry.getLink(SitesAclFeedLink.Rel.ACCESS_CONTROL_LIST, Link.Type.ATOM).getHref(); AclFeed aclFeed = client.getFeed(new URL(aclLink), AclFeed.class);
به اشتراک گذاری یک سایت
توجه : برخی از ACL های اشتراک گذاری ممکن است فقط در صورتی امکان پذیر باشد که دامنه به گونه ای پیکربندی شده باشد که چنین مجوزهایی را مجاز کند (مثلاً اگر اشتراک گذاری خارج از دامنه برای دامنه های G Suite فعال باشد و غیره).
برای به اشتراک گذاشتن یک سایت Google با استفاده از API، مشتری شما باید یک AclEntry
جدید ایجاد کند و آن را به سرور POST
.
در اینجا مثالی وجود دارد که "user@example.com" را به عنوان reader
در سایت اضافه می کند:
AclRole role = new AclRole("reader"); AclScope scope = new AclScope(AclScope.Type.USER, "user@example.com"); AclEntry aclEntry = addAclRole(role, scope, entry); public AclEntry addAclRole(AclRole role, AclScope scope, SiteEntry siteEntry) throws IOException, MalformedURLException, ServiceException { AclEntry aclEntry = new AclEntry(); aclEntry.setRole(role); aclEntry.setScope(scope); Link aclLink = siteEntry.getLink(SitesAclFeedLink.Rel.ACCESS_CONTROL_LIST, Link.Type.ATOM); return client.insert(new URL(aclLink.getHref()), aclEntry); }
برای مقادیر احتمالی AclScope
و AclRoles
به بخش بررسی اجمالی فید ACL مراجعه کنید.
اشتراک گذاری در سطح گروه و دامنه
مشابه اشتراکگذاری یک سایت با یک کاربر ، میتوانید یک سایت را در گروه Google یا دامنه G Suite به اشتراک بگذارید.
اشتراک گذاری در یک آدرس ایمیل گروهی:
AclScope scope = new AclScope(AclScope.Type.GROUP, "group_name@example.com");
اشتراک گذاری در کل دامنه:
AclScope scope = new AclScope(AclScope.Type.DOMAIN, "example.com");
اشتراکگذاری در سطح دامنه فقط برای دامنههای G Suite و فقط برای دامنهای که سایت در آن میزبانی میشود، پشتیبانی میشود. برای مثال http://sites.google.com/a/domain1.com/siteA فقط میتواند کل سایت را با domain1.com به اشتراک بگذارد، نه domain2.com. سایت هایی که در دامنه G Suite میزبانی نمی شوند (مثلا http://sites.google.com/site/siteB) نمی توانند دامنه را دعوت کنند.
تغییر مجوزهای اشتراک گذاری
برای یک مجوز اشتراک گذاری موجود در یک سایت، ابتدا AclEntry
مورد نظر را واکشی کنید، مجوز را به دلخواه تغییر دهید و سپس متد AclEntry
's update()
را برای تغییر ACL در سرور فراخوانی کنید.
این مثال با بهروزرسانی «user@example.com» بهعنوان writer
(همکار) نمونه قبلی aclEntry
ما را از بخش اشتراکگذاری سایت تغییر میدهد:
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()
به برچسب ورودی دسترسی پیدا کنید.
این مثال یک بازیابی مشروط برای ورودی صفحه وب محتوا انجام می دهد:
String feedUrl = "https://sites.google.com/feeds/content/site/siteName/123456789"; WebPageEntry entry = client.getEntry(new URL(feedUrl), WebPageEntry.class, "\"GVQHSARDQyp7ImBq\"");
هنگامی که سرور این درخواست را دریافت می کند، بررسی می کند که آیا موردی که شما درخواست کرده اید دارای ETag مشابه با ETagی است که شما مشخص کرده اید یا خیر. اگر تگهای ET مطابقت داشته باشند، آیتم تغییر نکرده است، و سرور برمیگرداند یا یک استثنای HTTP 304 NotModifiedException
ایجاد میشود.
اگر تگ های ET با هم مطابقت نداشته باشند، پس از آخرین باری که شما آن را درخواست کرده اید، مورد تغییر یافته است و سرور آن مورد را برمی گرداند.
برای اطلاعات بیشتر در مورد ETags، راهنمای مرجع Google Data APIs را ببینید.