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