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