מדריך לשפת Java

חשוב: המסמך הזה נכתב לפני 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 Sites באמצעות ספריית הלקוח של Google Data Java.

תחילת העבודה

ב-Google Sites נעשה שימוש בחשבונות Google או בחשבונות G Suite לצורך אימות. אם כבר יש לכם חשבון, הכול מוכן. אחרת, אתם יכולים ליצור חשבון חדש.

התקנת הספרייה

הוראות להגדרה ולהתקנה של ספריית הלקוח מופיעות במאמר תחילת העבודה עם ספריית הלקוח של Google Data Java. אם אתם משתמשים ב-Eclipse, במאמר הזה מוסבר גם איך להגדיר את הפרויקט באמצעות Google Data APIs Eclipse plugin. כדי להתחיל, צריך:

  1. מתקינים Java מגרסה 1.5 ואילך
  2. מורידים את ספריית הלקוח (הגרסה האחרונה של gdata-src.java.zip)
  3. הורדה של רשימת יחסי התלות
  4. מורידים את אפליקציות הדוגמה (הגרסה האחרונה של gdata-samples.java.zip)

אחרי שמתקינים את קובצי ה-JAR, צריך לכלול את הפריטים הבאים בפרויקט:

  1. java/lib/gdata-sites-2.0.jar – גרסה 2.0 כאן מיועדת לגרסה 1.4 של Sites API של הגרסה הקלאסית של Google Sites.
  2. java/lib/gdata-core-1.0.jar
  3. java/lib/gdata-client-1.0.jar
  4. java/lib/gdata-spreadsheet-3.0.jar (אם עובדים עם דפי רשימה או פריטים ברשימה)

חשוב גם לכלול את קובצי ה-JAR של התלות (gdata-media-1.0.jar,‏ mail.jar ו-google-collect....jar).

הרצת אפליקציה לדוגמה

אפליקציה לדוגמה שפועלת באופן מלא נמצאת בספריית המשנה /java/sample/sites של ההורדה gdata-samples.java.zip. המקור זמין גם בכתובת /trunk/java/sample/sites/ במאגר SVN שאפשר לגשת אליו מהכרטיסייה Source (מקור). המאמר SitesDemo.java מאפשר למשתמש לבצע מספר פעולות שמדגימות איך להשתמש ב-Sites API.

הערה: כדי להריץ את הדוגמה, צריך לכלול את java/sample/util/lib/sample-util.jar.

התחלת פרויקט משלכם

טיפ: במאמר שימוש ב-Eclipse עם Google Data APIs מוסבר איך להגדיר את התוסף שלנו ל-Eclipse במהירות.

בהתאם לצרכים של האפליקציה, תצטרכו לבצע כמה ייבואים. מומלץ להתחיל עם הייבוא הבא:

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 של הגרסה הקלאסית של Google Sites

אפשר להשתמש בספריית הלקוח של Java כדי לעבוד עם פידים ציבוריים או פרטיים. ‫Sites Data API מספק גישה לפידים פרטיים וציבוריים, בהתאם להרשאות ב-Sites ולפעולה שאתם מנסים לבצע. לדוגמה, יכול להיות שתוכלו לקרוא את פיד התוכן של אתר ציבורי, אבל לא תוכלו לעדכן אותו – פעולה שתדרוש לקוח מאומת. אפשר לעשות את זה באמצעות אימות שם משתמש וסיסמה של ClientLogin,‏ AuthSub או OAuth.

מידע נוסף על AuthSub,‏ OAuth ו-ClientLogin זמין בסקירה הכללית על אימות של ממשקי Google Data API.

טיפ: ה-API תומך ב-SSL‏ (HTTPS). אם אתם משתמשים ב-AuthSub/OAuth, הקפידו לציין היקף של https://sites.google.com/feeds/ כדי לבקש פידים דרך SSL. חשוב גם לציין שבשביל דומיינים של G Suite, ה-API מתחשב בהגדרה 'נדרש SSL' בלוח הבקרה של האדמין. אפשר להפעיל את כל בקשות ה-API באמצעות HTTPS על ידי קריאה ל-client.useSsl();.

‫AuthSub לאפליקציות אינטרנט

אפליקציות לקוח שצריכות לאמת את המשתמשים שלהן בחשבונות Google צריכות להשתמש ב-AuthSub Authentication for Web Applications. למפעיל לא נדרשת גישה לשם המשתמש ולסיסמה של משתמש 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);

ה-method ‏getRequestUrl() מקבלת כמה פרמטרים (שמתאימים לפרמטרים של השאילתה שבהם משתמש ה-handler ‏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

ביטול טוקן לסשן

שימוש ב-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("");
  }
}

קטע הקוד שלמעלה מדפיס את הכותרת של האתר, את שם האתר ואת העיצוב של האתר. יש פונקציות getter אחרות שאפשר להשתמש בהן כדי לגשת למאפיינים נוספים בפיד.

יצירת אתרים חדשים

הערה: התכונה הזו זמינה רק בדומיינים של 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. לכן, כתובת האתר תהיה https://sites.google.com/a/example.com/my-site-title.

אם האתר נוצר בהצלחה, השרת ישיב עם אובייקט SiteEntry שמכיל את הרכיבים שהשרת הוסיף: קישור לאתר, קישור לפיד ACL של האתר, שם האתר, הכותרת, הסיכום וכו'.

העתקת אתר

הערה: התכונה הזו זמינה רק בדומיינים של G Suite.

העתקת אתר דומה ליצירת אתר חדש. ההבדל הוא שצריך להגדיר קישור ב-SiteEntry החדש שכולל את הקישור העצמי של האתר לשכפול. הנה דוגמה לשכפול האתר שנוצר בקטע יצירת אתרים חדשים:

public SiteEntry copySite(String title, String summary, String sourceHref)
    throws MalformedURLException, IOException, ServiceException {
  SiteEntry entry = new SiteEntry();
  entry.setTitle(new PlainTextConstruct(title));
  entry.setSummary(new PlainTextConstruct(summary));
  entry.addLink(SitesLink.Rel.SOURCE, Link.Type.ATOM, sourceHref);

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

String sourceHref = newSiteEntry.getLink(SitesLink.Rel.SOURCE, Link.Type.ATOM).getHref();
SiteEntry myTwin = copySite("Duplicate Site", "A copy", sourceHref);

נקודות חשובות:

  • אפשר להעתיק רק אתרים ותבניות אתרים שהמשתמש המאומת הוא הבעלים שלהם.
  • אפשר גם להעתיק תבנית של אתר. אתר הוא תבנית אם ההגדרה 'פרסום אתר זה כתבנית' מסומנת בדף ההגדרות של Google Sites.
  • אפשר להעתיק אתר מדומיין אחר, בתנאי שאתם רשומים כבעלים באתר המקור.

עדכון המטא-נתונים של אתר

כדי לשנות את השם של אתר, את העיצוב שלו, את תג הקטגוריה או את הסיכום, קודם צריך לאחזר את SiteEntry שמכיל את האתר הרלוונטי, לשנות מאפיין אחד או יותר ואז להפעיל את השיטה update() של SiteEntry. בדוגמה הזו משנים את העיצוב של האתר הקודם ומשנים את השם של האתר:

myTwin.setTitle(new PlainTextConstruct("better-title"));

Theme theme = myTwin.getTheme();
theme.setValue('iceberg');
myTwin.setTheme(theme);

myTwin.getCategories().add(new Category(TagCategory.Scheme.TAG, "newTag", null));

SiteEntry updatedSiteEntry = myTwin.update();

System.out.println(updatedSiteEntry.getTitle().getPlainText();

מיפוי של כתובות אינטרנט

מיפויים של כתובות אינטרנט מאפשרים למשתמשי 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.

שינוי מיפויים של כתובות אינטרנט

הערה: כשעובדים עם מיפויים של כתובות אינטרנט, צריך לציין את הפרמטר with-mappings=true בכל הפעולות מסוג GET,‏ POST או PUT. אם הפרמטר לא קיים, המערכת לא תחזיר את webAddressMappings ברשומות של אתרים (GET) ולא תתייחס אליו כשמעדכנים או מסירים (PUT) מיפויים מרשומה.

כדי להוסיף, לעדכן או למחוק מיפוי, פשוט מציינים, משנים או מסירים את הקישור כשיוצרים אתרים חדשים או מעדכנים את המטא-נתונים של אתר. הפרמטר with-mappings=true צריך להיכלל ב-URI של פיד האתר. הערה: כדי לעדכן את מיפוי הכתובות, צריך להיות אדמין באתר או אדמין בדומיין במקרה של אתר שמארח G Suite.

לדוגמה, הבקשה שלמטה מעדכנת את המיפוי http://www.mysitemapping.com ל-http://www.my-new-sitemapping.com, ומסירה את http://www.mysitemapping2.com על ידי השמטת הקישור מהרשומה:

SiteEntry entry = client.getEntry(new URL("https://sites.google.com/feeds/site/site/siteName?with-mappings=true"), SiteEntry.class);

// Modify mappings (remove all mappings, add some of them again, add modified mappings)
entry.removeLinks(SitesLink.Rel.WEBADDRESSMAPPING, Link.Type.HTML);
entry.addLink(SitesLink.Rel.WEBADDRESSMAPPING, Link.Type.HTML, "http://www.my-new-sitemapping.com");

// Update the entry with the mappings.
entry.update();

הערה: אפשר גם לציין מיפויים של כתובות אינטרנט בזמן יצירה או העתקה של אתר.

חזרה למעלה

פיד הפעילות

אפשר לאחזר את הפעילות האחרונה (שינויים) באתר על ידי אחזור פיד הפעילות. כל רשומה בפיד הפעילות מכילה מידע על שינוי שבוצע באתר.

כדי להריץ שאילתה על פיד הפעילות, שולחים בקשת HTTP GET לכתובת ה-URL של פיד הפעילות:

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

בלקוח Java, משתמשים במחלקה ActivityFeed כדי להחזיר אובייקטים מסוג ActivityEntry:

public String buildActivityFeedUrl() {
  String domain = "site";  // OR if the Site is hosted on G Suite, your domain (e.g. example.com)
  String siteName = "mySite";
  return "https://sites.google.com/feeds/activity/" + domain + "/" + siteName + "/";
}

public void getActivityFeed() throws IOException, ServiceException {
  ActivityFeed activityFeed = client.getFeed(new URL(buildActivityFeedUrl()), ActivityFeed.class);
  for (BaseActivityEntry<?> entry : activityFeed.getEntries()){
    System.out.println(entry.getSummary().getPlainText());
    System.out.println(" revisions link: " + entry.getRevisionLink().getHref());
  }
}

הערה: כדי לגשת לפיד הזה, אתם צריכים להיות שותפים או בעלים של האתר. הלקוח צריך לעבור אימות באמצעות טוקן AuthSub,‏ OAuth או ClientLogin. מידע נוסף זמין במאמר אימות לשירות Sites.

חזרה למעלה

פיד גרסאות

כדי לאחזר את היסטוריית גרסאות של רשומה כלשהי של תוכן, שולחים בקשת HTTP GET לקישור של הגרסה ברשומה:

https://sites.google.com/feeds/revision/site/siteName/CONTENT_ENTRY_ID

בדוגמה הזו מתבצעת שאילתה בפיד התוכן, ואז מתבצעת אחזור של פיד השינויים עבור רשומת התוכן הראשונה:

ContentFeed contentFeed = client.getFeed(new URL(buildContentFeedUrl()), ContentFeed.class);
URL revisionFeedUrl = new URL(contentFeed.getEntries().get(0).getRevisionLink().getHref()); // use first entry

public void getRevisionFeed(String revisionFeedUrl) throws IOException, ServiceException {
  RevisionFeed revisionFeed = client.getFeed(revisionFeedUrl, RevisionFeed.class);
  for (BaseContentEntry<?> entry : revisionFeed.getEntries()){
    System.out.println(entry.getTitle().getPlainText());
    System.out.println(" updated: " + entry.getUpdated().toUiString() + " by " +
        entry.getAuthors().get(0).getEmail());
    System.out.println(" revision #: " + entry.getRevision().getValue());
  }
}

הערה: כדי לגשת לפיד הזה, אתם צריכים להיות שותפים או בעלים של האתר. הלקוח צריך לעבור אימות באמצעות טוקן AuthSub,‏ OAuth או ClientLogin. מידע נוסף זמין במאמר אימות לשירות Sites.

חזרה למעלה

פיד תוכן

אחזור פיד התוכן

בפיד התוכן מפורט התוכן העדכני ביותר באתר. אפשר לגשת אליו על ידי שליחת HTTP GET לכתובת ה-URL של פיד התוכן:

https://sites.google.com/feeds/content/site/siteName
פרמטר של פידתיאור
sitesite או הדומיין של הדומיין המתארח שלכם ב-G Suite (למשל, example.com).
siteNameהשם של מרחב האינטרנט של האתר שלך; נמצא בכתובת ה-URL של האתר (לדוגמה, mySite).

דוגמה לאחזור פיד תוכן:

public String buildContentFeedUrl() {
  String domain = "site";  // OR if the Site is hosted on G Suite, your domain (e.g. example.com)
  String siteName = "mySite";
  return "https://sites.google.com/feeds/content/" + domain + "/" + siteName + "/";
}

ContentFeed contentFeed = client.getFeed(new URL(buildContentFeedUrl()), ContentFeed.class);

התוצאה contentFeed היא אובייקט ContentFeed שמכיל את התגובה מהשרת. כל רשומה ב-contentFeed מייצגת דף או פריט אחר באתר של המשתמש. ה-ContentFeed יכיל סוגים שונים של אובייקטים, שכולם עוברים בירושה מ-BaseContentEntry: ‏ ListItemEntry, ‏ ListPageEntry, ‏ AttachmentEntry, ‏ WebAttachmentEntry,‏ FileCabinetPageEntry, ‏ AnnouncementsPageEntry, ‏ AnnouncementEntry, ‏ WebPageEntry, ‏ CommentEntry.

הנה דוגמה לרשימה של סוגי הרשומות השונים ב-ContentFeed. כל סוג של רשומה מכיל מאפיינים שונים, אבל לא כולם מודפסים כאן.

public String getContentBlob(BaseContentEntry<?> entry) {
 return ((XhtmlTextConstruct) entry.getTextContent().getContent()).getXhtml().getBlob();
}

// Extracts an entry's numeric ID.
private String getEntryId(String selfLink) {
  return selfLink.substring(selfLink.lastIndexOf("/") + 1);
}

public void printContentEntries(ContentFeed contentFeed) {
  System.out.println("Listing all WebPageEntry:");
  for (WebPageEntry entry : contentFeed.getEntries(WebPageEntry.class)) {
    System.out.println(" title: " + entry.getTitle().getPlainText());
    System.out.println(" id: " + getEntryId(entry));
    if (entry.getParentLink() != null) {
      System.out.println(" parent id: " + getEntryId(entry.getParentLink().getHref()));
    }
    System.out.println(" author: " + entry.getAuthors().get(0).getEmail());
    System.out.println(" content: " + getContentBlob(entry));
  }

  System.out.println("Listing all ListPageEntry:");
  for (ListPageEntry entry : contentFeed.getEntries(ListPageEntry.class)) {
    System.out.println(" title: " + entry.getTitle().getPlainText());
    System.out.println(" id: " + getEntryId(entry));
    for (Column col : entry.getData().getColumns()) {
      System.out.print(" [" + col.getIndex() + "] " + col.getName() + "\t");
    }
  }

  for (ListItemEntry entry : contentFeed.getEntries(ListItemEntry.class)) {
    for (Field field : entry.getFields()) {
      System.out.print(" [" + field.getIndex() + "] " + field.getValue() + "\t");
    }
    System.out.println("\n");
  }

  System.out.println("Listing all FileCabinetPageEntry:");
  for (FileCabinetPageEntry entry : contentFeed.getEntries(FileCabinetPageEntry.class)) {
    System.out.println(" title: " + entry.getTitle().getPlainText());
    System.out.println(" id: " + getEntryId(entry));
    System.out.println(" content: " + getContentBlob(entry));
  }

  System.out.println("Listing all CommentEntry:");
  for (CommentEntry entry : contentFeed.getEntries(CommentEntry.class)) {
    System.out.println(" in-reply-to: " + entry.getInReplyTo().toString());
    System.out.println(" content: " + getContentBlob(entry));
  }

  System.out.println("Listing all AnnouncementsPageEntry:");
  for (AnnouncementsPageEntry entry : contentFeed.getEntries(AnnouncementsPageEntry.class)) {
    System.out.println(" title: " + entry.getTitle().getPlainText());
    System.out.println(" id: " + getEntryId(entry));
    System.out.println(" content: " + getContentBlob(entry));
  }

  System.out.println("Listing all AnnouncementEntry:");
  for (AnnouncementEntry entry : contentFeed.getEntries(AnnouncementEntry.class)) {
    System.out.println(" title: " + entry.getTitle().getPlainText());
    System.out.println(" id: " + getEntryId(entry));
    if (entry.getParentLink() != null) {
      System.out.println(" parent id: " + getEntryId(entry.getParentLink().getHref()));
    }
    System.out.println(" draft?: " + entry.isDraft());
    System.out.println(" content: " + getContentBlob(entry));
  }

  System.out.println("Listing all AttachmentEntry:");
  for (AttachmentEntry entry : contentFeed.getEntries(AttachmentEntry.class)) {
    System.out.println(" title: " + entry.getTitle().getPlainText());
    System.out.println(" id: " + getEntryId(entry));
    if (entry.getParentLink() != null) {
      System.out.println(" parent id: " + getEntryId(entry.getParentLink().getHref()));
    }
    if (entry.getSummary() != null) {
      System.out.println(" description: " + entry.getSummary().getPlainText());
    }
    System.out.println(" revision: " + entry.getRevision().getValue());
    MediaContent content = (MediaContent) entry.getContent();
    System.out.println(" src: " + content.getUri());
    System.out.println(" content type: " + content.getMimeType().getMediaType());
  }

  System.out.println("Listing all WebAttachmentEntry:");
  for (WebAttachmentEntry entry : contentFeed.getEntries(WebAttachmentEntry.class)) {
    System.out.println(" title: " + entry.getTitle().getPlainText());
    System.out.println(" id: " + getEntryId(entry));
    if (entry.getParentLink() != null) {
      System.out.println(" parent id: " + getEntryId(entry.getParentLink().getHref()));
    }
    if (entry.getSummary() != null) {
      System.out.println(" description: " + entry.getSummary().getPlainText());
    }
    System.out.println(" src: " + ((MediaContent) entry.getContent()).getUri());
  }
}

הערה: יכול להיות שיהיה צורך באימות כדי לגשת לפיד הזה, ויכול להיות שלא. זה תלוי בהרשאות השיתוף של האתר. אם האתר לא ציבורי, הלקוח צריך לעבור אימות באמצעות אסימון AuthSub,‏ OAuth או ClientLogin. מידע נוסף זמין במאמר בנושא אימות בשירות Sites.

דוגמאות לשאילתות בפיד תוכן

אפשר לחפש בפיד התוכן באמצעות חלק מפרמטרי השאילתה הרגילים של Google Data API ופרמטרים שספציפיים ל-Sites API הקלאסי. מידע מפורט יותר ורשימה מלאה של הפרמטרים הנתמכים זמינים במדריך העזר.

הערה: בדוגמאות שבקטע הזה נעשה שימוש בשיטה buildContentFeedUrl() שמוסברת במאמר אחזור פיד התוכן.

אחזור של סוגי רשומות ספציפיים

כדי לאחזר רק סוג מסוים של רשומה, משתמשים בפרמטר 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";

אפשר ליצור תוכן חדש (דפי אינטרנט, דפי רשימות, דפי ארון קבצים, דפי הודעות וכו') על ידי שליחת HTTP POST לפיד התוכן:

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 וכותרת דף 'New Webpage Title'. כלומר, <atom:title> מנורמלת ל-new-webpage-title בכתובת ה-URL. כדי להתאים אישית את נתיב כתובת ה-URL של דף, אפשר להגדיר את רכיב <sites:pageName>.

בדוגמה הזו נוצר דף חדש filecabinet עם הכותרת 'File Storage', אבל הדף נוצר בכתובת 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 של הדף:

  1. <sites:pageName>, אם יש. חייב להיות לפחות a-z, A-Z, 0-9, -, _.
  2. <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>, עדיין צריך לכלול אחד כזה ברשומה. חשוב לזכור שאם כוללים רכיב <content>, השרת ידחה אותו.

העלאת קבצים

בדומה ל-Google Sites, ה-API תומך בהעלאת קבצים מצורפים לדף של ספריית קבצים או לדף אב.

כדי להעלות קובץ מצורף לנכס אב, שולחים בקשת HTTP POST לכתובת ה-URL של פיד התוכן:

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

צריך להעלות את כל סוגי הקבצים המצורפים לדף ברמה העליונה. לכן, צריך להגדיר קישור הורה באובייקט AttachmentEntry או WebAttachmentEntry שאתם מנסים להעלות. מידע נוסף זמין במאמר בנושא יצירת דפי משנה.

הקבצים מועלים

בדוגמה הזו, קובץ PDF מועלה אל הפיד הראשון FileCabinetPageEntry שנמצא בפיד התוכן של המשתמש. הקובץ המצורף נוצר עם הכותרת 'Getting Started' (תחילת העבודה) ותיאור (אופציונלי) 'HR packet' (חבילת משאבי אנוש).

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 של דף

אפשר לערוך את המטא-נתונים (כותרת, 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 Sites, קודם צריך לאחזר את רשומת התוכן ואז לקרוא ל-delete() של הרשומה.

entry.delete();

אפשר גם להשתמש בשיטה delete() של מחלקת השירות על ידי העברת הקישור edit וערך ה-ETag של הרשומה:

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

אם הערך נמחק בהצלחה, השרת משיב עם קוד HTTP 200 OK.

חזרה למעלה



הורדת קבצים מצורפים

כדי להוריד AttachmentEntry, שולחים בקשת HTTP GET לקישור של מקור התוכן של הרשומה.

בדוגמה הזו, המערכת מורידה את הפריט הראשון AttachmentEntry שנמצא בפיד התוכן של המשתמש לספרייה '/path/to/save/file/':

private void downloadFile(String downloadUrl, String fullFilePath) throws IOException, ServiceException {
  System.out.println("Downloading file from: " + downloadUrl);

  MediaContent mc = new MediaContent();
  mc.setUri(downloadUrl);
  MediaSource ms = service.getMedia(mc);

  InputStream inStream = null;
  FileOutputStream outStream = null;

  try {
    inStream = ms.getInputStream();
    outStream = new FileOutputStream(fullFilePath);

    int c;
    while ((c = inStream.read()) != -1) {
      outStream.write(c);
    }
  } finally {
    if (inStream != null) {
      inStream.close();
    }
    if (outStream != null) {
      outStream.flush();
      outStream.close();
    }
  }
}

public void downloadAttachment(AttachmentEntry entry, String directory) throws IOException, ServiceException {
  String url = ((OutOfLineContent) entry.getContent()).getUri();
  downloadFile(url, directory + entry.getTitle().getPlainText()); // Use entry's title for the save filename
}

ContentFeed contentFeed = client.getFeed(
    new URL(buildContentFeedUrl() + "?kind=attachment&max-results=1"), ContentFeed.class);

downloadAttachment(contentFeed.getEntries(AttachmentEntry.class).get(0), "/path/to/save/file/");
System.out.println("Downloaded.");

חזרה למעלה

פיד ACL

סקירה כללית של הרשאות שיתוף (רשימות ACL)

כל רשומת ACL בפיד ה-ACL מייצגת תפקיד גישה של ישות מסוימת, משתמש, קבוצת משתמשים, דומיין או גישת ברירת המחדל (שהיא אתר ציבורי). יוצגו רק רשומות של ישויות עם גישה מפורשת – תופיע רשומה אחת לכל כתובת אימייל בחלונית 'אנשים עם גישה' במסך השיתוף של ממשק המשתמש של Google Sites. לכן, אדמינים של דומיין לא יוצגו, גם אם יש להם גישה משתמעת לאתר.

תפקידים

רכיב התפקיד מייצג רמת גישה שישות יכולה לקבל. יש ארבעה ערכים אפשריים לרכיב gAcl:role:

  • reader – צופה (מקביל להרשאת קריאה בלבד).
  • כותב – שותף עריכה (שווה ערך לגישת קריאה/כתיבה).
  • בעלים – בדרך כלל האדמין של האתר (שווה ערך לגישת קריאה/כתיבה).

טווחים

רכיב ההיקף מייצג את הישות שיש לה את רמת הגישה הזו. יש ארבעה סוגים אפשריים של רכיב gAcl:scope:

  • user – ערך של כתובת אימייל, למשל user@gmail.com.
  • group – כתובת אימייל של קבוצה ב-Google, למשל group@domain.com.
  • domain – שם דומיין G Suite, למשל "domain.com".
  • default – יש רק היקף אחד אפשרי מסוג default, שאין לו ערך (למשל <gAcl:scope type="default">). ההיקף הספציפי הזה שולט בגישה שיש לכל משתמש כברירת מחדל באתר ציבורי.

הערה: אי אפשר להגדיר לדומיינים את הערך gAcl:role 'גישת בעלים', אלא רק 'גישת קריאה' או 'גישת כתיבה'.

אחזור פיד ה-ACL

אפשר להשתמש במחלקות AclFeed ו-AclEntry כדי לשלוט בהרשאות השיתוף של אתר, ואפשר לאחזר אותן באמצעות השיטה getFeed() של מחלקת השירות.

בדוגמה הבאה מתבצעת אחזור של פיד ה-ACL של אתר נתון, וההרשאות של כל AclEntry מודפסות:

public String getAclFeedUrl(String siteName) {
  String domain = "site";  // OR if the Site is hosted on G Suite, your domain (e.g. example.com)
  return "https://sites.google.com/feeds/acl/site/" + domain + "/" + siteName + "/";
}

public void getAclFeed(String siteName) throws IOException, ServiceException {
  AclFeed aclFeed = client.getFeed(new URL(getAclFeedUrl(siteName)), AclFeed.class);
  for (AclEntry entry : aclFeed.getEntries()) {
    System.out.println(entry.getScope().getValue() + " (" + entry.getScope().getType() + ") : " +
                       entry.getRole().getValue());
  }
}

getAclFeed('my-site-name');

אם אתם עובדים עם רשומות ב-SiteFeed, כל SiteEntry מכיל קישור לפיד ACL שלו. לדוגמה, קטע הקוד הבא מאחזר את פיד ה-ACL של SiteEntry:

String aclLink = siteEntry.getLink(SitesAclFeedLink.Rel.ACCESS_CONTROL_LIST, Link.Type.ATOM).getHref();
AclFeed aclFeed = client.getFeed(new URL(aclLink), AclFeed.class);

שיתוף אתר

הערה: יכול להיות שיהיה אפשר להגדיר רשימות ACL מסוימות לשיתוף רק אם הדומיין מוגדר לאפשר הרשאות כאלה (למשל, אם השיתוף מחוץ לדומיין מופעל בדומיינים של G Suite וכו').

כדי לשתף אתר Google 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 הרלוונטי, לשנות את ההרשאה לפי הצורך ואז להפעיל את השיטה update() של AclEntry כדי לשנות את רשימת בקרת הגישה בשרת.

בדוגמה הזו אנחנו משנים את הדוגמה הקודמת aclEntry מהקטע שיתוף אתר, ומעדכנים את הערך user@example.com ל-writer (שותף עריכה):

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

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

מידע נוסף על ETags זמין במדריך בנושא Google Data APIs.

הסרת הרשאות שיתוף

כדי להסיר הרשאת שיתוף, קודם צריך לאחזר את AclEntry ואז להפעיל את שיטת ה-delete() שלו:

aclEntry.delete();

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

מידע נוסף על ETags זמין במדריך בנושא Google Data APIs.

חזרה למעלה

נושאים מיוחדים

שליפה חוזרת של פיד או רשומה

אם רוצים לאחזר פיד או רשומה שכבר אחזרתם בעבר, אפשר לשפר את היעילות ולבקש מהשרת לשלוח את הרשימה או הרשומה רק אם הן השתנו מאז הפעם האחרונה שאחזרתם אותן.

כדי לבצע אחזור מותנה כזה, גם השיטה getFeed() וגם השיטה getEntry() מספקות ארגומנט נוסף שמקבל ערך ETag או אובייקט DateTime עבור הכותרת If-Modified-Since. אפשר לגשת ל-etag של רשומה מ-entry.getEtag().

בדוגמה הזו מתבצעת אחזור מותנה של רשומה בדף אינטרנט עם תוכן:

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

כשהשרת מקבל את הבקשה הזו, הוא בודק אם לפריט שביקשת יש את אותו ETag כמו ה-ETag שציינת. אם ערכי ה-ETag זהים, סימן שהפריט לא השתנה והשרת מחזיר חריגה מסוג HTTP 304 NotModifiedException.

אם ערכי ה-ETag לא זהים, סימן שהפריט שונה מאז הפעם האחרונה שביקשתם אותו, והשרת מחזיר את הפריט.

מידע נוסף על ETags זמין במדריך בנושא Google Data APIs.

חזרה למעלה