คู่มือภาษา Java

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

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

นอกจากให้ข้อมูลเบื้องต้นเกี่ยวกับความสามารถของ Sites Data API แล้ว คู่มือนี้ยังมีตัวอย่างการโต้ตอบกับ API โดยใช้ไลบรารีของไคลเอ็นต์ Java ด้วย หากต้องการความช่วยเหลือในการตั้งค่าไลบรารีของไคลเอ็นต์ โปรดดูหัวข้อการเริ่มต้นใช้งานไลบรารีของไคลเอ็นต์ Java สําหรับ Google Data หากต้องการทราบข้อมูลเพิ่มเติมเกี่ยวกับโปรโตคอลพื้นฐานที่ไลบรารีของไคลเอ็นต์ Java ใช้เพื่อโต้ตอบกับ Sites API แบบคลาสสิก โปรดดูคู่มือโปรโตคอล

ผู้ชม

เอกสารนี้มีไว้สำหรับนักพัฒนาซอฟต์แวร์ที่ต้องการเขียนแอปพลิเคชันไคลเอ็นต์ที่โต้ตอบกับ Google Sites โดยใช้ไลบรารีของไคลเอ็นต์ Java ข้อมูลของ Google

เริ่มต้นใช้งาน

Google Sites ใช้บัญชี Google หรือบัญชี G Suite สำหรับการตรวจสอบสิทธิ์ หากมีบัญชีอยู่แล้ว ทุกอย่างก็พร้อมใช้งานแล้ว หรือจะสร้างบัญชีใหม่ก็ได้

การติดตั้งไลบรารี

สำหรับความช่วยเหลือในการตั้งค่าและติดตั้งไลบรารีของไคลเอ็นต์ โปรดดูการเริ่มต้นใช้งานไลบรารีของไคลเอ็นต์ Google Data Java หากคุณใช้ Eclipse บทความดังกล่าวจะอธิบายวิธีตั้งค่าโปรเจ็กต์โดยใช้ปลั๊กอิน Eclipse ของ Google Data API ด้วย สิ่งที่ต้องมีเพื่อเริ่มต้นใช้งานมีดังนี้

  1. ติดตั้ง Java 1.5 ขึ้นไป
  2. ดาวน์โหลดไลบรารีของไคลเอ็นต์ (gdata-src.java.zip เวอร์ชันล่าสุด)
  3. ดาวน์โหลดรายการข้อกําหนดเบื้องต้น
  4. ดาวน์โหลดแอปพลิเคชันตัวอย่าง (gdata-samples.java.zip เวอร์ชันล่าสุด)

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

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

นอกจากนี้ อย่าลืมใส่ไฟล์ jar ของ 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 แล้ว

การตรวจสอบสิทธิ์ไปยัง API ของ Sites แบบคลาสสิก

ไลบรารีไคลเอ็นต์ Java สามารถใช้กับฟีดสาธารณะหรือส่วนตัวก็ได้ Sites Data API ให้สิทธิ์เข้าถึงฟีดส่วนตัวและสาธารณะ ทั้งนี้ขึ้นอยู่กับสิทธิ์ของเว็บไซต์และการดำเนินการที่คุณพยายามจะดำเนินการ ตัวอย่างเช่น คุณอาจสามารถอ่านฟีดเนื้อหาของเว็บไซต์สาธารณะ แต่ไม่สามารถอัปเดตได้ ซึ่งเป็นสิ่งที่ต้องมีไคลเอ็นต์ที่ตรวจสอบสิทธิ์แล้ว ซึ่งทำได้ผ่านการตรวจสอบสิทธิ์ชื่อผู้ใช้/รหัสผ่าน 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 สำหรับเว็บแอปพลิเคชัน

แอปพลิเคชันไคลเอ็นต์ที่ต้องการตรวจสอบสิทธิ์ผู้ใช้กับบัญชี Google ควรใช้การตรวจสอบสิทธิ์ AuthSub สําหรับเว็บแอปพลิเคชัน ผู้ดำเนินการไม่จำเป็นต้องเข้าถึงชื่อผู้ใช้และรหัสผ่านของผู้ใช้ 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 Site คุณสามารถใช้พารามิเตอร์ 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" และ "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"));

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

ไฟล์แนบบนเว็บเป็นไฟล์แนบชนิดพิเศษ โดยพื้นฐานแล้ว ลิงก์เหล่านี้คือลิงก์ไปยังไฟล์อื่นๆ บนเว็บที่คุณสามารถเพิ่มลงในข้อมูลใน File Cabinet ได้ ฟีเจอร์นี้คล้ายกับวิธีการอัปโหลด "เพิ่มไฟล์ด้วย 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 ของหน้า

คุณแก้ไขข้อมูลเมตา (ชื่อ, 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() คุณสามารถอัปเดตเฉพาะเนื้อหาไฟล์ ข้อมูลเมตา หรือทั้ง 2 อย่าง

ตัวอย่างนี้จะเปลี่ยนชื่อไฟล์แนบเป็น "ชื่อใหม่" อัปเดตคำอธิบาย และแทนที่เนื้อหาไฟล์ด้วยไฟล์ .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 Site ให้ดึงข้อมูลรายการเนื้อหาก่อน จากนั้นเรียกใช้ 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 ค่า ดังนี้

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

ขอบเขต

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

  • user — ค่าอีเมล เช่น "user@gmail.com"
  • group — ที่อยู่อีเมลของกลุ่ม Google เช่น "group@domain.com"
  • domain — ชื่อโดเมน G Suite เช่น "domain.com"
  • default — ขอบเขตประเภท "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);
}

ดูค่า AclScope และ AclRoles ที่เป็นไปได้ได้ในส่วนภาพรวมฟีด ACL

การแชร์ระดับกลุ่มและโดเมน

คุณสามารถแชร์เว็บไซต์ใน Google Group หรือโดเมน 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

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