پردازش دسته ای در پروتکل داده گوگل

پردازش دسته ای به شما این امکان را می دهد که چندین عملیات را در یک درخواست اجرا کنید، نه اینکه مجبور باشید هر عملیات را به صورت جداگانه ارسال کنید.

توجه : برای انجام عملیات دسته ای، باید از نسخه اخیر کتابخانه سرویس گیرنده Google Data API خود استفاده کنید. عملیات دسته ای توسط کتابخانه سرویس گیرنده جاوا اسکریپت پشتیبانی نمی شود.

حضار

این سند برای برنامه نویسانی در نظر گرفته شده است که می خواهند چندین عملیات را در یک درخواست با استفاده از پردازش دسته ای ارسال کنند.

این سند فرض می کند که شما با استفاده از GData Java Client Library آشنا هستید. مثال‌های موجود در این سند نحوه استفاده از کتابخانه سرویس گیرنده جاوا را برای اجرای عملیات دسته‌ای نشان می‌دهند.

نمونه‌های این سند مختص Google Base Data API هستند. با این حال، سایر خدمات نیز ممکن است قابلیت های دسته ای را ارائه دهند.

توجه: پروتکل و رویه‌های کلی برای سایر کتابخانه‌های سرویس گیرنده یکسان خواهد بود، اما روش‌های خاص برای انجام درخواست‌های دسته‌ای ممکن است متفاوت باشد. لطفاً به اسناد خاص کتابخانه مشتری مراجعه کنید.

معرفی

با استفاده از یک فید دسته ای GData، می توانید چندین عملیات درج، به روز رسانی، حذف و پرس و جو را جمع آوری کنید و سپس همه آنها را به یکباره ارسال و اجرا کنید.

به عنوان مثال، فید زیر شامل چهار عملیات است:

<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 رابطه پیوند نشانی اینترنتی را که ممکن است اسناد فید برای عملیات دسته ای پست شود را مشخص می کند.

برای مثال، اگر اجرا کنید: GET http://www.google.com/base/feeds/items (فید معمولی «اقلام» پایگاه Google)، ممکن است پاسخ زیر را دریافت کنید:

<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 مگابایت (1,048,576 بایت) تجاوز نکند. به طور کلی، تا زمانی که حجم کل بایت از 1 مگابایت تجاوز نکند، محدودیتی در تعداد عملیاتی که می‌توانید درخواست کنید وجود ندارد. با این حال، برخی از خدمات ممکن است محدودیت های اضافی ایجاد کنند.

برای استفاده از عملیات دسته ای، باید اعلان فضای نام دسته ای را به عنوان یک ویژگی به عنصر <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">

یک عملیات درج معادل POST کردن ورودی است. هنگامی که عملیات با موفقیت انجام شد، کل محتوای ورودی با یک عنصر <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" ورودی را با درخواست های به روز رسانی دسته ای مشخص کنید. این شامل فیدهایی می‌شود که از هم‌زمانی خوش‌بینانه به سبک v1 پروتکل داده Google پشتیبانی می‌کنند و فیدهایی که شناسه‌های 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" ورودی را با درخواست های به روز رسانی دسته ای مشخص کنید. این شامل فیدهایی می‌شود که از هم‌زمانی خوش‌بینانه به سبک v1 پروتکل داده Google پشتیبانی می‌کنند و فیدهایی که شناسه‌های 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" ورودی را با درخواست های حذف دسته ای مشخص کنید. این شامل فیدهایی می‌شود که از هم‌زمانی خوش‌بینانه به سبک v1 پروتکل داده Google پشتیبانی می‌کنند و فیدهایی که شناسه‌های 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 مشخص کرده اید، این نیز برگردانده می شود. از آنجایی که عملیات درج ناموفق هیچ شناسه ورودی مرتبطی ندارد، فقط شناسه دسته ای بازگردانده می شود.

با استفاده از شناسه هر عملیات، می‌توانید فقط عملیات‌هایی را که شکست خورده‌اند دوباره امتحان کنید، نه اینکه مجبور باشید کل دسته عملیات را دوباره ارسال کنید.

محتوای <batch:id> یک مقدار رشته ای است که توسط مشتری تعریف شده است و در ورودی پاسخ مربوطه بازتاب داده می شود. شما می توانید هر مقداری را که به مشتری کمک می کند تا پاسخ را با ورودی درخواست اصلی مرتبط کند، تعیین کنید. این عنصر همانطور که هست در ورودی مربوطه تکرار می شود، حتی اگر عملیات شکست بخورد. GData هرگز محتوای این Batch ID را ذخیره و تفسیر نمی کند.

مثال زیر یک فید عملیات دسته ای را نشان می دهد. توجه داشته باشید که عنصر <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> است. این عنصر آنچه را که در حین اجرای عملیات رخ داده است را توصیف می کند. این پاسخ 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 درستی نبوده است.

همانند عنصر <batch:status> ، یک کد وضعیت کوتاه را می توان در ویژگی reason یافت. ممکن است پاسخ طولانی تری نیز در داخل عنصر پیدا شود.

نمونه عملیات دسته ای و فیدهای وضعیت

در اینجا یک فید عملیات دسته ای است که می تواند به سرور ارسال شود. این فید از سرور درخواست می کند که دو ورودی را حذف کرده و دو ورودی جدید اضافه کند. توجه داشته باشید که عنصر <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>

بیایید فرض کنیم که دو درج کار کردند، اما یکی از دو حذف ناموفق بود. در این حالت، فید وضعیت دسته ممکن است به شکل زیر باشد. توجه داشته باشید که ورودی‌ها در مقایسه با فید عملیات دسته‌ای مرتب شده‌اند.

<?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

این بخش نحوه استفاده از عملکرد دسته ای کتابخانه سرویس گیرنده GData Java را برای ارسال گروهی از درخواست های درج، به روز رسانی و/یا حذف توضیح می دهد.

مثال‌های ارائه شده در این بخش از APIهای Google Base استفاده می‌کنند.

ابتدا کلاس‌هایی را که نیاز دارید، علاوه بر کلاس‌های استاندارد 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
}

قطعه کد زیر یک فید آماده می کند که دو ورودی را در یک عملیات وارد می کند:

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.insert ، Service.batch ورودی های درج شده را با مجموعه مقادیر جدید <atom:id> برمی گرداند. ورودی های برگشتی در یک شیء GoogleBaseFeed قرار دارند.

اگر می‌خواهید یک ورودی سوم (که قبلاً در entry3 واکشی و ذخیره کرده‌اید) را همزمان با وارد کردن دو ورودی دیگر حذف کنید، می‌توانید از کد زیر استفاده کنید:

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 باشد. هرگز نباید فرض کنید که ورودی ها به ترتیب خاصی برگردانده شده اند.

همانطور که در عملیات ردیابی توضیح داده شده است، فید عملیات دسته ای شما باید به هر عملیات درج یک شناسه دسته منحصر به فرد اختصاص دهد. در مثال های بالا، Batch ID ها 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 .

کدهای وضعیت و پاسخ ها در Handling status codes توضیح بیشتری داده شده است.

بازگشت به بالا