คู่มือภาษา Java

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

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

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

ผู้ชม

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

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

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

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

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

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

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

  1. java/lib/gdata-sites-2.0.jar - เวอร์ชันนี้เป็นเวอร์ชัน 2.0 ที่มีไว้สำหรับ 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 (หากทำงานกับหน้ารายการ / รายการ)

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

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

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

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

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

เคล็ดลับ: อ่านบทความการใช้ Eclipse กับ Google Data API เพื่อตั้งค่าอย่างรวดเร็วด้วยปลั๊กอิน Eclipse

คุณต้องนําเข้าหลายครั้ง ทั้งนี้ขึ้นอยู่กับความต้องการของแอปพลิเคชัน เราขอแนะนำให้เริ่มต้นด้วยการนำเข้าต่อไปนี้

import com.google.gdata.client.*;
import com.google.gdata.client.sites.*;
import com.google.gdata.data.*;
import com.google.gdata.data.acl.*;
import com.google.gdata.data.media.*;
import com.google.gdata.data.sites.*;
import com.google.gdata.data.spreadsheet.*;  // If working with listpages / listitems
import com.google.gdata.util.*;

ขั้นตอนต่อไปคุณจะต้องตั้งค่าออบเจ็กต์ SitesService ซึ่งแสดงการเชื่อมต่อไคลเอ็นต์กับ Sites API แบบคลาสสิก ดังนี้

SitesService client = new SitesService("yourCo-yourAppName-v1");

อาร์กิวเมนต์ applicationName ควรมีรูปแบบ company-applicationname-version โดยพารามิเตอร์นี้ใช้เพื่อวัตถุประสงค์ในการบันทึก

หมายเหตุ: ส่วนที่เหลือของคู่มือนี้จะถือว่าคุณสร้าง SitesService ในตัวแปร client

การตรวจสอบสิทธิ์กับ Sites API คลาสสิก

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

โปรดดูภาพรวมการตรวจสอบสิทธิ์ API ข้อมูลของ Google สำหรับข้อมูลเพิ่มเติมเกี่ยวกับ AuthSub, OAuth และ ClientLogin

เคล็ดลับ: API รองรับ SSL (HTTPS) หากใช้ AuthSub/OAuth โปรดระบุขอบเขตของ https://sites.google.com/feeds/ เพื่อขอฟีดผ่าน SSL โปรดทราบว่าสำหรับโดเมนของ G Suite การตั้งค่า "ต้องใช้ SSL" ในแผงควบคุมการดูแลระบบจะเป็นไปตาม API คุณบังคับให้คำขอ API ทั้งหมดใช้ HTTPS ได้โดยเรียกใช้ client.useSsl();

AuthSub สำหรับเว็บแอปพลิเคชัน

แอปพลิเคชันไคลเอ็นต์ควรใช้การตรวจสอบสิทธิ์ AuthSub สำหรับเว็บแอปพลิเคชัน ซึ่งจำเป็นต้องตรวจสอบสิทธิ์ของผู้ใช้กับบัญชี Google โอเปอเรเตอร์ไม่จำเป็นต้องเข้าถึงชื่อผู้ใช้และรหัสผ่านสำหรับผู้ใช้ Google Sites - มีเพียงโทเค็น AuthSub เท่านั้น

ดูวิธีรวม AuthSub ลงในเว็บแอปพลิเคชัน

ขอโทเค็นแบบใช้ครั้งเดียว

เมื่อไปที่แอปพลิเคชันเป็นครั้งแรก ผู้ใช้จำเป็นต้องตรวจสอบสิทธิ์ โดยทั่วไป นักพัฒนาซอฟต์แวร์จะพิมพ์ข้อความและลิงก์ที่นำผู้ใช้ไปยังหน้าการอนุมัติ AuthSub เพื่อตรวจสอบสิทธิ์ผู้ใช้และขอสิทธิ์เข้าถึงเอกสาร ไลบรารีของไคลเอ็นต์ Google Data Java มีฟังก์ชันสำหรับสร้าง URL นี้ โค้ดด้านล่างจะตั้งค่าลิงก์ไปยังหน้า AuthSubRequest

import com.google.gdata.client.*;

String nextUrl = "http://www.example.com/welcome.jsp";
String scope = "https://sites.google.com/feeds/";
boolean secure = true;
boolean session = true;
String authSubUrl = AuthSubUtil.getRequestUrl(nextUrl, scope, secure, session);

หากต้องการตรวจสอบสิทธิ์ผู้ใช้ในโดเมนที่ฝากบริการ G Suite ให้ทำดังนี้

import com.google.gdata.client.*;

String hostedDomain = "example.com";
String nextUrl = "http://www.example.com/welcome.jsp";
String scope = "https://sites.google.com/feeds/";  // SSL is also supported
boolean secure = true;
boolean session = true;
String authSubUrl = AuthSubUtil.getRequestUrl(hostedDomain, nextUrl, scope, secure, session);

เมธอด getRequestUrl() ใช้พารามิเตอร์หลายตัว (โดยสอดคล้องกับพารามิเตอร์การค้นหาที่ใช้โดยตัวแฮนเดิล AuthSubRequest) ดังนี้

  • URL ถัดไป คือ URL ที่ Google จะเปลี่ยนเส้นทางไป หลังจากที่ผู้ใช้เข้าสู่ระบบบัญชีและให้สิทธิ์ในการเข้าถึง http://www.example.com/welcome.jsp ในตัวอย่างด้านบน
  • ขอบเขตhttps://sites.google.com/feeds/ ในตัวอย่างด้านบน
  • บูลีนเพื่อระบุว่าจะใช้โทเค็นในโหมดลงทะเบียนหรือไม่ เป็น false ในตัวอย่างข้างต้น
  • บูลีนที่ 2 เพื่อระบุว่าโทเค็นจะแลกเปลี่ยนเป็นโทเค็นเซสชันในภายหลังหรือไม่ กล่าวคือ true ในตัวอย่างข้างต้น

การอัปเกรดเป็นโทเค็นเซสชัน

โปรดดูการใช้ AuthSub กับไลบรารีของไคลเอ็นต์ Google Data API

การดึงข้อมูลเกี่ยวกับโทเค็นเซสชัน

โปรดดูการใช้ AuthSub กับไลบรารีของไคลเอ็นต์ Google Data API

การเพิกถอนโทเค็นเซสชัน

โปรดดูการใช้ AuthSub กับไลบรารีของไคลเอ็นต์ Google Data API

OAuth สำหรับเว็บหรือแอปพลิเคชันที่ติดตั้ง/บนอุปกรณ์เคลื่อนที่

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

ดูวิธีรวม OAuth เข้ากับแอปพลิเคชันที่ติดตั้งไว้

กำลังดึงข้อมูลโทเค็นคำขอ

โปรดดูการใช้ OAuth กับไลบรารีของไคลเอ็นต์ Google Data API

การให้สิทธิ์โทเค็นคำขอ

โปรดดูการใช้ OAuth กับไลบรารีของไคลเอ็นต์ Google Data API

การอัปเกรดเป็นโทเค็นเพื่อการเข้าถึง

โปรดดูการใช้ OAuth กับไลบรารีของไคลเอ็นต์ Google Data API

ClientLogin สำหรับแอปพลิเคชันที่ติดตั้ง/บนอุปกรณ์เคลื่อนที่

ควรใช้ ClientLogin โดยแอปพลิเคชันที่ติดตั้งหรือแอปพลิเคชันบนอุปกรณ์เคลื่อนที่ซึ่งจำเป็นต้องตรวจสอบสิทธิ์ของผู้ใช้ที่มีต่อบัญชี Google เมื่อเรียกใช้ครั้งแรก แอปพลิเคชันจะแจ้งให้ผู้ใช้ป้อนชื่อผู้ใช้/รหัสผ่าน สำหรับคำขอที่ตามมา ระบบจะอ้างอิงโทเค็นการตรวจสอบสิทธิ์

ดูคำแนะนำสำหรับการรวม ClientLogin เข้ากับแอปพลิเคชันที่ติดตั้งไว้

หากต้องการใช้ ClientLogin ให้เรียกใช้เมธอด setUserCredentials() ของออบเจ็กต์ SitesService ซึ่งรับค่ามาจาก GoogleService ระบุที่อยู่อีเมลและรหัสผ่านของผู้ใช้ซึ่งลูกค้าของคุณเป็นผู้ส่งคำขอในนามของไคลเอ็นต์ เช่น

SitesService client = new SitesService("yourCo-yourAppName-v1");
client.setUserCredentials("example@gmail.com", "pa$$word");

เคล็ดลับ: เมื่อแอปพลิเคชันตรวจสอบสิทธิ์ผู้ใช้เรียบร้อยแล้วเป็นครั้งแรก ให้จัดเก็บโทเค็นการตรวจสอบสิทธิ์ในฐานข้อมูลเพื่อเรียกคืนการใช้งานในภายหลัง ไม่จำเป็นต้องแจ้งให้ผู้ใช้ทราบรหัสผ่านในการทำงานทุกครั้งของแอปพลิเคชัน โปรดดูข้อมูลเพิ่มเติมที่การเรียกคืนโทเค็นการตรวจสอบสิทธิ์

ดูข้อมูลเพิ่มเติมเกี่ยวกับการใช้ ClientLogin ในแอปพลิเคชัน Java ได้ที่การใช้ ClientLogin กับไลบรารีของไคลเอ็นต์ Google Data API

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

ฟีดของเว็บไซต์

ฟีดของเว็บไซต์สามารถใช้เพื่อแสดงรายการ Google Sites ที่ผู้ใช้เป็นเจ้าของหรือมีสิทธิ์ดู นอกจากนี้ยังใช้เพื่อแก้ไขชื่อเว็บไซต์ที่มีอยู่ได้ด้วย สำหรับโดเมน G Suite จะใช้เพื่อสร้างและ/หรือคัดลอกทั้งเว็บไซต์ได้ด้วย

รายชื่อไซต์

หากต้องการค้นหาฟีดเว็บไซต์ ให้ส่ง HTTP GET ไปยัง URL ของฟีดเว็บไซต์

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

คุณสามารถใช้คลาส SiteFeed และ SiteEntry ในไคลเอ็นต์ Java เพื่อทำงานกับฟีดเว็บไซต์ได้ โดยทำดังนี้

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

ในไคลเอ็นต์ 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

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

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

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

กำลังเรียกชนิดรายการที่เฉพาะเจาะจง

หากต้องการดึงข้อมูลเฉพาะรายการประเภทหนึ่งๆ ให้ใช้พารามิเตอร์ kind ตัวอย่างนี้ส่งคืนรายการเพียง attachment รายการ:

ContentQuery query = new ContentQuery(new URL(buildContentFeedUrl()));
query.setKind("webpage");
ContentFeed contentFeed = client.getFeed(query, ContentFeed.class);
for (AttachmentEntry entry : contentFeed.getEntries(AttachmentEntry.class)) {
  System.out.println(entry.getTitle().getPlainText());
}

หากต้องการแสดงผลมากกว่า 1 ประเภท ให้คั่น kind แต่ละรายการด้วย "," ตัวอย่างนี้จะแสดงผล filecabinet และ listpage ดังนี้

URL url = new URL(buildContentFeedUrl() + "?kind=filecabinet,listpage");
ContentFeed contentFeed = client.getFeed(url, ContentFeed.class);
for (FileCabinetPageEntry entry : contentFeed.getEntries(FileCabinetPageEntry.class)) {
  System.out.println(" title: " + entry.getTitle().getPlainText());
}
for (ListPageEntry entry : contentFeed.getEntries(ListPageEntry.class)) {
  System.out.println(" title: " + entry.getTitle().getPlainText());
}

การเรียกดูหน้าเว็บตามเส้นทาง

หากคุณทราบเส้นทางแบบสัมพัทธ์ของหน้าเว็บภายในเว็บไซต์จาก Google Sites ก็สามารถใช้พารามิเตอร์ path เพื่อดึงข้อมูลหน้าดังกล่าว ตัวอย่างนี้จะแสดงผลหน้าเว็บซึ่งอยู่ที่ http://sites.google.com/site/siteName/path/to/the/page:

ContentQuery query = new ContentQuery(new URL(buildContentFeedUrl()));
query.setPath("/path/to/the/page");
ContentFeed contentFeed = client.getFeed(query, ContentFeed.class);
for (BaseContentEntry<?> entry : contentFeed.getEntries()) {
  System.out.println(" title: " + entry.getTitle().getPlainText());
}

ดึงข้อมูลรายการทั้งหมดภายใต้หน้าหลัก

หากคุณทราบรหัสรายการเนื้อหาของหน้าเว็บ (เช่น "1234567890" ในตัวอย่างด้านล่าง) คุณสามารถใช้พารามิเตอร์ parent เพื่อดึงข้อมูลรายการย่อยทั้งหมด (หากมี) ได้

ContentQuery query = new ContentQuery(new URL(buildContentFeedUrl()));
query.setParent("1234567890");
ContentFeed contentFeed = client.getFeed(query, ContentFeed.class);

สำหรับพารามิเตอร์เพิ่มเติม โปรดดูคู่มืออ้างอิง

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



การสร้างเนื้อหา

หมายเหตุ: ก่อนสร้างเนื้อหาสำหรับเว็บไซต์ ให้ตรวจสอบว่าคุณได้ตั้งค่าเว็บไซต์ในไคลเอ็นต์แล้ว
client.site = "siteName";

คุณจะสร้างเนื้อหาใหม่ (หน้าเว็บ หน้ารายการ หน้าจัดการไฟล์ หน้าประกาศ เป็นต้น) ได้โดยการส่ง HTTP POST ไปยังฟีดเนื้อหา ดังนี้

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

ดูรายการประเภทโหนดการสนับสนุนได้ที่พารามิเตอร์ kind ในคู่มืออ้างอิง

การสร้างรายการ / หน้าเว็บใหม่

ตัวอย่างนี้สร้าง webpage ใหม่ภายใต้ระดับบนสุดของเว็บไซต์ รวม XHTML บางส่วนสำหรับเนื้อหาของหน้า และตั้งชื่อส่วนหัวเป็น "ชื่อหน้าเว็บใหม่"

private void setContentBlob(BaseContentEntry<?> entry, String pageContent) {
  XmlBlob xml = new XmlBlob();
  xml.setBlob(pageContent);
  entry.setContent(new XhtmlTextConstruct(xml));
}

public WebPageEntry createWebPage(String title, String content)
    throws MalformedURLException, IOException, ServiceException {
  WebPageEntry entry = new WebPageEntry();
  entry.setTitle(new PlainTextConstruct(title));

  setContentBlob(entry, content); // Entry's HTML content

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

WebPageEntry createdEntry = createWebPage("New Webpage Title", "<b>HTML content</b>");
System.out.println("Created! View at " + createdEntry.getHtmlLink().getHref());

หากคำขอประสบความสำเร็จ createdEntry จะมีสำเนาของรายการที่สร้างขึ้นบนเซิร์ฟเวอร์

การสร้างรายการ/หน้าเว็บภายใต้เส้นทาง URL ที่กำหนดเอง

โดยค่าเริ่มต้น ตัวอย่างก่อนหน้านี้จะสร้างขึ้นใต้ URL http://sites.google.com/site/siteName/new-webpage-title และมีส่วนหัวเป็น "ชื่อหน้าเว็บใหม่" กล่าวคือ <atom:title> จะได้รับการปรับให้เป็น new-webpage-title สำหรับ URL หากต้องการปรับแต่งเส้นทาง URL ของหน้าเว็บ ให้ตั้งค่าองค์ประกอบ <sites:pageName>

ตัวอย่างนี้สร้างหน้า filecabinet ใหม่ที่มีส่วนหัวเป็น "พื้นที่เก็บข้อมูลไฟล์" แต่สร้างหน้าภายใต้ 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> ต้องไม่เป็นค่าว่างหากไม่มี 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" และ "สีสวยๆ" ตามลำดับ

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

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

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

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

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

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

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



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

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

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

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

  • ชื่อนี้ถูกแก้ไขเป็น "ชื่อหนังสือที่อัปเดต"
  • เนื้อหา 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 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 ค่าดังนี้

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

ขอบเขต

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

  • user — ค่าที่อยู่อีเมล เช่น "user@gmail.com"
  • กลุ่ม — ที่อยู่อีเมลของ Google Group เช่น "group@domain.com"
  • โดเมน — ชื่อโดเมนของ G Suite เช่น "domain.com"
  • ค่าเริ่มต้น — ขอบเขตประเภท "ค่าเริ่มต้น" ที่เป็นไปได้มีเพียง 1 ขอบเขตซึ่งไม่มีค่า (เช่น <gAcl:scope type="default">) ขอบเขตนี้ควบคุมการเข้าถึงที่ผู้ใช้มีโดยค่าเริ่มต้นในเว็บไซต์สาธารณะ

หมายเหตุ: โดเมนไม่สามารถตั้งค่า gAcl:role เป็นสิทธิ์การเข้าถึงระดับ "เจ้าของ" โดเมนจะต้องเป็นผู้อ่านหรือผู้เขียนเท่านั้น

การเรียกดูฟีด ACL

คุณใช้คลาส AclFeed และ AclEntry เพื่อควบคุมสิทธิ์การแชร์ของเว็บไซต์และดึงข้อมูลได้โดยใช้เมธอด getFeed() ของคลาสบริการ

ตัวอย่างต่อไปนี้จะดึงข้อมูลฟีด ACL ของเว็บไซต์หนึ่งๆ และพิมพ์สิทธิ์ของ AclEntry แต่ละรายการ

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

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

getAclFeed('my-site-name');

หากคุณกำลังทำงานกับรายการต่างๆ ใน SiteFeed แต่ละ SiteEntry จะมีลิงก์ไปยังฟีด ACL ของรายการนั้นๆ เช่น ข้อมูลโค้ดนี้ดึงฟีด ACL ของ SiteEntry

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

การแชร์เว็บไซต์

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

หากต้องการแชร์เว็บไซต์จาก Google Sites โดยใช้ API ไคลเอ็นต์จะต้องสร้าง AclEntry ใหม่และPOSTไปยังเซิร์ฟเวอร์

นี่คือตัวอย่างที่เพิ่ม "user@example.com" เป็น reader ในเว็บไซต์

AclRole role = new AclRole("reader");
AclScope scope = new AclScope(AclScope.Type.USER, "user@example.com");
AclEntry aclEntry = addAclRole(role, scope, entry);

public AclEntry addAclRole(AclRole role, AclScope scope, SiteEntry siteEntry)
    throws IOException, MalformedURLException, ServiceException  {
  AclEntry aclEntry = new AclEntry();
  aclEntry.setRole(role);
  aclEntry.setScope(scope);

  Link aclLink = siteEntry.getLink(SitesAclFeedLink.Rel.ACCESS_CONTROL_LIST, Link.Type.ATOM);
  return client.insert(new URL(aclLink.getHref()), aclEntry);
}

โปรดดูส่วนภาพรวมของฟีด ACL สำหรับค่า AclScope และ AclRoles ที่เป็นไปได้

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

คุณแชร์เว็บไซต์ทั่วทั้งกลุ่มของ Google หรือโดเมน G Suite ได้ ซึ่งคล้ายกับการแชร์เว็บไซต์กับผู้ใช้รายเดียว

การแชร์ไปยังอีเมลกลุ่ม

AclScope scope = new AclScope(AclScope.Type.GROUP, "group_name@example.com");

การแชร์กับทั้งโดเมน:

AclScope scope = new AclScope(AclScope.Type.DOMAIN, "example.com");

การแชร์ในระดับโดเมนจะใช้ได้เฉพาะในโดเมน G Suite และสำหรับโดเมนที่โฮสต์เว็บไซต์นั้นเท่านั้น ตัวอย่างเช่น http://sites.google.com/a/domain1.com/siteA จะสามารถแชร์ไซต์ทั้งไซต์กับ domain1.com เท่านั้น แต่ไม่สามารถแชร์ไซต์กับ domain1.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 คุณเข้าถึง eBook ของรายการได้จาก 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

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