חשוב: המסמך הזה נכתב לפני 2012. אפשרויות האימות שמתוארות במסמך הזה (OAuth 1.0, AuthSub ו-ClientLogin) הוצאו משימוש באופן רשמי החל מ-20 באפריל 2012 והן לא זמינות יותר. מומלץ לעבור ל-OAuth 2.0 בהקדם האפשרי.
Google Sites Data API מאפשר לאפליקציות לקוח לגשת לתוכן באתר Google, לפרסם אותו ולשנות אותו. אפליקציית הלקוח יכולה גם לבקש רשימה של פעילות מהזמן האחרון, לאחזר את היסטוריית הגרסאות ולהוריד קבצים מצורפים.
בנוסף לספק קצת רקע לגבי היכולות של Sites Data API, המדריך הזה מספק דוגמאות לאינטראקציה עם ה-API באמצעות ספריית הלקוח של Java. במאמר תחילת השימוש בספריית הלקוח של Google Data ל-Java מוסבר איך מגדירים את ספריית הלקוח. למידע נוסף על הפרוטוקול הבסיסי שבו נעשה שימוש בספריית הלקוח של Java כדי לקיים אינטראקציה עם Sites API הקלאסי, אפשר לעיין במדריך לפרוטוקול.
קהל
המסמך הזה מיועד למפתחים שרוצים לכתוב אפליקציות לקוח שמקיימות אינטראקציה עם Google Sites באמצעות ספריית הלקוח של Google Data ל-Java.
תחילת העבודה
ב-Google Sites נעשה שימוש בחשבונות Google או בחשבונות G Suite לצורך אימות. אם כבר יש לך חשבון, הכול מוכן. אחרת, ניתן ליצור חשבון חדש.
התקנת הספרייה
במאמר תחילת העבודה עם ספריית הלקוח של Google Data ל-Java מוסבר איך מגדירים ומתקינים את ספריית הלקוח. אם אתם משתמשים ב-Eclipse, במאמר הזה מוסבר גם איך להגדיר את הפרויקט באמצעות הפלאגין של Google Data APIs ל-Eclipse. כדי להתחיל, צריך:
- מתקינים את Java מגרסה 1.5 ואילך
- מורידים את ספריית הלקוח (הגרסה האחרונה של
gdata-src.java.zip
) - מורידים את רשימת יחסי התלות
- הורד את האפליקציות לדוגמה (הגרסה האחרונה של
gdata-samples.java.zip
)
אחרי שתתקינו את קובצי ה-jar, תצטרכו לכלול את הפריטים הבאים בפרויקט:
java/lib/gdata-sites-2.0.jar
– הגרסה 2.0 כאן מיועדת לגרסה 1.4 של ה-API הקלאסי של Google Sites.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 APIs.
בהתאם לצרכים של האפליקציה, תצטרכו לבצע כמה ייבוא. מומלץ להתחיל עם הייבוא הבא:
import com.google.gdata.client.*; import com.google.gdata.client.sites.*; import com.google.gdata.data.*; import com.google.gdata.data.acl.*; import com.google.gdata.data.media.*; import com.google.gdata.data.sites.*; import com.google.gdata.data.spreadsheet.*; // If working with listpages / listitems import com.google.gdata.util.*;
לאחר מכן, תצטרכו גם להגדיר אובייקט SitesService
שמייצג חיבור לקוח ל-Sites API הקלאסי:
SitesService client = new SitesService("yourCo-yourAppName-v1");
הארגומנט applicationName
צריך להיות בפורמט: company-applicationname-version
. הפרמטר הזה משמש למטרות רישום ביומן.
הערה: בהמשך המדריך אנחנו יוצאים מנקודת הנחה שיצרתם SitesService
במשתנה client
.
אימות ל-Sites API בגרסה הקלאסית
אפשר להשתמש בספריית הלקוח של Java כדי לעבוד עם פידים ציבוריים או פרטיים. ה-Sites Data API מספק גישה לפידים פרטיים וציבוריים, בהתאם להרשאות ב-Sites ולפעולה שאתם מנסים לבצע. לדוגמה, יכול להיות שתוכלו לקרוא את פיד התוכן של אתר ציבורי, אבל לא לבצע בו עדכונים – פעולה שדורשת לקוח מאומת. אפשר לעשות זאת באמצעות אימות באמצעות שם משתמש וסיסמה ב-ClientLogin, AuthSub או OAuth.
מידע נוסף על AuthSub, OAuth ו-ClientLogin זמין בסקירה הכללית על אימות ב-Google Data APIs.
טיפ: ה-API תומך ב-SSL (HTTPS). אם אתם משתמשים ב-AuthSub/OAuth, חשוב לציין היקף של https://sites.google.com/feeds/
כדי לבקש פידים דרך SSL. חשוב גם לציין שבדומיינים של G Suite, ה-API מתייחס להגדרה 'חובה להשתמש ב-SSL' בחלונית הבקרה הניהולית. אפשר לאלץ את כל הבקשות ל-API לעבור דרך HTTPS באמצעות קריאה ל-client.useSsl();
.
AuthSub לאפליקציות אינטרנט
אימות AuthSub לאפליקציות אינטרנט צריך לשמש אפליקציות לקוח שצריכות לאמת את המשתמשים שלהן בחשבונות Google. למפעיל אין צורך בגישה לשם המשתמש ולסיסמה של משתמש Google Sites - נדרש רק אסימון AuthSub.
הוראות לשילוב AuthSub באפליקציית האינטרנט
בקשה לטוקן לשימוש חד-פעמי
כשהמשתמש נכנס לאפליקציה בפעם הראשונה, הוא צריך לבצע אימות. בדרך כלל, המפתחים מדפיסים טקסט כלשהו וקישור שמפנה את המשתמש לדף האישור של AuthSub כדי לאמת את המשתמש ולבקש גישה למסמכים שלו. ספריית הלקוח Google Data Java מספקת פונקציה ליצירת כתובת ה-URL הזו. הקוד הבא מגדיר קישור לדף AuthSubRequest.
import com.google.gdata.client.*; String nextUrl = "http://www.example.com/welcome.jsp"; String scope = "https://sites.google.com/feeds/"; boolean secure = true; boolean session = true; String authSubUrl = AuthSubUtil.getRequestUrl(nextUrl, scope, secure, session);
כדי לאמת משתמשים בדומיין שמתארח ב-G Suite:
import com.google.gdata.client.*; String hostedDomain = "example.com"; String nextUrl = "http://www.example.com/welcome.jsp"; String scope = "https://sites.google.com/feeds/"; // SSL is also supported boolean secure = true; boolean session = true; String authSubUrl = AuthSubUtil.getRequestUrl(hostedDomain, nextUrl, scope, secure, session);
השיטה getRequestUrl()
מקבלת כמה פרמטרים (התואמים לפרמטר השאילתה שבו משתמש הטיפול AuthSubRequest):
- כתובת ה-URL הבאה – כתובת ה-URL שאליה Google תפנה את המשתמש אחרי שהוא יתחבר לחשבון שלו ויעניק גישה.
http://www.example.com/welcome.jsp
בדוגמה שלמעלה - היקף –
https://sites.google.com/feeds/
בדוגמה שלמעלה - ערך בוליאני שמציין אם ייעשה שימוש באסימון במצב רשום או לא. הערך
false
בדוגמה שלמעלה - ערך בוליאני שני שמציין אם האסימון יוחלף באסימון סשן מאוחר יותר או לא. הערך
true
בדוגמה שלמעלה
שדרוג לאסימון סשן
שימוש ב-AuthSub עם ספריות הלקוח של Google Data API
אחזור מידע על אסימון סשן
שימוש ב-AuthSub עם ספריות הלקוח של Google Data API
ביטול אסימון סשן
OAuth לאפליקציות לאינטרנט או לאפליקציות מותקנות/לנייד
אפשר להשתמש ב-OAuth כחלופה ל-AuthSub, והוא מיועד לאפליקציות אינטרנט. OAuth דומה לשימוש במצב מאובטח ומורשה של AuthSub, בכך שכל בקשות הנתונים צריכות להיות חתומות באופן דיגיטלי וצריך לרשום את הדומיין.
הוראות לשילוב OAuth באפליקציה המותקנת
אחזור של אסימון בקשה
שימוש ב-OAuth עם ספריות הלקוח של Google Data API
הרשאת אסימון בקשה
למידע נוסף, ראו שימוש ב-OAuth עם ספריות הלקוח של Google Data API.
שדרוג לאסימון גישה
למידע נוסף, ראו שימוש ב-OAuth עם ספריות הלקוח של Google Data API.
ClientLogin לאפליקציות מותקנות/לנייד
צריך להשתמש ב-ClientLogin באפליקציות מותקנות או בנייד שצריכות לאמת את המשתמשים שלהן בחשבונות Google. בהפעלה הראשונה, האפליקציה מבקשת מהמשתמש להזין את שם המשתמש או הסיסמה שלו. בבקשות הבאות, יתבצע הפניה לטוקן האימות.
הוראות לשילוב ClientLogin באפליקציה המותקנת
כדי להשתמש ב-ClientLogin, צריך להפעיל את השיטה setUserCredentials()
של האובייקט SitesService
, שעובר בירושה מ-GoogleService
. מציינים את כתובת האימייל והסיסמה של המשתמש בשם מי הלקוח שולח בקשות. לדוגמה:
SitesService client = new SitesService("yourCo-yourAppName-v1"); client.setUserCredentials("example@gmail.com", "pa$$word");
טיפ: אחרי שהאפליקציה אימתה את המשתמש בפעם הראשונה, שמרו את אסימון האימות במסד הנתונים כדי לזכור אותו לשימוש מאוחר יותר. אין צורך לבקש מהמשתמש את הסיסמה בכל הרצה של האפליקציה. מידע נוסף זמין במאמר ביטול קריאה לאסימון אימות.
מידע נוסף על השימוש ב-ClientLogin באפליקציות Java זמין במאמר שימוש ב-ClientLogin עם ספריות הלקוח של Google Data API.
פיד האתר
אפשר להשתמש בפיד האתרים כדי לרשום את האתרים ב-Google Sites שבבעלות המשתמש או שיש לו הרשאות צפייה בהם. אפשר להשתמש בו גם כדי לשנות שם של אתר קיים. בדומיינים של G Suite, אפשר להשתמש בו גם כדי ליצור או להעתיק אתר שלם.
הצגת אתרים
כדי לשלוח שאילתה על פיד האתר, צריך לשלוח HTTP GET
לכתובת ה-URL של פיד האתר:
https://sites.google.com/feeds/site/site/
בלקוח Java, אפשר להשתמש בכיתות SiteFeed
ו-SiteEntry
כדי לעבוד עם פיד האתרים:
public String getSiteFeedUrl() { String domain = "site"; // OR if the Site is hosted on G Suite, your domain (e.g. example.com) return "https://sites.google.com/feeds/site/" + domain + "/"; } public void getSiteFeed() throws IOException, ServiceException { SiteFeed siteFeed = client.getFeed(new URL(getSiteFeedUrl()), SiteFeed.class); for (SiteEntry entry : siteFeed.getEntries()){ System.out.println("title: " + entry.getTitle().getPlainText()); System.out.println("site name: " + entry.getSiteName().getValue()); System.out.println("theme: " + entry.getTheme().getValue()); System.out.println(""); } }
קטע הקוד שלמעלה מדפיס את כותרת האתר, שם האתר והעיצוב של האתר. כדי לגשת למאפיינים נוספים בפיד, אפשר להשתמש בתכונות אחרות של שליפה.
יצירת אתרים חדשים
הערה: התכונה הזו זמינה רק לדומיינים ב-G Suite.
כדי להקצות אתרים חדשים, אפשר ליצור SiteEntry
חדש ולקרוא ל-method 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
שמכיל את האתר הרלוונטי, לשנות מאפיין אחד או יותר ואז לבצע קריאה ל-method 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();
מיפויים של כתובות אינטרנט
מיפויים של כתובות אינטרנט מאפשרים למשתמשים ב-Sites למפות את הדומיינים שלהם לאתר ב-Google Sites. לדוגמה, אפשר להשתמש ב-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
ב-URI של פיד האתר.
הערה: כדי לעדכן את מיפויי הכתובות, צריך להיות לכם הרשאת אדמין לאתר או הרשאת אדמין דומיין, במקרה של אתר שמתארח ב-G Suite.
לדוגמה, הבקשה הבאה מעדכנת את המיפוי http://www.mysitemapping.com
ל-http://www.my-new-sitemapping.com
, ומסירה את השדה http://www.mysitemapping2.com
על ידי השארת הקישור מחוץ לרשומה:
SiteEntry entry = client.getEntry(new URL("https://sites.google.com/feeds/site/site/siteName?with-mappings=true"), SiteEntry.class); // Modify mappings (remove all mappings, add some of them again, add modified mappings) entry.removeLinks(SitesLink.Rel.WEBADDRESSMAPPING, Link.Type.HTML); entry.addLink(SitesLink.Rel.WEBADDRESSMAPPING, Link.Type.HTML, "http://www.my-new-sitemapping.com"); // Update the entry with the mappings. entry.update();
הערה: אפשר לציין את המיפויים של כתובות האינטרנט גם בזמן יצירת האתר או העתקת האתר.
פיד הפעילות
ניתן לאחזר את הפעילות האחרונה של אתר (שינויים) על ידי אחזור פיד הפעילות. כל רשומה בפיד הפעילות מכילה מידע על שינוי שבוצע באתר.
כדי לשלוח שאילתה על פיד הפעילות, שולחים HTTP GET
לכתובת ה-URL של פיד הפעילות:
https://sites.google.com/feeds/activity/site/siteName
בלקוח Java, משתמשים במחלקה ActivityFeed
כדי להחזיר אובייקטים של ActivityEntry
:
public String buildActivityFeedUrl() { String domain = "site"; // OR if the Site is hosted on G Suite, your domain (e.g. example.com) String siteName = "mySite"; return "https://sites.google.com/feeds/activity/" + domain + "/" + siteName + "/"; } public void getActivityFeed() throws IOException, ServiceException { ActivityFeed activityFeed = client.getFeed(new URL(buildActivityFeedUrl()), ActivityFeed.class); for (BaseActivityEntry<?> entry : activityFeed.getEntries()){ System.out.println(entry.getSummary().getPlainText()); System.out.println(" revisions link: " + entry.getRevisionLink().getHref()); } }
הערה: כדי לגשת אל הפיד הזה, אתם צריכים להיות שותפי עריכה או בעלים של האתר. הלקוח צריך לבצע אימות באמצעות טוקן AuthSub, OAuth או ClientLogin. אימות לשירות 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. למידע נוסף, ניתן לעיין בקטע אימות מול שירות Google 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 ופרמטרים שספציפיים לגרסה הקלאסית של Google Sites API. במדריך העזר תוכלו לקרוא מידע מפורט יותר ורשימה מלאה של הפרמטרים הנתמכים.
הערה: הדוגמאות בקטע הזה משתמשות בשיטה buildContentFeedUrl()
שמפורטת בקטע אחזור פיד התוכן.
אחזור של סוגים ספציפיים של רשומות
כדי לאחזר רק סוג מסוים של רשומה, צריך להשתמש בפרמטר kind
. בדוגמה הזו מוחזרות attachment
רשומות בלבד:
ContentQuery query = new ContentQuery(new URL(buildContentFeedUrl())); query.setKind("webpage"); ContentFeed contentFeed = client.getFeed(query, ContentFeed.class); for (AttachmentEntry entry : contentFeed.getEntries(AttachmentEntry.class)) { System.out.println(entry.getTitle().getPlainText()); }
כדי להחזיר יותר מסוג אחד של רשומה, צריך להפריד בין כל kind
באמצעות ','. בדוגמה הזו מוחזר רשומה מסוג filecabinet
ורשומה מסוג listpage
:
URL url = new URL(buildContentFeedUrl() + "?kind=filecabinet,listpage"); ContentFeed contentFeed = client.getFeed(url, ContentFeed.class); for (FileCabinetPageEntry entry : contentFeed.getEntries(FileCabinetPageEntry.class)) { System.out.println(" title: " + entry.getTitle().getPlainText()); } for (ListPageEntry entry : contentFeed.getEntries(ListPageEntry.class)) { System.out.println(" title: " + entry.getTitle().getPlainText()); }
אחזור דף לפי נתיב
אם אתם יודעים את הנתיב היחסי של דף באתר שנוצר באמצעות Google Sites, אתם יכולים להשתמש בפרמטר 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";
אפשר ליצור תוכן חדש (דפי אינטרנט, דפי רשימה, דפי ארון קבצים, דפי הודעות וכו') על ידי שליחת POST
HTTP לפיד התוכן:
https://sites.google.com/feeds/content/site/siteName
רשימה של סוגי צמתים לתמיכה מופיעה במאמר על הפרמטר kind
במדריך העזרה.
יצירת פריטים או דפים חדשים
בדוגמה הזו נוצר webpage
חדש ברמה העליונה של האתר, נכלל XHTML מסוים לגוף הדף ומוגדר שם הכותרת כ-'New WebPage Title':
private void setContentBlob(BaseContentEntry<?> entry, String pageContent) { XmlBlob xml = new XmlBlob(); xml.setBlob(pageContent); entry.setContent(new XhtmlTextConstruct(xml)); } public WebPageEntry createWebPage(String title, String content) throws MalformedURLException, IOException, ServiceException { WebPageEntry entry = new WebPageEntry(); entry.setTitle(new PlainTextConstruct(title)); setContentBlob(entry, content); // Entry's HTML content return client.insert(new URL(buildContentFeedUrl()), entry); } WebPageEntry createdEntry = createWebPage("New Webpage Title", "<b>HTML content</b>"); System.out.println("Created! View at " + createdEntry.getHtmlLink().getHref());
אם הבקשה תאושר, השדה createdEntry
יכיל עותק של הרשומה שנוצרה בשרת.
יצירת פריטים או דפים בנתיבים של כתובות URL מותאמות אישית
כברירת מחדל, הדוגמה הקודמת תיווצר עם כתובת ה-URL http://sites.google.com/site/siteName/new-webpage-title
, והכותרת של הדף היא 'כותרת חדשה של דף אינטרנט'. כלומר, הערך <atom:title>
מנורמל ל-new-webpage-title
עבור כתובת ה-URL.
כדי להתאים אישית את נתיב כתובת ה-URL של דף, אפשר להגדיר את האלמנט <sites:pageName>
.
בדוגמה הזו נוצר דף filecabinet
חדש עם הכותרת 'אחסון קבצים', אבל הדף נוצר בכתובת ה-URL http://sites.google.com/site/siteName/files
(במקום http://sites.google.com/site/siteName/file-storage
) על ידי ציון הרכיב <sites:pageName>
.
public FileCabinetPageEntry createFileCabinetPage(String title, String content, String customPageName) throws MalformedURLException, IOException, ServiceException { FileCabinetPageEntry entry = new FileCabinetPageEntry(); entry.setTitle(new PlainTextConstruct(title)); setContentBlob(entry, content); // Entry's HTML content entry.setPageName(new PageName(customPageName)); // Upload to a custom page path return client.insert(new URL(buildContentFeedUrl()), entry); } FileCabinetPageEntry createdEntry = createFileCabinetPage("File Storage", "<b>HTML content</b>", "files"); System.out.println("Created! View at " + createdEntry.getHtmlLink().getHref());
השרת משתמש בכללי העדיפות הבאים כדי לתת שם לנתיב של כתובת ה-URL של דף:
<sites:pageName>
, אם הוא קיים. חייב לעמוד בתנאיa-z, A-Z, 0-9, -, _
.<atom:title>
, לא יכול להיות null אם pageName לא קיים. נירמול הוא לחתוך + לכווץ רווחים לבנים ל-'-' ולהסיר תווים שלא תואמים ל-a-z, A-Z, 0-9, -, _
.
יצירת דפי משנה
כדי ליצור דפי משנה (צאצאים) בדף הורה, צריך להגדיר את הקישור להורה ברשומה. המאפיין href
של הקישור לקישור העצמי של צומת ההורה.
public AnnouncementEntry postAnnouncement(String title, String content, AnnouncementsPageEntry parentPage) throws MalformedURLException, IOException, ServiceException { AnnouncementEntry entry = new AnnouncementEntry(); entry.setTitle(new PlainTextConstruct(title)); setContentBlob(entry, content); // Entry's HTML content // Set the entry's parent link to create the announcement under that page. entry.addLink(SitesLink.Rel.PARENT, Link.Type.ATOM, parentPage.getSelfLink().getHref()); return client.insert(new URL(buildContentFeedUrl()), entry); } ContentFeed contentFeed = client.getFeed(new URL(buildContentFeedUrl() + "?kind=announcementspage"), ContentFeed.class); AnnouncementEntry createdEntry = postAnnouncement("Party!!", "My place, this weekend", contentFeed.getEntries().get(0)); System.out.println("New post by " + createdEntry.getAuthors().get(0).getName());
בדוגמה שלמעלה נוצר announcement
חדש מתחת לדף העדכונים הראשון שנמצא בפיד התוכן של המשתמש. כותרת ההודעה מוגדרת כ'מסיבה!!' והתוכן מוגדר כ'אצלי, בסוף השבוע'.
תבניות של דפים
יצירת תבניות דפים
התהליך ליצירת תבנית דף זהה לתהליך יצירת פריטים/דפים חדשים ויצירת דפי משנה. ההבדל הוא בהוספת ה-category
עם המונח והתווית שמוגדרים כ-'http://schemas.google.com/g/2005#template' ו-'template', בהתאמה.
הדוגמה הזו יוצרת תבנית webpage
חדשה.
// The template webpage entry. WebPageEntry entry = new WebPageEntry(); // Set title and content. entry.setTitle(new PlainTextConstruct("Page template title")); XmlBlob xml = new XmlBlob(); xml.setBlob("Content for page template"); entry.setContent(new XhtmlTextConstruct(xml)); // Set the template category Category TEMPLATE_CATEGORY = new Category(TemplateCategory.Scheme.LABELS, TemplateCategory.Term.TEMPLATE, TemplateCategory.Label.TEMPLATE); entry.getCategories().add(TEMPLATE_CATEGORY); // Insert the template webpage entry. WebPageEntry createdEntry = client.insert(new URL("https://sites.google.com/feeds/content/site/siteName"), entry);
יצירת דפים מתבנית
בדומה ליצירת תבניות דפים, אפשר ליצור דף חדש מתבנית על ידי הכללת <link>
עם rel='http://schemas.google.com/sites/2008#template' שמצביע על הקישור העצמי של תבנית הדף.
בדוגמה הזו נוצרת תבנית filecabinet
חדשה, ולאחר מכן נוצר דף filecabinet
חדש מהתבנית הזו.
URL feedUrl = new URL("https://sites.google.com/feeds/content/site/siteName"); // 1. Create file cabinet page template FileCabinetPageEntry inputTemplateEntry = new FileCabinetPageEntry(); inputTemplateEntry.setTitle(new PlainTextConstruct("File cabinet page template title")); XmlBlob xml = new XmlBlob(); xml.setBlob("Content for page template"); inputTemplateEntry.setContent(new XhtmlTextConstruct(xml)); // Set the template category Category TEMPLATE_CATEGORY = new Category(TemplateCategory.Scheme.LABELS, TemplateCategory.Term.TEMPLATE, TemplateCategory.Label.TEMPLATE); inputTemplateEntry.getCategories().add(TEMPLATE_CATEGORY); // 2. Create file cabinet page template instance FileCabinetPageEntry templateEntry = client.insert(feedUrl, inputTemplateEntry); // Specify link to the page template FileCabinetPageEntry templateInstanceEntry = new FileCabinetPageEntry(); templateInstanceEntry.setTitle(new PlainTextConstruct("File cabinet template instance")); templateInstanceEntry.addLink(new Link(SitesLink.Rel.TEMPLATE, Link.Type.ATOM, templateEntry.getSelfLink().getHref())); FileCabinetPageEntry createdFileCabinetFromTemplate = client.insert(feedUrl, templateInstanceEntry);
הערה: גם אם הגדרתם <category>
בתבנית, עדיין צריך לכלול <category>
ברשומה. חשוב גם לזכור שאם תכללו את הרכיב <content>
, השרת ידחה אותו.
העלאת קבצים
בדומה ל-Google Sites, ה-API תומך בהעלאת קבצים לדף הארכיון או לדף הורה.
כדי להעלות קובץ מצורף לחשבון הורה, שולחים בקשת HTTP POST
לכתובת ה-URL של פיד התוכן:
https://sites.google.com/feeds/content/site/siteName
צריך להעלות את כל סוגי הקבצים המצורפים לדף הורה. לכן, צריך להגדיר קישור הורה באובייקט AttachmentEntry
או WebAttachmentEntry
שרוצים להעלות. למידע נוסף, ראו יצירת דפי משנה.
הקבצים מועלים
בדוגמה הזו, קובץ PDF מועלה ל-FileCabinetPageEntry
הראשון שנמצא בפיד התוכן של המשתמש.
הקובץ המצורף נוצר עם הכותרת 'תחילת העבודה' והתיאור (אופציונלי) 'חבילת משאבי אנוש'.
MimetypesFileTypeMap mediaTypes = new MimetypesFileTypeMap(); mediaTypes.addMimeTypes("application/msword doc"); mediaTypes.addMimeTypes("application/vnd.ms-excel xls"); mediaTypes.addMimeTypes("application/pdf pdf"); mediaTypes.addMimeTypes("text/richtext rtx"); // ... See a more complete list of mime types in the SitesHelper.java public AttachmentEntry uploadAttachment(File file, BasePageEntry<?> parentPage, String title, String description) throws IOException, ServiceException { AttachmentEntry newAttachment = new AttachmentEntry(); newAttachment.setMediaSource(new MediaFileSource(file, mediaTypes.getContentType(file))); newAttachment.setTitle(new PlainTextConstruct(title)); newAttachment.setSummary(new PlainTextConstruct(description)); newAttachment.addLink(SitesLink.Rel.PARENT, Link.Type.ATOM, parentPage.getSelfLink().getHref()); return client.insert(new URL(buildContentFeedUrl()), newAttachment); } ContentFeed contentFeed = client.getFeed(new URL(buildContentFeedUrl() + "?kind=filecabinet"), ContentFeed.class); FileCabinetPageEntry parentPage = contentFeed.getEntries(FileCabinetPageEntry.class).get(0); AttachmentEntry attachment = uploadAttachment( new File("/path/to/your/file.pdf"), parentPage, "Getting Started", "HR packet"); System.out.println("Uploaded!");
אם ההעלאה תתבצע בהצלחה, השדה attachment
יכיל עותק של הרשומה של הקובץ המצורף שנוצר.
העלאת קובץ מצורף לתיקייה
כדי להעלות קובץ מצורף לתיקייה קיימת ב-FileCabinetPageEntry
, צריך לכלול קטגוריה עם המאפיין 'term' (מונח) שמוגדר לשם התיקייה.
לדוגמה, מוסיפים את השורה הבאה ב-uploadAttachment()
:
newAttachment.getCategories().add(new Category("http://schemas.google.com/sites/2008#folder", "FolderName"));
קבצים מצורפים מהאינטרנט
קבצים מצורפים מהאינטרנט הם סוגים מיוחדים של קבצים מצורפים. בעיקרון, הם קישורים לקבצים אחרים באינטרנט שאפשר להוסיף לרשימות בארכיון. התכונה הזו מקבילה לשיטת ההעלאה 'הוספת קובץ לפי כתובת URL' בממשק המשתמש של Google Sites.
הערה: אפשר ליצור קבצים מצורפים באינטרנט רק בתוך ארון קבצים. לא ניתן להעלות אותם לסוגים אחרים של דפים.
בדוגמה הזו נוצר WebAttachmentEntry
מתחת ל-FileCabinetPageEntry
הראשון שנמצא בפיד התוכן של המשתמש.
השם והתיאור (אופציונלי) מוגדרים כ-'GoogleLogo' ו-'nice colors', בהתאמה.
public WebAttachmentEntry uploadWebAttachment(String contentUrl, FileCabinetPageEntry filecabinet, String title, String description) throws MalformedURLException, IOException, ServiceException { MediaContent content = new MediaContent(); content.setUri(contentUrl); WebAttachmentEntry webAttachment = new WebAttachmentEntry(); webAttachment.setTitle(new PlainTextConstruct(title)); webAttachment.setSummary(new PlainTextConstruct(description)); webAttachment.setContent(content); webAttachment.addLink(SitesLink.Rel.PARENT, Link.Type.ATOM, filecabinet.getSelfLink().getHref()); return client.insert(new URL(buildContentFeedUrl()), webAttachment); } ContentFeed contentFeed = client.getFeed(new URL(buildContentFeedUrl() + "?kind=filecabinet"), ContentFeed.class); FileCabinetPageEntry parentPage = contentFeed.getEntries(FileCabinetPageEntry.class).get(0); WebAttachmentEntry webAttachment = uploadWebAttachment("http://www.google.com/images/logo.gif", parentPage, "Google's Logo", "nice colors"); System.out.println("Web attachment created!");
הפקודה POST
יוצרת קישור בארון הקבצים של המשתמש שמפנה לתמונה בכתובת 'http://www.google.com/images/logo.gif'.
עדכון התוכן
עדכון מטא-נתונים ו/או תוכן HTML של דף
אפשר לערוך את המטא-נתונים (title, pageName וכו') ואת תוכן הדף מכל סוג BaseContentEntry
באמצעות השיטה update()
של הרשומה. הפעולה הזו תשלח בקשת HTTP PUT
לקישור edit
של הרשומה.
בהמשך מופיעה דוגמה לעדכון של ListPageEntry
עם השינויים הבאים:
- הכותרת תשתנה ל'Updated Title'
- תוכן ה-HTML של הדף מתעדכן ל'<p>Updated HTML Content</p>'
- הכותרת של העמודה הראשונה ברשימה משתנה ל'בעלים'
ContentFeed contentFeed = client.getFeed( new URL(buildContentFeedUrl() + "?kind=listpage"), ContentFeed.class); ListPageEntry listPage = contentFeed.getEntries(ListPageEntry.class).get(0); // Update first list page found // Update title listPage.setTitle(new PlainTextConstruct("Updated Title")); // Update HTML content XmlBlob xml = new XmlBlob(); xml.setBlob("<p>Updated HTML Content</p>"); listPage.setContent(new XhtmlTextConstruct(xml)); // Change first column's heading listPage.getData().getColumns().get(0).setName("Owner"); // listPage.setPageName(new PageName("new-page-path")); // You can also change the page's URL path ListPageEntry updatedEntry = listPage.update(); System.out.println("ListPage updated!");
עדכון התוכן של קובץ מצורף
בשביל AttachmentEntry
, אפשר גם לעדכן את התוכן על ידי הגדרה של MediaSource
של הרשומה ולאחר מכן שימוש בשיטת updateMedia(boolean)
של הרשומה.
בדוגמה הבאה יתבצע עדכון של תוכן קובץ מצורף קיים:
public AttachmentEntry updateFile(AttachmentEntry entry, File newFile) throws IOException, ServiceException { // See Uploading Attachments for the definition of mediaTypes. entry.setMediaSource(new MediaFileSource(newFile, mediaTypes.getContentType(newFile))); return entry.updateMedia(false); }
בדוגמה נשלחת בקשת HTTP PUT
לקישור edit-media
של הרשומה. הערך המוחזר של AttachmentEntry
יכיל את התוכן המעודכן.
עדכון המטא-נתונים והתוכן של הקובץ המצורף
אפשר לעדכן את המטא-נתונים של קובץ מצורף ואת התוכן שלו באותה קריאה באמצעות השיטה updateMedia()
.
אם אתם יכולים לעדכן רק את התוכן של הקובץ, את המטא-נתונים או את שניהם.
בדוגמה הזו, השם של הקובץ המצורף משתנה ל-'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");
מחיקת תוכן
כדי להסיר דף או פריט מאתר 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
:
- reader – צופה (שווה ערך להרשאת קריאה בלבד).
- writer – שותף עריכה (גישה לקריאה וכתיבה).
- בעלים – בדרך כלל האדמין של האתר (שווה ערך להרשאת קריאה/כתיבה).
טווחים
רכיב ההיקף מייצג את הישות שיש לה את רמת הגישה הזו. יש ארבעה סוגים אפשריים של האלמנט gAcl:scope
:
- user – ערך של כתובת אימייל, למשל user@gmail.com.
- group — כתובת אימייל של קבוצה ב-Google, כמו 'group@domain.com'.
- domain — שם דומיין ב-G Suite, לדוגמה 'domain.com'.
- ברירת מחדל - קיים רק היקף אפשרי אחד מסוג 'ברירת מחדל', שאין לו ערך (למשל,
<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 Sites באמצעות ה-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); }
בקטע סקירה כללית על פיד ACL מפורטים הערכים האפשריים של AclScope
ושל AclRoles
.
שיתוף ברמת הקבוצה והדומיין
בדומה לשיתוף אתר עם משתמש יחיד, אפשר לשתף אתר בקבוצת 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
הרלוונטי, לשנות את ההרשאה כרצונך ואז לבצע קריאה ל-method 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
ואז קוראים ל-method של 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
.
אפשר לגשת ל-ETag של רשומה מ-entry.getEtag()
.
בדוגמה הזו מתבצעת אחזור מותנה של רשומה של דף אינטרנט עם תוכן:
String feedUrl = "https://sites.google.com/feeds/content/site/siteName/123456789"; WebPageEntry entry = client.getEntry(new URL(feedUrl), WebPageEntry.class, "\"GVQHSARDQyp7ImBq\"");
כשהשרת מקבל את הבקשה, הוא בודק אם לפריט שביקשתם יש אותו ETag של ה-ETag שציינתם. אם תהיה התאמה בין תגי ה-ETag, המשמעות היא שהפריט לא השתנה והשרת יחזיר קוד סטטוס HTTP 304 או יפלט חריג מסוג NotModifiedException
.
אם ה-ETags לא תואמים, סימן שהפריט השתנה מאז הפעם האחרונה שביקשתם אותו והשרת מחזיר את הפריט.
מידע נוסף על תגי ETag זמין במדריך העזרה של Google Data APIs.