การประมวลผลเป็นกลุ่มในโปรโตคอลข้อมูลของ Google

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

หมายเหตุ: หากต้องการใช้ไลบรารีแบบกลุ่ม คุณต้องใช้ไลบรารีของไคลเอ็นต์ Google Data API เวอร์ชันล่าสุด ไลบรารีของไคลเอ็นต์ JavaScript ไม่รองรับการดําเนินการแบบกลุ่ม

ผู้ชม

เอกสารนี้มีไว้สําหรับโปรแกรมเมอร์ที่ต้องการส่งการดําเนินการหลายรายการในคําขอเดียวโดยใช้การประมวลผลแบบกลุ่ม

เอกสารนี้จะถือว่าคุณคุ้นเคยกับการใช้ไลบรารีของไคลเอ็นต์ Java ข้อมูล ตัวอย่างในเอกสารนี้แสดงวิธีใช้ไลบรารีของไคลเอ็นต์ Java เพื่อเรียกใช้การดําเนินการแบบกลุ่ม

ตัวอย่างในเอกสารนี้เกี่ยวข้องกับ Google Base Data API โดยเฉพาะ แต่บริการอื่นๆ อาจมีความสามารถแบบกลุ่มด้วย

หมายเหตุ: โปรโตคอลและขั้นตอนทั่วไปจะเหมือนกันสําหรับไลบรารีของไคลเอ็นต์อื่นๆ แต่วิธีการส่งคําขอแบบกลุ่มอาจแตกต่างกันไป โปรดดูเอกสารประกอบเฉพาะไลบรารีของไคลเอ็นต์

บทนำ

เมื่อใช้ฟีดกลุ่ม GData คุณสามารถรวบรวมการแทรก อัปเดต ลบ และค้นหาการดําเนินการหลายรายการ จากนั้นส่งและดําเนินการทั้งหมดพร้อมกันได้

เช่น ฟีดต่อไปนี้จะมีการดําเนินการ 4 รายการ

<feed>
  <entry>
    <batch:operation type="insert"/>
    ... what to insert ...
  </entry> 
  <entry>
    <batch:operation type="update"/>
    ... what to update ...
  </entry>
  <entry>
    <batch:operation type="delete"/>
    ... what to delete ...
  </entry>
  <entry>
    <batch:operation type="query"/>
    ... what to query ...
  </entry>
</feed>

บริการจะดําเนินการเปลี่ยนแปลงที่ขอให้ได้มากที่สุดและแสดงผลข้อมูลสถานะที่คุณใช้ประเมินความสําเร็จหรือล้มเหลวของการดําเนินการแต่ละรายการได้

บริการจะพยายามดําเนินการแต่ละรายการภายในกลุ่ม แม้ว่าการดําเนินการบางรายการที่รวมอยู่ในกลุ่มจะไม่สําเร็จก็ตาม

การส่งคําขอแบบกลุ่ม

คําขอแบบกลุ่มควรส่งเป็น HTTP POST ไปยัง URL แบบกลุ่ม ฟีดแต่ละรายการรองรับการดําเนินการแบบกลุ่มที่แตกต่างกัน ฟีดแบบอ่านอย่างเดียวรองรับการค้นหาเท่านั้น

หากต้องการดูว่าฟีดใดรองรับการดําเนินการแบบกลุ่มหรือไม่ คุณก็ค้นหาฟีดได้ หากฟีดมีความสัมพันธ์แบบ "กลุ่ม" ที่ระดับฟีด แสดงว่าฟีดรองรับการดําเนินการแบบกลุ่ม

ความสัมพันธ์ด้านลิงก์ "แบบกลุ่ม" เป็นองค์ประกอบ <link> ที่มี rel="http://schemas.google.com/g/2005#batch" แอตทริบิวต์ href ของความสัมพันธ์ลิงก์กําหนด URL ที่อาจโพสต์เอกสารฟีดสําหรับการดําเนินการเป็นกลุ่ม

เช่น หากคุณดําเนินการ GET http://www.google.com/base/feeds/items (ฟีด "items" ใน Google Base ตามปกติ) คุณอาจได้รับการตอบกลับต่อไปนี้

<feed xmlns=...
  <id>http://www.google.com/base/feeds/items</id>
  <link rel="http://schemas.google.com/g/2005#feed"
    type="application/atom+xml"
    href="http://www.google.com/base/feeds/items"/>
  <link rel="http://schemas.google.com/g/2005#post"
    type="application/atom+xml"
    href="http://www.google.com/base/feeds/items"/>
  <link rel="http://schemas.google.com/g/2005#batch"
    type="application/atom+xml"
    href="http://www.google.com/base/feeds/items/batch"/>
  ...
</feed> 

ในตัวอย่างนี้ URL กลุ่มคือ http://www.google.com/base/feeds/items/batch

การเขียนฟีดการดําเนินการแบบกลุ่ม

ฟีดการดําเนินการมีรายการสิ่งที่จะแทรก อัปเดต ลบ หรือค้นหา การดําเนินการแต่ละรายการจะกําหนดโดยองค์ประกอบ <batch:operation type="insert|update|delete|query"/>

องค์ประกอบอาจเป็นองค์ประกอบย่อยขององค์ประกอบ <feed> องค์ประกอบย่อยโดยตรงของรายการใดๆ ในฟีด หรือทั้งคู่ เมื่อรวมอยู่ในรายการ จะเป็นการระบุการดําเนินการที่จะดําเนินการสําหรับรายการนั้นๆ เมื่อรวมอยู่ในฟีด องค์ประกอบนี้จะระบุการดําเนินการเริ่มต้นที่จะดําเนินการกับรายการที่ไม่มีองค์ประกอบ <batch:operation/>

เมื่อรายการและฟีดไม่ได้ระบุการดําเนินการ การดําเนินการเริ่มต้นจะเป็น insert

แอปพลิเคชันไม่ควรใช้การดําเนินการหลายรายการกับรายการเดียวกันในฟีดเดียว เราจะตัดสินผลลัพธ์หากคุณระบุการดําเนินการหลายรายการสําหรับรายการเดียวกัน

ในการดําเนินการไม่ได้ ระบบจะประมวลผลการดําเนินการตามลําดับที่ขอ แต่ผลลัพธ์สุดท้ายก็จะเหมือนกับว่าไฟล์ได้รับการประมวลผลแล้ว

จํานวนไบต์ใน XML ที่คุณส่งไปยังเซิร์ฟเวอร์ต้องไม่เกิน 1 MB (1,048,576 ไบต์) โดยทั่วไปแล้ว เราไม่ได้จํากัดจํานวนการดําเนินการของคุณในการดําเนินงาน ตราบใดที่ขนาดของไบต์รวมต้องไม่เกิน 1 MB อย่างไรก็ตาม บริการบางอย่างอาจมีข้อจํากัดเพิ่มเติม

ในการใช้การดําเนินการแบบกลุ่ม คุณต้องเพิ่มการประกาศเนมสเปซเป็นกลุ่มเป็นแอตทริบิวต์ในองค์ประกอบ <feed>

<feed 
  xmlns="http://www.w3.org/2005/Atom"
  xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/"
  ...
  xmlns:batch="http://schemas.google.com/gdata/batch">

แทรกการดําเนินการ

การดําเนินการแทรกจะได้รับการระบุดังนี้

<batch:operation type="insert">

การดําเนินการแทรกเทียบเท่ากับการโพสต์รายการ เมื่อการดําเนินการเสร็จสมบูรณ์ ระบบจะส่งคืนเนื้อหารายการบันทึกทั้งหมด พร้อมด้วยองค์ประกอบ <id> ของเอกสารที่อัปเดตแล้ว และองค์ประกอบ <batch:status code="201"/>

ต่อไปนี้คือตัวอย่างคําขอแทรกที่ประสบความสําเร็จ

<entry>
  <title type="text">...</title>
  <content type="html">...</content>
  <batch:id>itemA</batch:id>
  <batch:operation type="insert"/>
  <g:item_type>recipes</g:item_type>
  ... 
</entry>

ต่อไปนี้คือตัวอย่างการตอบกลับคําขอแทรกที่ประสบความสําเร็จ

<entry>
  <batch:status code="201"/>
  <batch:id>itemA</batch:id>
  <batch:operation type="insert"/>
  <id>http://www.google.com/base/feeds/items/17437536661927313949</id>
  <link rel="self" type="application/atom+xml"
    href="http://www.google.com/base/feeds/items/17437536661927313949"/>
  <title type="text">...</title>
  <content type="html">...</content>
  <g:item_type>recipes</g:item_type>
  ... 
</entry>

อัปเดตการดําเนินการ

<batch:operation type="update">

การดําเนินการอัปเดตเทียบเท่ากับการเรียกใช้ PUT ใน URL ที่อ้างอิงโดยองค์ประกอบ <id> ของรายการ เมื่อการดําเนินการสําเร็จ เนื้อหารายการบันทึกทั้งหมดจะแสดงด้วยองค์ประกอบ <batch:status code="200"/>

หมายเหตุ: สําหรับฟีดบางรายการ คุณต้องระบุลิงก์ rel="edit" ของรายการที่มีคําขออัปเดตกลุ่ม ซึ่งรวมถึงฟีดที่รองรับ 1 เกิดขึ้นพร้อมกัน ซึ่งเป็นโปรโตคอลของ Google Data Protocol และฟีดที่ไม่มีรหัสซึ่งเป็น URL

ต่อไปนี้คือตัวอย่างคําขออัปเดต

<entry>
  <id>http://www.google.com/base/feeds/items/17437536661927313949</id>
  <batch:operation type="update"/>
  ...
</entry>

ตัวอย่างการตอบกลับที่สําเร็จมีดังนี้

<entry>
  <batch:status code="200"/>
  <id>http://www.google.com/base/feeds/items/17437536661927313949</id>
  <batch:operation type="update"/>
  ... 
</entry>

หมายเหตุ: ฟีดบางรายการใช้ ETag ที่มีประสิทธิภาพเพื่อป้องกันไม่ให้คุณแก้ไขการเปลี่ยนแปลงของบุคคลอื่นโดยไม่ตั้งใจ เมื่อส่งคําขออัปเดตแบบกลุ่มสําหรับรายการในฟีดใดฟีดหนึ่ง คุณต้องระบุค่า ETag ในแอตทริบิวต์ gd:etag ของรายการ เช่น <entry gd:etag="'F08NQAxFdip7IWA6WhVR'">...<batch:operation type="update"/>...

การดําเนินการอัปเดตบางส่วน

สําหรับฟีดที่รองรับการอัปเดตบางส่วน คุณใช้การอัปเดตเหล่านี้ในคําขอแบบกลุ่มได้ การดําเนินการอัปเดตบางส่วนเทียบเท่ากับการดําเนินการ PATCH ใน URL ที่อ้างอิงโดยองค์ประกอบ <id> ของรายการ เมื่อการดําเนินการสําเร็จ เนื้อหารายการข้อมูลทั้งหมดจะแสดงด้วยองค์ประกอบ <batch:status code="200"/>

หมายเหตุ: สําหรับฟีดบางรายการ คุณต้องระบุลิงก์ rel="edit" ของรายการที่มีคําขออัปเดตกลุ่ม ซึ่งรวมถึงฟีดที่รองรับ 1 เกิดขึ้นพร้อมกัน ซึ่งเป็นโปรโตคอลของ Google Data Protocol และฟีดที่ไม่มีรหัสซึ่งเป็น URL

<batch:operation type="patch"/>

ต่อไปนี้คือตัวอย่างคําขออัปเดตบางส่วน

<entry gd:fields="content" gd:etag="FE8LQQJJeSp7IWA6WhVa">
  <id>http://www.google.com/calendar/feeds/jo@gmail.com/private/full/entryID</id>
  <batch:operation type="patch"/>
  <title>New title</title>
</entry>

ตัวอย่างการตอบกลับที่สําเร็จมีดังนี้

<entry gd:etag="FE8LQQJJeSp7IWA6WhVa">
  <batch:status code="200"/>
  <id>http://www.google.com/calendar/feeds/jo@gmail.com/private/full/entryID</id>
  <batch:operation type="patch"/>
  <title>New title</title>
  <content></content>
  ...rest of the entry...
</entry>

ลบการดำเนินการ

<batch:operation type="delete">

การดําเนินการลบเทียบเท่ากับการเรียกใช้ DELETE ใน URL ที่อ้างอิงโดยองค์ประกอบ <id> ของรายการ สําหรับการดําเนินการลบ คุณต้องส่งองค์ประกอบ <id> เพื่อลบรายการเท่านั้น และจะไม่สนใจข้อมูลอื่นๆ ที่คุณระบุในองค์ประกอบที่ไม่ได้อยู่ในเนมสเปซ batch: เมื่อการดําเนินการสําเร็จ ระบบจะแสดงผลรายการที่มีรหัสเดียวกันพร้อมด้วยองค์ประกอบ <batch:status code="200"/>

หมายเหตุ: สําหรับฟีดบางรายการ คุณต้องระบุลิงก์ rel="edit" ของรายการที่มีคําขอลบเป็นกลุ่ม ซึ่งรวมถึงฟีดที่รองรับ 1 เกิดขึ้นพร้อมกัน ซึ่งเป็นโปรโตคอลของ Google Data Protocol และฟีดที่ไม่มีรหัสซึ่งเป็น URL

ตัวอย่างคําขอลบมีดังนี้

<entry>
  <batch:operation type="delete"/>
  <id>http://www.google.com/base/feeds/items/17437536661927313949</id>
</entry>

ตัวอย่างการตอบกลับที่สําเร็จมีดังนี้

<entry>
  <batch:operation type="delete"/>
  <id>http://www.google.com/base/feeds/items/17437536661927313949</id>
  <batch:status code="200" reason="Success"/>
</entry>

หมายเหตุ: ฟีดบางรายการใช้ ETag ที่มีประสิทธิภาพเพื่อป้องกันไม่ให้คุณแก้ไขการเปลี่ยนแปลงของบุคคลอื่นโดยไม่ตั้งใจ เมื่อส่งคําขอลบแบบกลุ่มสําหรับรายการในฟีดใดฟีดหนึ่ง คุณต้องระบุค่า ETag ในแอตทริบิวต์ gd:etag ของรายการ เช่น <entry gd:etag="'F08NQAxFdip7IWA6WhVR'">...<batch:operation type="delete"/>...

การดําเนินการค้นหา

<batch:operation type="query">

การดําเนินการค้นหาเทียบเท่ากับการดําเนินการ GET ใน URL ที่อ้างอิงโดยองค์ประกอบ <id> ของรายการ เมื่อการดําเนินการสําเร็จ ระบบจะแสดงผลเนื้อหาทั้งหมดในรายการ

หมายเหตุ: สําหรับฟีดบางรายการ คุณต้องระบุลิงก์ rel="self" ของรายการที่มีคําขอการค้นหาแบบกลุ่ม ซึ่งรวมถึงฟีดที่ไม่มีรหัสที่เป็น URL

ต่อไปนี้คือตัวอย่างของคําขอคําค้นหา

<entry>
  <id>http://www.google.com/base/feeds/items/1743753666192313949</id>
  <batch:operation type="query"/>
</entry>

ตัวอย่างการตอบกลับที่สําเร็จมีดังนี้

<entry>
  <id>http://www.google.com/base/feeds/items/1743753666192313949</id>
  <batch:operation type="query"/>
  <batch:status code="200" reason="Success"/>
   ...
</entry>

การดําเนินการติดตาม

ผลลัพธ์ข้อมูล Gdata ไม่จําเป็นต้องแสดงตามลําดับเดียวกับคําขอ คุณติดตามการดําเนินการได้ตลอดช่วงเวลาโดยใช้ตัวระบุ

สําหรับการอัปเดต ลบ และค้นหา คุณสามารถใช้รหัสของรายการเพื่อติดตามการดําเนินการได้

สําหรับการดําเนินการแทรก เนื่องจากยังไม่มีรหัส คุณจึงส่งในตัวระบุการดําเนินการได้ ตัวระบุนี้สามารถใช้เพื่อลิงก์รายการผลลัพธ์กับรายการคําขอ ระบบจะส่งตัวระบุการดําเนินการในองค์ประกอบ <batch:id>

สําหรับการดําเนินการแต่ละรายการ GData จะแสดงการตอบกลับซึ่งระบุว่าการดําเนินการสําเร็จหรือล้มเหลว แต่ละคําตอบจะระบุรายการที่เกี่ยวข้อง สําหรับการดําเนินการอัปเดต ลบ หรือทําการค้นหา หรือแทรกการดําเนินการสําเร็จ ระบบจะแสดงผลรหัสรายการออกมาเสมอ หากคุณระบุรหัสกลุ่ม ระบบจะส่งคืนรหัสดังกล่าวด้วย เนื่องจากการดําเนินการแทรกที่ไม่สําเร็จไม่มีรหัสรายการที่เกี่ยวข้อง โดยระบบจะแสดงเฉพาะรหัสกลุ่มเท่านั้น

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

เนื้อหาของ <batch:id> เป็นค่าสตริงที่ระบบกําหนดโดยไคลเอ็นต์ และจะสะท้อนกลับในรายการคําตอบที่เกี่ยวข้องคุณระบุค่าใดก็ได้ที่จะช่วยให้ไคลเอ็นต์เชื่อมโยงคําตอบกับรายการในคําขอเดิม องค์ประกอบนี้จะมีเสียงก้องเหมือนในรายการที่เกี่ยวข้อง แม้ว่าการดําเนินการจะล้มเหลวก็ตาม GData จะไม่จัดเก็บหรือตีความเนื้อหาของรหัสกลุ่มนี้

ตัวอย่างต่อไปนี้จะแสดงฟีดการดําเนินการแบบกลุ่ม โปรดทราบว่าองค์ประกอบ <batch:id> จะติดป้ายกํากับการดําเนินการนี้เป็น itemB

<entry>
  <title type="text">...</title>
  <content type="html">...</content>
  <batch:id>itemB</batch:id>
  <batch:operation type="insert"/>
  <g:item_type>recipes</g:item_type>
</entry>

ตัวอย่างต่อไปนี้แสดงรายการสถานะกลุ่มที่แสดงเพื่อตอบกลับการดําเนินการนี้

<entry>
  <id>http://www.google.com/base/feeds/items/2173859253842813008</id>
  <published>2006-07-11T14:51:43.560Z</published>
  <updated>2006-07-11T14:51: 43.560Z</updated>
  <title type="text">...</title>
  <content type="html">...</content>
  <link rel="self" 
    type="application/atom+xml" 
    href="http://www.google.com/base/feeds/items/2173859253842813008"/>
  <link rel="edit" 
    type="application/atom+xml" 
    href="http://www.google.com/base/feeds/items/2173859253842813008"/>
  <g:item_type>recipes</g:item_type>
  <batch:operation type="insert"/>
  <batch:id>itemB</batch:id>
  <batch:status code="201" reason="Created"/>
</entry>

การจัดการรหัสสถานะ

รหัสสถานะจะแสดงโดยองค์ประกอบต่อไปนี้

<batch:status code="200|201|404|500|..." reason="reason" [content-type="type"]/>

แต่ละรายการในฟีดการตอบกลับมีองค์ประกอบ <batch:status> 1 รายการ องค์ประกอบนี้อธิบายสิ่งที่เกิดขึ้นขณะดําเนินการ เลียนแบบการตอบสนอง HTTP ที่ระบบจะส่งหากมีการส่งที่เป็นการดําเนินการแยกกัน แทนที่จะเป็นส่วนหนึ่งของฟีดกลุ่ม

คุณต้องตรวจสอบเอลิเมนต์ <batch:status> ของแต่ละรายการในการตอบกลับเพื่อดูว่าการดําเนินการที่เกี่ยวข้องได้รับการประมวลผลสําเร็จหรือไม่ แอตทริบิวต์ code="n" มีรหัสสถานะ GData

คําอธิบายสถานะ

แอตทริบิวต์ reason="reason" ขององค์ประกอบ <batch:status> มีคําอธิบายแบบละเอียดของสถานะการดําเนินการ

ประเภทเนื้อหา

แอตทริบิวต์ content-type="type" ขององค์ประกอบ <batch:status> ประกอบด้วยประเภท MIME ของข้อมูลที่มีอยู่ในองค์ประกอบ <batch:status> ซึ่งสอดคล้องกับส่วนหัว Content-Type ของการตอบกลับสถานะ HTTP คุณจะระบุแอตทริบิวต์นี้หรือไม่ก็ได้

เมื่อตั้งค่าประเภทเนื้อหาแล้ว เนื้อความขององค์ประกอบ <batch:status> จะอธิบายบางอย่างผิดพลาดขณะประมวลผลรายการ

ระบุการดําเนินการที่ขัดจังหวะ

องค์ประกอบต่อไปนี้รวมอยู่ในการตอบกลับสําหรับการดําเนินการที่ขัดข้อง

<batch:interrupted reason="reason" success="N" failures="N" parsed="N">

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

องค์ประกอบนี้ที่ผิดปกติและมักจะระบุว่าฟีดที่ส่งในส่วนเนื้อหาของคําขอมีรูปแบบ XML ไม่ถูกต้อง

และจะเห็นรหัสสถานะสั้นๆ ในแอตทริบิวต์ reason เช่นเดียวกับองค์ประกอบ <batch:status> และอาจเห็นการตอบกลับที่นานขึ้นในองค์ประกอบด้วย

ตัวอย่างฟีดการดําเนินการแบบกลุ่มและฟีดสถานะ

นี่คือฟีดการดําเนินการแบบกลุ่มที่อาจส่งไปยังเซิร์ฟเวอร์ได้ ฟีดนี้จะขอให้เซิร์ฟเวอร์ลบ 2 รายการและเพิ่มรายการใหม่ 2 รายการ โปรดทราบว่าองค์ประกอบ <feed> ต้องมีการกําหนดเนมสเปซสําหรับแบบกลุ่มตามที่ไฮไลต์ในตัวอย่างด้านล่าง

POST : http://www.google.com/base/feeds/items/batch
<?xml version="1.0" encoding="UTF-8"?>
<feed
  xmlns="http://www.w3.org/2005/Atom"
  xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/"
  xmlns:g="http://base.google.com/ns/1.0"
  xmlns:batch="http://schemas.google.com/gdata/batch">
  <title type="text">My Batch Feed</title>
  <entry>
    <id>http://www.google.com/base/feeds/items/13308004346459454600</id>
    <batch:operation type="delete"/>
  </entry>
  <entry>
    <id>http://www.google.com/base/feeds/items/17437536661927313949</id>
    <batch:operation type="delete"/>
  </entry>
  <entry>
    <title type="text">...</title>
    <content type="html">...</content>
    <batch:id>itemA</batch:id>
    <batch:operation type="insert"/>
    <g:item_type>recipes</g:item_type>
  </entry>
  <entry>
    <title type="text">...</title>
    <content type="html">...</content>
    <batch:id>itemB</batch:id>
    <batch:operation type="insert"/>
    <g:item_type>recipes</g:item_type>
  </entry>
</feed>

สมมติว่าการแทรกทั้ง 2 รายการใช้งานได้ แต่หนึ่งในการลบ 2 รายการล้มเหลว ในกรณีนี้ ฟีดสถานะกลุ่มอาจมีลักษณะดังนี้ โปรดทราบว่ารายการที่เรียงลําดับใหม่เมื่อเทียบกับฟีดการดําเนินการแบบกลุ่ม

<?xml version="1.0" encoding="UTF-8"?>
<feed
  xmlns="http://www.w3.org/2005/Atom"
  xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/"
  xmlns:g="http://base.google.com/ns/1.0"
  xmlns:batch="http://schemas.google.com/gdata/batch">
  <id>http://www.google.com/base/feeds/items</id>
  <updated>2006-07-11T14:51:42.894Z</updated>
  <title type="text">My Batch</title>
  <link rel="http://schemas.google.com/g/2005#feed"
    type="application/atom+xml"
    href="http://www.google.com/base/feeds/items"/>
  <link rel="http://schemas.google.com/g/2005#post"
    type="application/atom+xml"
    href="http://www.google.com/base/feeds/items"/>
  <link rel=" http://schemas.google.com/g/2005#batch"
    type="application/atom+xml"
    href="http://www.google.com/base/feeds/items/batch"/>
  <entry>
    <id>http://www.google.com/base/feeds/items/2173859253842813008</id>
    <published>2006-07-11T14:51:43.560Z</published>
    <updated>2006-07-11T14:51: 43.560Z</updated>
    <title type="text">...</title>
    <content type="html">...</content>
    <link rel="self"
      type="application/atom+xml"
      href="http://www.google.com/base/feeds/items/2173859253842813008"/>
    <link rel="edit"
      type="application/atom+xml"
      href="http://www.google.com/base/feeds/items/2173859253842813008"/>
    <g:item_type>recipes</g:item_type>
    <batch:operation type="insert"/>
    <batch:id>itemB</batch:id>
    <batch:status code="201" reason="Created"/>
  </entry>
  <entry>
    <id>http://www.google.com/base/feeds/items/11974645606383737963</id>
    <published>2006-07-11T14:51:43.247Z</published>
    <updated>2006-07-11T14:51: 43.247Z</updated>
    <title type="text">...</title>
    <content type="html">...</content>
    <link rel="self"
      type="application/atom+xml"
      href="http://www.google.com/base/feeds/items/11974645606383737963"/>
    <link rel="edit"
      type="application/atom+xml"
      href="http://www.google.com/base/feeds/items/11974645606383737963"/>
    <g:item_type>recipes</g:item_type>
    <batch:operation type="insert"/>
    <batch:id>itemA</batch:id>
    <batch:status code="201" reason="Created"/>
  </entry>
  <entry>
    <id>http://www.google.com/base/feeds/items/13308004346459454600</id>
    <updated>2006-07-11T14:51:42.894Z</updated>
    <title type="text">Error</title>
    <content type="text">Bad request</content>
    <batch:status code="404"
      reason="Bad request"
      content-type="application/xml">
      <errors>
        <error type="request" reason="Cannot find item"/>
      </errors>
    </batch:status>
  </entry>
  <entry>
    <id>http://www.google.com/base/feeds/items/17437536661927313949</id>
    <updated>2006-07-11T14:51:43.246Z</updated>
    <content type="text">Deleted</content>
    <batch:operation type="delete"/>
    <batch:status code="200" reason="Success"/>
  </entry>
</feed>

การใช้ฟังก์ชันการทํางานแบบกลุ่มของไลบรารีไคลเอ็นต์ GData Java

ส่วนนี้อธิบายวิธีใช้ฟังก์ชันกลุ่มของไลบรารีของไคลเอ็นต์ GData Java เพื่อส่งกลุ่มการแทรก อัปเดต และ/หรือลบคําขอ

ตัวอย่างในส่วนนี้ใช้ Google Base API

ก่อนอื่นโปรดนําเข้าชั้นเรียนที่ต้องการ นอกจากชั้นเรียน GData และ Google Base แบบมาตรฐาน ดังนี้

import com.google.gdata.data.batch.*;
import com.google.api.gbase.client.*;

หากต้องการส่งคําขอแบบกลุ่ม คุณต้องมี URL กลุ่มจากฟีด ข้อมูลโค้ดต่อไปนี้สาธิตวิธีดําเนินการดังกล่าว โดยสมมติว่า feed เป็นออบเจ็กต์ GoogleBaseFeed ที่มีข้อมูลเกี่ยวกับฟีด

Link batchLink = feed.getLink(Link.Rel.FEED_BATCH, Link.Type.ATOM);
if (batchLink != null) {
  URL batchUrl = new URL(batchLink.getHref());
  ... // batch handling
} else {
  // batching is not supported for this feed
}

ข้อมูลโค้ดต่อไปนี้จะจัดเตรียมฟีดที่จะแทรก 2 รายการในการดําเนินการเดียว

GoogleBaseEntry entry1 = new GoogleBaseEntry();
...   // initialize entry 1 content
BatchUtils.setBatchId(entry1, "A"); // A is the local batch ID for this entry
feed.addEntry(entry1);
GoogleBaseEntry entry2 = new GoogleBaseEntry();
... // initialize entry 2 content
BatchUtils.setBatchId(entry2, "B"); // B is the local batch ID for this entry
feed.addEntry(entry2);

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

หากต้องการส่งฟีดกลุ่มและรับผลลัพธ์ ให้เรียกใช้เมธอด Service.batch

Service.batch จะแสดงผลรายการที่แทรกพร้อมกับค่า <atom:id> ใหม่เหมือนกับ Service.insert ส่วนรายการส่งคืนจะอยู่ในออบเจ็กต์ GoogleBaseFeed

หากต้องการลบรายการครั้งที่ 3 (ที่คุณได้ดึงข้อมูลและจัดเก็บไว้ใน entry3) พร้อมกับแทรกอีก 2 รายการ คุณสามารถใช้โค้ดต่อไปนี้

GoogleBaseEntry toDelete = new GoogleBaseEntry();


toDelete.setId(entry3.getId());
BatchUtils.setBatchOperationType(toDelete, BatchOperationType.DELETE);

feed.addEntry(toDelete);


GoogleBaseFeed result = service.batch(batchUrl, feed);

ในที่นี้ service เป็นอินสแตนซ์ของ com.google.gdata.client.Service

หากต้องการอัปเดตรายการ ให้ระบุ OperationType.UPDATE แล้วเริ่มรายการด้วยการเปลี่ยนแปลงที่ต้องการแทนการเว้นว่างไว้

ตัวอย่างเหล่านี้ใช้ Google Base Data API หากคุณใช้ service.batch กับบริการ GData ประเภทอื่น ให้เปลี่ยนคลาส GoogleBaseFeed, GoogleBaseEntry และ GoogleBaseService เป็นฟีด รายการ และคลาสบริการที่เหมาะสม

ผลการดําเนินการแบบกลุ่มไม่จําเป็นต้องแสดงตามลําดับที่มีการขอ ในตัวอย่างข้างต้น ฟีดผลลัพธ์อาจมี entry2 ตามด้วย entry1 คุณไม่ควรคิดว่ารายการส่งคืนจะเรียงลําดับในลําดับใดก็ตาม

ฟีดการดําเนินการแบบกลุ่มควรกําหนดรหัสกลุ่มที่ไม่ซ้ํากันให้กับการดําเนินการแทรกแต่ละรายการตามที่อธิบายไว้ในการดําเนินการติดตาม ในตัวอย่างข้างต้น รหัสกลุ่มคือ A และ B ดังนั้น หากต้องการหาสถานะของการดําเนินการที่ขอ คุณควรทําซ้ํารายการในฟีดแบบกลุ่มที่แสดงผล และเปรียบเทียบรหัสกลุ่มหรือรหัสรายการ ดังนี้

for (GoogleBaseEntry entry : result.getEntries()) {
  String batchId = BatchUtils.getBatchId(entry);      
  if (BatchUtils.isSuccess(entry)) {     
    if ("A".equals(batchId)) {       
      entry1 = entry;     } 
    else if ("B".equals(batchId)) {       
      entry2 = entry;     } 
    else if (BatchUtils.getBatchOperationType(entry) 
      == BatchOperationType.DELETE) {       
      System.out.println("Entry " + entry.getId() +
      " has been deleted successfully.");     
    }      
  } else {     
    BatchStatus status = BatchUtils.getBatchStatus(entry);     
    System.err.println(batchId + " failed (" +                
      status.getReason() + ") " +  status.getContent());      
    }    
  } 

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

การตรวจสอบจะดําเนินการในตัวอย่างข้างต้นโดยใช้วิธีการที่สะดวก BatchUtils.isSuccess ในกรณีนี้จึงเทียบเท่ากับ BatchUtils.getBatchStatus(entry) < 300

และมีคําอธิบายรหัสสถานะและการตอบสนองเพิ่มเติมในการจัดการรหัสสถานะ

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