สำคัญ: เอกสารนี้เขียนขึ้นก่อนปี 2012 ตัวเลือกการให้สิทธิ์ ที่อธิบายไว้ในเอกสารนี้ (OAuth 1.0, AuthSub และ ClientLogin) ได้รับการ เลิกใช้งานอย่างเป็นทางการ ตั้งแต่วันที่ 20 เมษายน 2012 และไม่มีให้บริการอีกต่อไป เราขอแนะนำให้คุณย้ายข้อมูลไปยัง OAuth 2.0 โดยเร็วที่สุด
Google Sites Data API อนุญาตให้แอปพลิเคชันไคลเอ็นต์เข้าถึง เผยแพร่ และแก้ไขเนื้อหาภายใน Google Site นอกจากนี้ แอปพลิเคชันไคลเอ็นต์ยังขอรายการกิจกรรมล่าสุด ดึงประวัติการแก้ไข และดาวน์โหลดไฟล์แนบได้ด้วย
นอกจากจะให้ข้อมูลพื้นฐานเกี่ยวกับความสามารถของ Sites Data API แล้ว คู่มือนี้ยังแสดงตัวอย่างการโต้ตอบกับ API โดยใช้ไลบรารีของไคลเอ็นต์ Java ด้วย ดูความช่วยเหลือในการตั้งค่าไลบรารีของไคลเอ็นต์ได้ที่การเริ่มต้นใช้งานไลบรารีของไคลเอ็นต์ Google Data สำหรับ Java หากคุณสนใจที่จะทำความเข้าใจเพิ่มเติมเกี่ยวกับโปรโตคอลพื้นฐานที่ไลบรารีของไคลเอ็นต์ Java ใช้เพื่อโต้ตอบกับ Classic Sites API โปรดดูคู่มือโปรโตคอล
กลุ่มเป้าหมาย
เอกสารนี้มีไว้สำหรับนักพัฒนาซอฟต์แวร์ที่ต้องการเขียนแอปพลิเคชันไคลเอ็นต์ที่โต้ตอบกับ Google Sites โดยใช้ไลบรารีของไคลเอ็นต์ Google Data Java
เริ่มต้นใช้งาน
Google Sites ใช้บัญชี Google หรือบัญชี G Suite ในการตรวจสอบสิทธิ์ หากมีบัญชีอยู่แล้ว คุณก็พร้อมใช้งานได้ หรือจะสร้างบัญชีใหม่ก็ได้
การติดตั้งไลบรารี
หากต้องการความช่วยเหลือในการตั้งค่าและติดตั้งไลบรารีของไคลเอ็นต์ โปรดดูการเริ่มต้นใช้งานไลบรารีของไคลเอ็นต์ Google Data Java หากคุณใช้ Eclipse บทความนั้นจะอธิบายวิธีตั้งค่าโปรเจ็กต์โดยใช้ปลั๊กอิน Google Data APIs Eclipse ด้วย สิ่งที่ต้องใช้เพื่อเริ่มต้นใช้งานมีดังนี้
- ติดตั้ง Java 1.5 ขึ้นไป
- ดาวน์โหลดไลบรารีของไคลเอ็นต์ (
gdata-src.java.zipเวอร์ชันล่าสุด) - ดาวน์โหลดรายการการอ้างอิง
- ดาวน์โหลดแอปพลิเคชันตัวอย่าง (
gdata-samples.java.zipเวอร์ชันล่าสุด)
หลังจากติดตั้ง .jars แล้ว คุณจะต้องรวมสิ่งต่อไปนี้ไว้ในโปรเจ็กต์
java/lib/gdata-sites-2.0.jar- เวอร์ชัน 2.0 ในที่นี้มีไว้สำหรับเวอร์ชัน 1.4 ของ Classic Sites APIjava/lib/gdata-core-1.0.jarjava/lib/gdata-client-1.0.jarjava/lib/gdata-spreadsheet-3.0.jar(หากทำงานกับหน้า / รายการในรายการ)
นอกจากนี้ อย่าลืมใส่ไฟล์ JAR ของการอ้างอิง (gdata-media-1.0.jar, mail.jar และ google-collect....jar)
การเรียกใช้แอปพลิเคชันตัวอย่าง
แอปพลิเคชันตัวอย่างที่ใช้งานได้เต็มรูปแบบจะอยู่ในไดเรกทอรีย่อย /java/sample/sites ของการดาวน์โหลด gdata-samples.java.zip
นอกจากนี้ คุณยังดูแหล่งที่มาได้ที่ /trunk/java/sample/sites/
ในที่เก็บ SVN ซึ่งเข้าถึงได้จากแท็บแหล่งที่มา SitesDemo.java ช่วยให้ผู้ใช้ดำเนินการต่างๆ ได้ ซึ่งแสดงให้เห็นวิธีใช้ Classic Sites API
โปรดทราบว่าคุณจะต้องรวม java/sample/util/lib/sample-util.jar เพื่อเรียกใช้ตัวอย่าง
การเริ่มต้นโปรเจ็กต์ของคุณเอง
เคล็ดลับ: ดูบทความการใช้ Eclipse กับ Google Data APIs เพื่อตั้งค่าอย่างรวดเร็วด้วยปลั๊กอิน Eclipse ของเรา
คุณจะต้องนำเข้าหลายครั้ง ทั้งนี้ขึ้นอยู่กับความต้องการของแอปพลิเคชัน เราขอแนะนำให้เริ่มต้นด้วยการนำเข้าต่อไปนี้
import com.google.gdata.client.*; import com.google.gdata.client.sites.*; import com.google.gdata.data.*; import com.google.gdata.data.acl.*; import com.google.gdata.data.media.*; import com.google.gdata.data.sites.*; import com.google.gdata.data.spreadsheet.*; // If working with listpages / listitems import com.google.gdata.util.*;
จากนั้นคุณจะต้องตั้งค่าออบเจ็กต์ SitesService ซึ่งแสดงถึงการเชื่อมต่อไคลเอ็นต์กับ Classic Sites API ด้วย
SitesService client = new SitesService("yourCo-yourAppName-v1");
อาร์กิวเมนต์ applicationName ควรเป็นไปตามรูปแบบ company-applicationname-version พารามิเตอร์นี้ใช้เพื่อวัตถุประสงค์ในการบันทึก
หมายเหตุ: ส่วนที่เหลือของคู่มือนี้จะถือว่าคุณสร้าง SitesService ในตัวแปร client
การตรวจสอบสิทธิ์ไปยัง API ของ Sites แบบคลาสสิก
คุณสามารถใช้ไลบรารีไคลเอ็นต์ 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 เพื่อตรวจสอบสิทธิ์ผู้ใช้และขอสิทธิ์เข้าถึงเอกสารของผู้ใช้ ไลบรารีของไคลเอ็นต์ Java สำหรับ Google Data มีฟังก์ชันที่ใช้ สร้าง 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 next - URL ที่ Google จะเปลี่ยนเส้นทางไป
หลังจากที่ผู้ใช้เข้าสู่ระบบบัญชีและให้สิทธิ์เข้าถึง
http://www.example.com/welcome.jspในตัวอย่างด้านบน - ขอบเขต -
https://sites.google.com/feeds/ในตัวอย่างด้านบน - บูลีนเพื่อระบุว่าจะใช้โทเค็นในโหมดที่ลงทะเบียนหรือไม่
falseในตัวอย่างด้านบน - บูลีนที่ 2 เพื่อระบุว่าโทเค็นจะแลกเปลี่ยนเป็นโทเค็นเซสชันในภายหลังหรือไม่
trueในตัวอย่างด้านบน
การอัปเกรดเป็นโทเค็นเซสชัน
ดูการใช้ AuthSub กับไลบรารีของไคลเอ็นต์ Google Data API
การเรียกข้อมูลเกี่ยวกับโทเค็นเซสชัน
ดูการใช้ AuthSub กับไลบรารีของไคลเอ็นต์ Google Data API
การเพิกถอนโทเค็นเซสชัน
OAuth สำหรับเว็บหรือแอปพลิเคชันที่ติดตั้ง/แอปพลิเคชันบนอุปกรณ์เคลื่อนที่
OAuth สามารถใช้แทน AuthSub และมีไว้สำหรับเว็บแอปพลิเคชัน OAuth คล้ายกับการใช้โหมดที่ปลอดภัยและลงทะเบียนแล้วของ AuthSub เนื่องจากคำขอข้อมูลทั้งหมดต้องได้รับการลงนามแบบดิจิทัลและคุณต้องลงทะเบียนโดเมน
ดูวิธีการผสานรวม OAuth เข้ากับแอปพลิเคชันที่ติดตั้ง
การดึงโทเค็นคำขอ
ดูการใช้ OAuth กับไลบรารีของไคลเอ็นต์ Google Data API
การให้สิทธิ์โทเค็นคำขอ
ดูการใช้ OAuth กับไลบรารีของไคลเอ็นต์ Google Data API
การอัปเกรดเป็นโทเค็นเพื่อการเข้าถึง
ClientLogin สำหรับแอปพลิเคชันที่ติดตั้ง/แอปพลิเคชันบนอุปกรณ์เคลื่อนที่
แอปพลิเคชันที่ติดตั้งหรือแอปพลิเคชันบนอุปกรณ์เคลื่อนที่ซึ่งต้อง ตรวจสอบสิทธิ์ผู้ใช้กับบัญชี Google ควรใช้ ClientLogin เมื่อเรียกใช้ครั้งแรก แอปพลิเคชันจะแจ้งให้ผู้ใช้ป้อนชื่อผู้ใช้/รหัสผ่าน ในคำขอที่ตามมา ระบบจะอ้างอิงโทเค็นการตรวจสอบสิทธิ์
ดูวิธีการรวม 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 ใหม่และเรียกใช้เมธอด 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 ที่มีเว็บไซต์ที่เป็นปัญหามาก่อน
แก้ไขพร็อพเพอร์ตี้อย่างน้อย 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 Site ได้ เช่น ใช้ 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
ในไคลเอ็นต์ Java ให้ใช้คลาส ActivityFeed เพื่อแสดงออบเจ็กต์ ActivityEntry
public String buildActivityFeedUrl() { String domain = "site"; // OR if the Site is hosted on G Suite, your domain (e.g. example.com) String siteName = "mySite"; return "https://sites.google.com/feeds/activity/" + domain + "/" + siteName + "/"; } public void getActivityFeed() throws IOException, ServiceException { ActivityFeed activityFeed = client.getFeed(new URL(buildActivityFeedUrl()), ActivityFeed.class); for (BaseActivityEntry<?> entry : activityFeed.getEntries()){ System.out.println(entry.getSummary().getPlainText()); System.out.println(" revisions link: " + entry.getRevisionLink().getHref()); } }
หมายเหตุ: คุณต้องเป็นผู้ร่วมแก้ไขหรือเจ้าของเว็บไซต์จึงจะเข้าถึงฟีดนี้ได้ ไคลเอ็นต์ต้องตรวจสอบสิทธิ์โดยใช้โทเค็น AuthSub, OAuth หรือ ClientLogin ดูการตรวจสอบสิทธิ์เพื่อเข้าถึงบริการ Sites
ฟีดการแก้ไข
หากต้องการดึงประวัติการแก้ไขของรายการเนื้อหา ให้ส่ง HTTP GET ไปยังลิงก์การแก้ไขของรายการ
https://sites.google.com/feeds/revision/site/siteName/CONTENT_ENTRY_ID
ตัวอย่างนี้จะค้นหาฟีดเนื้อหา แล้วดึงข้อมูลฟีดการแก้ไขสำหรับรายการเนื้อหาแรก
ContentFeed contentFeed = client.getFeed(new URL(buildContentFeedUrl()), ContentFeed.class); URL revisionFeedUrl = new URL(contentFeed.getEntries().get(0).getRevisionLink().getHref()); // use first entry public void getRevisionFeed(String revisionFeedUrl) throws IOException, ServiceException { RevisionFeed revisionFeed = client.getFeed(revisionFeedUrl, RevisionFeed.class); for (BaseContentEntry<?> entry : revisionFeed.getEntries()){ System.out.println(entry.getTitle().getPlainText()); System.out.println(" updated: " + entry.getUpdated().toUiString() + " by " + entry.getAuthors().get(0).getEmail()); System.out.println(" revision #: " + entry.getRevision().getValue()); } }
หมายเหตุ: คุณต้องเป็นผู้ร่วมแก้ไขหรือเจ้าของเว็บไซต์จึงจะเข้าถึงฟีดนี้ได้ ไคลเอ็นต์ต้องตรวจสอบสิทธิ์โดยใช้โทเค็น AuthSub, OAuth หรือ ClientLogin ดูการตรวจสอบสิทธิ์เพื่อเข้าถึงบริการ Sites
ฟีดเนื้อหา
การเรียกข้อมูลฟีดเนื้อหา
ฟีดเนื้อหาจะแสดงเนื้อหาล่าสุดของเว็บไซต์ โดยเข้าถึงได้ด้วยการส่ง HTTP GET ไปยัง URL ของฟีดเนื้อหา
https://sites.google.com/feeds/content/site/siteName
| พารามิเตอร์ฟีด | คำอธิบาย |
|---|---|
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
ตัวอย่างการค้นหาฟีดเนื้อหา
คุณค้นหาฟีดเนื้อหาได้โดยใช้พารามิเตอร์การค้นหา API มาตรฐานของ Google Data และพารามิเตอร์ที่เฉพาะเจาะจงสำหรับ Classic 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";
คุณสร้างเนื้อหาใหม่ (หน้าเว็บ, หน้า Listpage, หน้า Filecabinet, หน้าประกาศ ฯลฯ) ได้โดยส่ง 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 ใหม่ที่มีส่วนหัวเป็น "ที่เก็บไฟล์" แต่สร้างหน้าภายใต้ URL http://sites.google.com/site/siteName/files
(แทนที่จะเป็น http://sites.google.com/site/siteName/file-storage)
โดยการระบุองค์ประกอบ <sites:pageName>
public FileCabinetPageEntry createFileCabinetPage(String title, String content, String customPageName) throws MalformedURLException, IOException, ServiceException { FileCabinetPageEntry entry = new FileCabinetPageEntry(); entry.setTitle(new PlainTextConstruct(title)); setContentBlob(entry, content); // Entry's HTML content entry.setPageName(new PageName(customPageName)); // Upload to a custom page path return client.insert(new URL(buildContentFeedUrl()), entry); } FileCabinetPageEntry createdEntry = createFileCabinetPage("File Storage", "<b>HTML content</b>", "files"); System.out.println("Created! View at " + createdEntry.getHtmlLink().getHref());
เซิร์ฟเวอร์ใช้กฎลำดับความสำคัญต่อไปนี้ในการตั้งชื่อเส้นทาง URL ของหน้าเว็บ
<sites:pageName>หากมี ต้องเป็นไปตามa-z, A-Z, 0-9, -, _<atom:title>ต้องไม่ใช่ Null หากไม่มี pageName การทำให้เป็นมาตรฐานคือการตัด + ยุบช่องว่างให้เป็น "-" และ นำอักขระที่ไม่ตรงกับa-z, A-Z, 0-9, -, _ออก
การสร้างหน้าย่อย
หากต้องการสร้างหน้าย่อย (หน้าลูก) ภายใต้หน้าหลัก คุณต้องตั้งค่าลิงก์หลักในรายการ แอตทริบิวต์ href ของลิงก์ไปยัง
ลิงก์ด้วยตนเองของโหนดหลัก
public AnnouncementEntry postAnnouncement(String title, String content, AnnouncementsPageEntry parentPage) throws MalformedURLException, IOException, ServiceException { AnnouncementEntry entry = new AnnouncementEntry(); entry.setTitle(new PlainTextConstruct(title)); setContentBlob(entry, content); // Entry's HTML content // Set the entry's parent link to create the announcement under that page. entry.addLink(SitesLink.Rel.PARENT, Link.Type.ATOM, parentPage.getSelfLink().getHref()); return client.insert(new URL(buildContentFeedUrl()), entry); } ContentFeed contentFeed = client.getFeed(new URL(buildContentFeedUrl() + "?kind=announcementspage"), ContentFeed.class); AnnouncementEntry createdEntry = postAnnouncement("Party!!", "My place, this weekend", contentFeed.getEntries().get(0)); System.out.println("New post by " + createdEntry.getAuthors().get(0).getName());
ตัวอย่างข้างต้นจะสร้าง announcement ใหม่ในหน้าประกาศแรกที่พบในฟีดเนื้อหาของผู้ใช้ ระบบจะตั้งชื่อประกาศเป็น "ปาร์ตี้!!" และเนื้อหาเป็น "บ้านฉัน สุดสัปดาห์นี้"
เทมเพลตของหน้าเว็บ
การสร้างเทมเพลตหน้าเว็บ
กระบวนการสร้างเทมเพลตหน้าเว็บจะเหมือนกับการสร้างรายการ/หน้าเว็บใหม่และ
การสร้างหน้าย่อย ความแตกต่างคือการเพิ่ม category โดยมีข้อกำหนดและป้ายกำกับที่ตั้งค่าเป็น "http://schemas.google.com/g/2005#template"
และ "template" ตามลำดับ
ตัวอย่างนี้สร้างเทมเพลต webpage ใหม่
// The template webpage entry. WebPageEntry entry = new WebPageEntry(); // Set title and content. entry.setTitle(new PlainTextConstruct("Page template title")); XmlBlob xml = new XmlBlob(); xml.setBlob("Content for page template"); entry.setContent(new XhtmlTextConstruct(xml)); // Set the template category Category TEMPLATE_CATEGORY = new Category(TemplateCategory.Scheme.LABELS, TemplateCategory.Term.TEMPLATE, TemplateCategory.Label.TEMPLATE); entry.getCategories().add(TEMPLATE_CATEGORY); // Insert the template webpage entry. WebPageEntry createdEntry = client.insert(new URL("https://sites.google.com/feeds/content/site/siteName"), entry);
การสร้างหน้าเว็บจากเทมเพลต
คุณสามารถสร้างหน้าใหม่จากเทมเพลตได้โดยใส่ <link> ที่มี rel='http://schemas.google.com/sites/2008#template' ซึ่งชี้
ไปยังลิงก์ตัวเองของเทมเพลตหน้าเว็บ ซึ่งคล้ายกับการสร้างเทมเพลตหน้าเว็บ
ตัวอย่างนี้จะสร้างfilecabinetเทมเพลตใหม่ แล้วสร้างอินสแตนซ์ของหน้าfilecabinetใหม่จากเทมเพลตนั้น
URL feedUrl = new URL("https://sites.google.com/feeds/content/site/siteName"); // 1. Create file cabinet page template FileCabinetPageEntry inputTemplateEntry = new FileCabinetPageEntry(); inputTemplateEntry.setTitle(new PlainTextConstruct("File cabinet page template title")); XmlBlob xml = new XmlBlob(); xml.setBlob("Content for page template"); inputTemplateEntry.setContent(new XhtmlTextConstruct(xml)); // Set the template category Category TEMPLATE_CATEGORY = new Category(TemplateCategory.Scheme.LABELS, TemplateCategory.Term.TEMPLATE, TemplateCategory.Label.TEMPLATE); inputTemplateEntry.getCategories().add(TEMPLATE_CATEGORY); // 2. Create file cabinet page template instance FileCabinetPageEntry templateEntry = client.insert(feedUrl, inputTemplateEntry); // Specify link to the page template FileCabinetPageEntry templateInstanceEntry = new FileCabinetPageEntry(); templateInstanceEntry.setTitle(new PlainTextConstruct("File cabinet template instance")); templateInstanceEntry.addLink(new Link(SitesLink.Rel.TEMPLATE, Link.Type.ATOM, templateEntry.getSelfLink().getHref())); FileCabinetPageEntry createdFileCabinetFromTemplate = client.insert(feedUrl, templateInstanceEntry);
หมายเหตุ: แม้ว่าเทมเพลตจะกำหนด <category> ไว้ แต่คุณก็ยังต้องระบุในรายการ
นอกจากนี้ โปรดทราบว่าหากคุณรวมองค์ประกอบ <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 ให้ใส่หมวดหมู่ที่มีแอตทริบิวต์ "term" ซึ่งตั้งค่าเป็นชื่อโฟลเดอร์
เช่น เพิ่มบรรทัดนี้ใน uploadAttachment()
newAttachment.getCategories().add(new Category("http://schemas.google.com/sites/2008#folder", "FolderName"));
ไฟล์แนบในเว็บ
ไฟล์แนบในเว็บเป็นไฟล์แนบประเภทพิเศษ โดยพื้นฐานแล้ว ลิงก์เหล่านี้คือลิงก์ไปยังไฟล์อื่นๆ บนเว็บ ซึ่งคุณสามารถเพิ่มลงในข้อมูลของตู้เก็บไฟล์ได้ ฟีเจอร์นี้คล้ายกับวิธีการอัปโหลด "เพิ่มไฟล์ด้วย URL" ใน UI ของ 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 ของหน้าเว็บ
คุณแก้ไขข้อมูลเมตา (ชื่อ หน้าเว็บ ฯลฯ) และเนื้อหาหน้าเว็บประเภท 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()
หากคุณอัปเดตได้ทั้งเนื้อหาไฟล์ ข้อมูลเมตา หรือทั้ง 2 อย่าง
ตัวอย่างนี้จะเปลี่ยนชื่อไฟล์แนบเป็น "ชื่อใหม่" อัปเดตคำอธิบาย และแทนที่เนื้อหาไฟล์ด้วยไฟล์ .zip ใหม่
เนื่องจากคำขอมีเนื้อหาไฟล์ใหม่ ระบบจึงใช้ AttachmentEntry ของ updateMedia()
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 ไปยังลิงก์ 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 ค่า ดังนี้
- ผู้อ่าน - ผู้ดู (เทียบเท่าสิทธิ์การเข้าถึงระดับอ่านอย่างเดียว)
- ผู้เขียน - ผู้ทำงานร่วมกัน (เทียบเท่าสิทธิ์การอ่าน/เขียน)
- เจ้าของ - โดยปกติคือผู้ดูแลระบบเว็บไซต์ (เทียบเท่าสิทธิ์เข้าถึงแบบอ่าน/เขียน)
ขอบเขต
องค์ประกอบขอบเขตแสดงถึงเอนทิตีที่มีระดับการเข้าถึงนี้ องค์ประกอบ gAcl:scope มี 4 ประเภทที่เป็นไปได้ ดังนี้
- user - ค่าอีเมล เช่น "user@gmail.com"
- group - อีเมล Google Group เช่น "group@domain.com"
- domain - ชื่อโดเมน G Suite เช่น "domain.com"
- default — มีขอบเขตที่เป็นไปได้เพียงขอบเขตเดียวของประเภท "default" ซึ่งไม่มีค่า
(เช่น
<gAcl:scope type="default">) ขอบเขตนี้จะควบคุมสิทธิ์เข้าถึงที่ผู้ใช้ทุกคนมีโดยค่าเริ่มต้น ในเว็บไซต์สาธารณะ
หมายเหตุ: โดเมนต้องไม่มีค่า gAcl:role
ที่ตั้งค่าเป็นสิทธิ์เข้าถึง "เจ้าของ" แต่ต้องเป็นสิทธิ์เข้าถึงแบบผู้อ่านหรือผู้เขียนเท่านั้น
การเรียกข้อมูลฟีด ACL
คลาส AclFeed และ AclEntry ใช้เพื่อควบคุมสิทธิ์การแชร์ของเว็บไซต์ได้
และเรียกข้อมูลได้โดยใช้เมธอด getFeed() ของคลาสบริการ
ตัวอย่างต่อไปนี้จะดึงข้อมูลฟีด ACL สำหรับเว็บไซต์ที่ระบุ และพิมพ์สิทธิ์ของAclEntryแต่ละรายการออกมา
public String getAclFeedUrl(String siteName) { String domain = "site"; // OR if the Site is hosted on G Suite, your domain (e.g. example.com) return "https://sites.google.com/feeds/acl/site/" + domain + "/" + siteName + "/"; } public void getAclFeed(String siteName) throws IOException, ServiceException { AclFeed aclFeed = client.getFeed(new URL(getAclFeedUrl(siteName)), AclFeed.class); for (AclEntry entry : aclFeed.getEntries()) { System.out.println(entry.getScope().getValue() + " (" + entry.getScope().getType() + ") : " + entry.getRole().getValue()); } } getAclFeed('my-site-name');
หากคุณกำลังทำงานกับรายการใน SiteFeed แต่ละ SiteEntry จะมีลิงก์ไปยังฟีด ACL ของตัวเอง
เช่น ข้อมูลโค้ดนี้จะดึงข้อมูลฟีด ACL ของ SiteEntry
String aclLink = siteEntry.getLink(SitesAclFeedLink.Rel.ACCESS_CONTROL_LIST, Link.Type.ATOM).getHref(); AclFeed aclFeed = client.getFeed(new URL(aclLink), AclFeed.class);
การแชร์เว็บไซต์
หมายเหตุ: ACL การแชร์บางรายการอาจทำได้ก็ต่อเมื่อมีการกำหนดค่าโดเมน เพื่ออนุญาตสิทธิ์ดังกล่าว (เช่น หากเปิดใช้การแชร์นอกโดเมนสำหรับโดเมน G Suite เป็นต้น)
หากต้องการแชร์ Google Sites โดยใช้ API ไคลเอ็นต์ของคุณต้องสร้าง
AclEntry
ใหม่และPOSTไปยังเซิร์ฟเวอร์
ตัวอย่างที่เพิ่ม "user@example.com" เป็น reader ในเว็บไซต์
AclRole role = new AclRole("reader"); AclScope scope = new AclScope(AclScope.Type.USER, "user@example.com"); AclEntry aclEntry = addAclRole(role, scope, entry); public AclEntry addAclRole(AclRole role, AclScope scope, SiteEntry siteEntry) throws IOException, MalformedURLException, ServiceException { AclEntry aclEntry = new AclEntry(); aclEntry.setRole(role); aclEntry.setScope(scope); Link aclLink = siteEntry.getLink(SitesAclFeedLink.Rel.ACCESS_CONTROL_LIST, Link.Type.ATOM); return client.insert(new URL(aclLink.getHref()), aclEntry); }
ดูค่าที่เป็นไปได้ของ AclScope
และ AclRoles ได้ที่ส่วนภาพรวมฟีด ACL
การแชร์ระดับกลุ่มและโดเมน
คุณแชร์เว็บไซต์ในกลุ่ม Google หรือโดเมน G Suite ได้เช่นเดียวกับการแชร์เว็บไซต์กับผู้ใช้คนเดียว
การแชร์ไปยังอีเมลกลุ่ม
AclScope scope = new AclScope(AclScope.Type.GROUP, "group_name@example.com");
การแชร์กับทั้งโดเมน
AclScope scope = new AclScope(AclScope.Type.DOMAIN, "example.com");
การแชร์ที่ระดับโดเมนจะรองรับเฉพาะโดเมน G Suite และเฉพาะโดเมนที่โฮสต์เว็บไซต์ เช่น http://sites.google.com/a/domain1.com/siteA จะแชร์ทั้งเว็บไซต์ได้เฉพาะกับ domain1.com เท่านั้น ไม่ใช่ domain2.com ส่วนเว็บไซต์ที่ไม่ได้โฮสต์ในโดเมน G Suite (เช่น http://sites.google.com/site/siteB) จะเชิญโดเมนไม่ได้
การแก้ไขสิทธิ์การแชร์
หากต้องการให้สิทธิ์การแชร์ที่มีอยู่บนเว็บไซต์ ให้ดึงข้อมูล AclEntry ที่ต้องการก่อน จากนั้นแก้ไขสิทธิ์
ตามที่ต้องการ แล้วเรียกใช้เมธอด 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 ออกก่อน แล้วเรียกใช้เมธอด delete()
aclEntry.delete(); // Could also use the client's delete method // client.delete(new URL(aclEntry.getEditLink().getHref()), aclEntry);
ดูข้อมูลเพิ่มเติมเกี่ยวกับ ETag ได้ที่คู่มืออ้างอิง 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 304NotModifiedException
หาก ETag ไม่ตรงกัน แสดงว่ามีการแก้ไขรายการตั้งแต่ครั้งล่าสุดที่คุณขอ และเซิร์ฟเวอร์จะแสดงรายการ
ดูข้อมูลเพิ่มเติมเกี่ยวกับ ETag ได้ที่คู่มืออ้างอิง Google Data APIs