คู่มือภาษา Java

สำคัญ: เอกสารนี้เขียนก่อนปี 2012 ตัวเลือกการตรวจสอบสิทธิ์ ดังที่อธิบายไว้ในเอกสารนี้ (OAuth 1.0, AuthSub และ ClientLogin) ได้รับการ เลิกใช้งานแล้วอย่างเป็นทางการ ตั้งแต่วันที่ 20 เมษายน 2012 และไม่สามารถใช้ได้อีกต่อไป เราขอแนะนำให้คุณย้ายข้อมูลไปยัง OAuth 2.0 โดยเร็วที่สุด

Google Sites Data API ช่วยให้แอปพลิเคชันไคลเอ็นต์เข้าถึง เผยแพร่ และแก้ไขเนื้อหาภายในเว็บไซต์จาก Google Sites ได้ นอกจากนี้ แอปพลิเคชันไคลเอ็นต์ของคุณยังสามารถขอรายการกิจกรรมล่าสุด เรียกประวัติการแก้ไข และดาวน์โหลดไฟล์แนบได้ด้วย

นอกเหนือจากการให้ข้อมูลพื้นฐานเกี่ยวกับความสามารถของ 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 เวอร์ชันล่าสุด)

หลังจากติดตั้ง .jars แล้ว คุณจะต้องเพิ่มสิ่งต่อไปนี้ในโปรเจ็กต์

  1. java/lib/gdata-sites-2.0.jar - เวอร์ชัน 2.0 ในที่นี้มีไว้สำหรับเวอร์ชัน 1.4 ของ Sites API แบบคลาสสิก
  2. java/lib/gdata-core-1.0.jar
  3. java/lib/gdata-client-1.0.jar
  4. java/lib/gdata-spreadsheet-3.0.jar (หากดำเนินการกับหน้ารายการ / รายการ)

นอกจากนี้ อย่าลืมใส่ Jars ของทรัพยากร Dependency (gdata-media-1.0.jar, mail.jar และ google-collect....jar)

การเรียกใช้แอปพลิเคชันตัวอย่าง

แอปพลิเคชันตัวอย่างที่ใช้งานได้เต็มรูปแบบอยู่ในไดเรกทอรีย่อย /java/sample/sites ของการดาวน์โหลด gdata-samples.java.zip นอกจากนี้ คุณยังดูแหล่งที่มาได้ที่ /trunk/java/sample/sites/ ในที่เก็บ SVN ที่เข้าถึงได้จากแท็บแหล่งที่มา SitesDemo.java ช่วยให้ผู้ใช้ดำเนินการหลายอย่าง ซึ่งสาธิตวิธีใช้ Sites API แบบคลาสสิก

โปรดทราบว่าคุณจะต้องใส่ java/sample/util/lib/sample-util.jar เพื่อเรียกใช้ตัวอย่าง

กำลังเริ่มโปรเจ็กต์ของคุณเอง

เคล็ดลับ: ดูบทความการใช้ Eclipse กับ Google Data API สำหรับการตั้งค่าที่รวดเร็วด้วยปลั๊กอิน 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 แบบคลาสสิก

ไลบรารีของไคลเอ็นต์ 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 โปรดดู "ต้องระบุ SSL" การตั้งค่าในแผงควบคุมการดูแลระบบจะเป็นไปตาม API คุณสามารถบังคับทั้งหมด คำขอ 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 ในตัวอย่างด้านบน
  • บูลีนที่ 2 เพื่อระบุว่าหลังจากนั้นจะมีการแลกเปลี่ยนโทเค็นเป็นโทเค็นเซสชันหรือไม่ 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() ในฟีดเว็บไซต์

ตัวอย่างนี้สร้างเว็บไซต์ใหม่โดยมีธีมเป็น "แถบสเลท" (การตั้งค่าที่ไม่บังคับ) และให้ ชื่อเว็บไซต์ (ต้องระบุ) และคำอธิบาย (ไม่บังคับ):

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 ที่มีเว็บไซต์ดังกล่าวก่อน แก้ไขพร็อพเพอร์ตี้อย่างน้อย 1 รายการ แล้วเรียกเมธอด 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 3 รายการที่ชี้ไปยังเว็บไซต์ 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

ใช้คลาส ActivityFeed ในไคลเอ็นต์ Java เพื่อแสดงผลออบเจ็กต์ ActivityEntry

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

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

หมายเหตุ: คุณต้องเป็นผู้ทำงานร่วมกันหรือเจ้าของเว็บไซต์จึงจะเข้าถึงฟีดนี้ได้ ไคลเอ็นต์ของคุณต้องตรวจสอบสิทธิ์โดยใช้โทเค็น AuthSub, OAuth หรือ ClientLogin โปรดดูการตรวจสอบสิทธิ์กับบริการ Sites

กลับไปด้านบน

ฟีดการแก้ไข

หากต้องการเรียกประวัติการแก้ไขสำหรับรายการเนื้อหา ให้ส่ง HTTP GET ไปยังลิงก์การแก้ไขของรายการ ดังนี้

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

ตัวอย่างนี้จะค้นหาฟีดเนื้อหา แล้วดึงข้อมูลฟีดการแก้ไขสำหรับรายการเนื้อหาแรก

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

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

หมายเหตุ: คุณต้องเป็นผู้ทำงานร่วมกันหรือเจ้าของเว็บไซต์จึงจะเข้าถึงฟีดนี้ได้ ไคลเอ็นต์ของคุณต้องตรวจสอบสิทธิ์โดยใช้โทเค็น AuthSub, OAuth หรือ ClientLogin โปรดดูการตรวจสอบสิทธิ์กับบริการ Sites

กลับไปด้านบน

ฟีดเนื้อหา

กำลังเรียกฟีดเนื้อหา

ฟีดเนื้อหาจะแสดงรายการเนื้อหาล่าสุดของเว็บไซต์ คุณสามารถเข้าถึงได้โดยส่ง HTTP GET ไปยัง URL ของฟีดเนื้อหา

https://sites.google.com/feeds/content/site/siteName
พารามิเตอร์ฟีดคำอธิบาย
site"site" หรือโดเมนของโดเมนที่โฮสต์ใน G Suite ของคุณ (เช่น example.com)
siteNameชื่อเว็บสเปซของเว็บไซต์ ที่พบใน URL ของเว็บไซต์ (เช่น mySite)

ตัวอย่างการดึงฟีดเนื้อหา

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

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

contentFeed ที่ได้จะเป็นออบเจ็กต์ ContentFeed ที่มีการตอบสนองจากเซิร์ฟเวอร์ แต่ละรายการ จาก contentFeed แสดงถึงหน้าเว็บหรือรายการอื่นภายในไซต์ของผู้ใช้ ContentFeed จะมีหลายประเภท ของออบเจ็กต์ ทั้งหมดรับค่าจาก BaseContentEntry: ListItemEntry, ListPageEntry, AttachmentEntry, WebAttachmentEntry FileCabinetPageEntry, AnnouncementsPageEntry, AnnouncementEntry, WebPageEntry, CommentEntry

นี่คือตัวอย่างของการแสดงรายการประเภทต่างๆ ใน ContentFeed ข้อมูลแต่ละประเภทมีพร็อพเพอร์ตี้แตกต่างกัน แต่มีเพียงบางรายการเท่านั้นที่ไม่ได้พิมพ์ไว้ที่นี่

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

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

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

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

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

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

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

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

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

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

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

หมายเหตุ: ฟีดนี้อาจต้องมีการตรวจสอบสิทธิ์หรือไม่ก็ได้ ขึ้นอยู่กับสิทธิ์การแชร์ของเว็บไซต์ หากไซต์ไม่เป็นสาธารณะ ไคลเอ็นต์ของคุณต้องตรวจสอบสิทธิ์โดยใช้โทเค็น AuthSub, OAuth หรือ ClientLogin โปรดดู การตรวจสอบสิทธิ์กับบริการ Sites

ตัวอย่างการค้นหาฟีดเนื้อหา

คุณสามารถค้นหาฟีดเนื้อหาโดยใช้พารามิเตอร์การค้นหาของ Google Data API มาตรฐานบางรายการ และข้อมูลเฉพาะสำหรับ Sites API แบบคลาสสิก สำหรับข้อมูลโดยละเอียดเพิ่มเติมและรายการพารามิเตอร์ที่รองรับทั้งหมด โปรดดู คู่มืออ้างอิง

หมายเหตุ: ตัวอย่างในส่วนนี้จะใช้เมธอด buildContentFeedUrl() ในการดึงข้อมูลฟีดเนื้อหา

กำลังดึงข้อมูลประเภทรายการที่เจาะจง

หากต้องการดึงข้อมูลประเภทรายการเฉพาะ ให้ใช้พารามิเตอร์ 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());
}

หากต้องการแสดงผลรายการมากกว่า 1 ประเภท ให้คั่น 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 บางส่วนสำหรับเนื้อหาของหน้า และตั้งค่าชื่อส่วนหัวเป็น "ชื่อหน้าเว็บใหม่":

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 ใหม่ที่มีส่วนหัวเป็น "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" และ "เทมเพลต" ตามลำดับ

ตัวอย่างนี้สร้างเทมเพลต webpage ใหม่

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

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

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

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

การสร้างหน้าเว็บจากเทมเพลต

เช่นเดียวกับการสร้างเทมเพลตของหน้าเว็บ คุณสามารถสร้างอินสแตนซ์ใหม่จากเทมเพลตโดยรวม <link> เข้ากับ rel='http://schemas.google.com/sites/2008#template' การชี้ ไปยังลิงก์ของตัวเองของเทมเพลตหน้าเว็บ

ตัวอย่างนี้สร้างเทมเพลต filecabinet ใหม่และจะสร้างอินสแตนซ์ filecabinet ใหม่จากเทมเพลตนั้น

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

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

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

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

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

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

หมายเหตุ: แม้จะมีเทมเพลตที่กำหนด <category> ไว้ ซึ่งรวมถึงเทมเพลตใน ยังคงต้องเข้าร่วม และโปรดทราบว่า ถ้าคุณรวมองค์ประกอบ <content> เซิร์ฟเวอร์จะปฏิเสธ

กำลังอัปโหลดไฟล์

API รองรับการอัปโหลดไฟล์แนบไปยังหน้าจัดการไฟล์หรือหน้าหลักเช่นเดียวกับใน Google Sites

หากต้องการอัปโหลดไฟล์แนบให้ระดับบนสุด ให้ส่งคำขอ HTTP POST ไปยัง URL ของฟีดเนื้อหาโดยทำดังนี้

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

ต้องอัปโหลดไฟล์แนบทุกประเภทไปยังหน้าหลัก ดังนั้น คุณจึงตั้งค่าลิงก์หลักใน AttachmentEntry หรือออบเจ็กต์ WebAttachmentEntry รายการที่คุณพยายามอัปโหลด ดูการสร้างหน้าเว็บย่อยสำหรับข้อมูลเพิ่มเติม

กำลังอัปโหลดไฟล์

ตัวอย่างนี้อัปโหลดไฟล์ PDF ไปยัง FileCabinetPageEntry ไฟล์แรกที่พบในฟีดเนื้อหาของผู้ใช้ ระบบจะสร้างไฟล์แนบที่มีชื่อว่า "เริ่มต้นใช้งาน" และคำอธิบาย (ไม่บังคับ) "แพ็กเก็ต HR"

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 ให้ใส่หมวดหมู่ที่มีคำว่า "คำ" เป็นชื่อโฟลเดอร์ ตัวอย่างเช่น เพิ่มบรรทัดนี้ใน uploadAttachment():

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

ไฟล์แนบจากเว็บ

ไฟล์แนบบนเว็บเป็นไฟล์แนบชนิดพิเศษ โดยพื้นฐานแล้ว เป็นลิงก์ที่เชื่อมโยงไปยังไฟล์อื่นๆ บนเว็บ ที่คุณสามารถเพิ่มลงในรายการตู้ไฟล์ของคุณได้ ฟีเจอร์นี้คล้ายกับ "เพิ่มไฟล์ด้วย URL" ใน UI ของ Google Sites

หมายเหตุ: สามารถสร้างไฟล์แนบในเว็บได้ภายใต้หน้าจัดการไฟล์เท่านั้น แต่จะอัปโหลดไปยังหน้าเว็บประเภทอื่นๆ ไม่ได้

ตัวอย่างนี้สร้าง WebAttachmentEntry ใต้ FileCabinetPageEntry แรกที่พบในฟีดเนื้อหาของผู้ใช้ ตั้งชื่อและคำอธิบาย (ไม่บังคับ) เป็น "GoogleLogo" และ "สีสวย" ตามลำดับ

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

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

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

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

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

POST จะสร้างลิงก์ในหน้าจัดการไฟล์ของผู้ใช้ที่ชี้ไปยังรูปภาพที่ "http://www.google.com/images/logo.gif"

กลับไปด้านบน



การอัปเดตเนื้อหา

การอัปเดตข้อมูลเมตาของหน้าเว็บและ/หรือเนื้อหา HTML

ข้อมูลเมตา (ชื่อ, pageName ฯลฯ) และเนื้อหาหน้าเว็บของ BaseContentEntry ประเภทใดก็ตามสามารถแก้ไขได้โดย โดยใช้เมธอด update() ของรายการ ที่จะส่งคำขอ HTTP PUT ไปยัง edit ของรายการ ลิงก์

ด้านล่างนี้คือตัวอย่างการอัปเดต ListPageEntry ด้วยการเปลี่ยนแปลงต่อไปนี้

  • แก้ไขชื่อเป็น "รายการที่อัปเดตแล้ว"
  • เนื้อหา HTML ของหน้าเว็บได้รับการอัปเดตเป็น "<p>เนื้อหา HTML ที่อัปเดต</p>"
  • ส่วนหัวของคอลัมน์แรกของรายการเปลี่ยนเป็น "เจ้าของ"
ContentFeed contentFeed = client.getFeed(
    new URL(buildContentFeedUrl() + "?kind=listpage"), ContentFeed.class);
ListPageEntry listPage = contentFeed.getEntries(ListPageEntry.class).get(0); // Update first list page found

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

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

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

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

ListPageEntry updatedEntry = listPage.update();

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

การอัปเดตเนื้อหาของไฟล์แนบ

สำหรับ AttachmentEntry คุณยังอัปเดตเนื้อหาได้โดยการตั้งค่า MediaSource ของรายการ แล้วใช้ เมธอด updateMedia(boolean) ของรายการ

ตัวอย่างนี้จะอัปเดตเนื้อหาของไฟล์แนบที่มีอยู่

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

ตัวอย่างจะส่งคำขอ HTTP PUT ไปยังลิงก์ edit-media ของรายการ ผลลัพธ์ AttachmentEntry จะมีเนื้อหาที่อัปเดต

การอัปเดตข้อมูลเมตา + เนื้อหาของไฟล์แนบ

คุณสามารถอัปเดตข้อมูลเมตาของไฟล์แนบและเนื้อหาของไฟล์แนบในการโทรเดียวกันได้โดยใช้เมธอด updateMedia() ถ้าคุณสามารถอัปเดตเฉพาะเนื้อหาไฟล์ ข้อมูลเมตา หรือทั้งสองอย่าง

ตัวอย่างนี้เปลี่ยนชื่อไฟล์แนบเป็น "ชื่อใหม่" อัปเดตคำอธิบาย และแทนที่เนื้อหาไฟล์ด้วยไฟล์ .zip ใหม่ เนื่องจากคำขอมีเนื้อหาไฟล์ใหม่ ระบบจึงใช้ updateMedia() ของ AttachmentEntry

public AttachmentEntry updateAttachment(AttachmentEntry entry, File newFile, String newTitle, String newDescription)
    throws IOException, ServiceException  {
  // See Uploading Attachments for the definition of mediaTypes.
  entry.setMediaSource(new MediaFileSource(newFile, mediaTypes.getContentType(newFile)));
  entry.setTitle(new PlainTextConstruct(newTitle));
  entry.setSummary(new PlainTextConstruct(newDescription));

  return entry.updateMedia(true);
}

ContentFeed contentFeed = client.getFeed(
    new URL(buildContentFeedUrl() + "?kind=attachment&max-results=1"), ContentFeed.class);
AttachmentEntry attachment = contentFeed.getEntries(AttachmentEntry.class).get(0); // Update first attachment found

AttachmentEntry updatedAttachment = updateAttachment(attachment, new File("/path/to/file.zip"), "New Title", "better stuff");

กลับไปด้านบน



การลบเนื้อหา

หากต้องการนำหน้าหรือรายการออกจากเว็บไซต์จาก Google 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 ไปยังลิงก์ content 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 แสดงบทบาทการเข้าถึงของเอนทิตีหนึ่งๆ ซึ่งอาจเป็นผู้ใช้ กลุ่มผู้ใช้ โดเมน หรือการเข้าถึงเริ่มต้น (ซึ่งเป็นเว็บไซต์สาธารณะ) ระบบจะแสดงรายการสำหรับบุคคลที่มีสิทธิ์การเข้าถึงอย่างชัดแจ้งเท่านั้น โดยจะแสดง 1 รายการ สำหรับแต่ละอีเมลใน "ผู้ที่มีสิทธิ์เข้าถึง" ในหน้าจอการแชร์ของ UI ของ Google Sites ดังนั้นระบบจะไม่แสดงผู้ดูแลระบบโดเมน แม้ว่าพวกเขาจะมีสิทธิ์เข้าถึงเว็บไซต์โดยปริยายก็ตาม

บทบาท

องค์ประกอบบทบาทแสดงถึงระดับการเข้าถึงที่เอนทิตีหนึ่งๆ มีได้ ค่าที่เป็นไปได้ขององค์ประกอบ gAcl:role มีอยู่ 4 ค่า ได้แก่

  • reader — ผู้มีสิทธิ์อ่าน (เทียบเท่ากับสิทธิ์การเข้าถึงระดับอ่านอย่างเดียว)
  • writer — ผู้ทำงานร่วมกัน (เทียบเท่ากับสิทธิ์การอ่าน/เขียน)
  • owner — โดยทั่วไปคือผู้ดูแลระบบไซต์ (เทียบเท่ากับสิทธิ์การอ่าน/เขียน)

ขอบเขต

องค์ประกอบขอบเขตแสดงถึงเอนทิตีที่มีระดับการเข้าถึงนี้ องค์ประกอบ gAcl:scope ที่เป็นไปได้มี 4 ประเภทดังนี้

  • user — ค่าที่อยู่อีเมล เช่น "user@gmail.com"
  • group — ที่อยู่อีเมลของกลุ่ม Google เช่น "group@domain.com"
  • domain — ชื่อโดเมน G Suite เช่น "domain.com"
  • default — มีขอบเขตประเภท "ค่าเริ่มต้น" ที่เป็นไปได้เพียง 1 ขอบเขตซึ่งไม่มีค่า (เช่น <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 เพื่อแก้ไข 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 API

กำลังลบสิทธิ์การแชร์

หากต้องการนำสิทธิ์การแชร์ออก ให้เรียกข้อมูล AclEntry ก่อน จากนั้นจึงเรียกใช้เมธอด delete() ของสิทธิ์นั้น

aclEntry.delete();

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

ดูข้อมูลเพิ่มเติมเกี่ยวกับ ETag ได้จากคู่มืออ้างอิงสำหรับ Google Data API

กลับไปด้านบน

หัวข้อพิเศษ

การดึงข้อมูลฟีดหรือรายการอีกครั้ง

ถ้าต้องการเรียกฟีดหรือรายการที่เคยดึงข้อมูลมาก่อน คุณสามารถปรับปรุงประสิทธิภาพได้โดยบอก เซิร์ฟเวอร์จะส่งรายการหรือรายการได้ต่อเมื่อมีการเปลี่ยนแปลงนับตั้งแต่ที่คุณดึงข้อมูลมาครั้งล่าสุดเท่านั้น

ในการดึงข้อมูลแบบมีเงื่อนไขแบบนี้ ทั้งเมธอด getFeed() และ getEntry() จะมี อาร์กิวเมนต์เพิ่มเติมที่ยอมรับค่า ETag หรือออบเจ็กต์ DateTime สำหรับส่วนหัว If-Modified-Since คุณเข้าถึงแท็กของรายการได้จาก entry.getEtag()

ตัวอย่างนี้เป็นการดึงข้อมูลแบบมีเงื่อนไขสำหรับรายการหน้าเว็บเนื้อหา

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

เมื่อเซิร์ฟเวอร์ได้รับคำขอนี้ เซิร์ฟเวอร์จะตรวจสอบว่ารายการที่คุณขอมี ETag เหมือนกับ ETag ที่คุณระบุ หาก ETag ตรงกัน แสดงว่ารายการไม่มีการเปลี่ยนแปลง และเซิร์ฟเวอร์แสดง ระบบจะส่งข้อยกเว้น HTTP 304 NotModifiedException

หาก ETag ไม่ตรงกัน แสดงว่ารายการนั้นมีการแก้ไขตั้งแต่ตอนที่คุณส่งคำขอครั้งล่าสุด และเซิร์ฟเวอร์ส่งสินค้าคืนมา

ดูข้อมูลเพิ่มเติมเกี่ยวกับ ETag ได้จากคู่มืออ้างอิงสำหรับ Google Data API

กลับไปด้านบน