מדריך לשפת 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 Data ל-Java.

תחילת העבודה

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

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

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

  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 של ה-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 (אם עובדים עם דפי רשימות או פריטים ברשימה)

כמו כן, הקפידו לכלול את צנצנות התלות (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

ביטול אסימון סשן

שימוש ב-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 של דף:

  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> בתבנית, עדיין צריך לכלול <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.

חזרה למעלה