هر منبع فیلد نسخهای دارد که هربار منبع تغییر میکند، آن هم تغییر میکند — فیلد etag. Etags بخشی استاندارد از HTTP است و
در calendar API برای دو مورد پشتیبانی میشود:
- در اصلاحات منبع برای اطمینان از اینکه در این فاصله هیچ نوشتن دیگری در این منبع انجام نشده است (اصلاح مشروط)
- در بازیابی منبع برای بازیابی دادههای منبع فقط درصورتیکه منبع تغییر کرده باشد (بازیابی شرطی)
اصلاح مشروط
اگر میخواهید منبعی را فقط درصورتی بهروزرسانی یا حذف کنید که از آخرین باری که آن را بازیابی کردهاید تغییر نکرده باشد، میتوانید سرصفحه If-Match را که حاوی مقدار etag از بازیابی قبلی است مشخص کنید. این کار برای جلوگیری از
ازدست رفتن اصلاحات در منابع بسیار مفید است. مشتریان این گزینه را دارند که منبع را دوباره بازیابی کنند و تغییرات را دوباره اعمال کنند.
اگر ورودی (و etag آن) از آخرین بازیابی تغییر نکرده باشد، اصلاح موفقیتآمیز است و نسخه جدید منبع با etag جدید برگردانده میشود. درغیراینصورت، کد پاسخ ۴۱۲ (پیششرط ناموفق) را دریافت خواهید کرد.
تکهکد نمونه زیر نحوه انجام اصلاحات شرطی را با کتابخانه کارخواه جاوا نشان میدهد.
private static void run() throws IOException { // Create a test event. Event event = Utils.createTestEvent(client, "Test Event"); System.out.println(String.format("Event created: %s", event.getHtmlLink())); // Pause while the user modifies the event in the Calendar UI. System.out.println("Modify the event's description and hit enter to continue."); System.in.read(); // Modify the local copy of the event. event.setSummary("Updated Test Event"); // Update the event, making sure that we don't overwrite other changes. int numAttempts = 0; boolean isUpdated = false; do { Calendar.Events.Update request = client.events().update("primary", event.getId(), event); request.setRequestHeaders(new HttpHeaders().setIfMatch(event.getEtag())); try { event = request.execute(); isUpdated = true; } catch (GoogleJsonResponseException e) { if (e.getStatusCode() == 412) { // A 412 status code, "Precondition failed", indicates that the etag values didn't // match, and the event was updated on the server since we last retrieved it. Use // {@link Calendar.Events.Get} to retrieve the latest version. Event latestEvent = client.events().get("primary", event.getId()).execute(); // You may want to have more complex logic here to resolve conflicts. In this sample we're // simply overwriting the summary. latestEvent.setSummary(event.getSummary()); event = latestEvent; } else { throw e; } } numAttempts++; } while (!isUpdated && numAttempts <= MAX_UPDATE_ATTEMPTS); if (isUpdated) { System.out.println("Event updated."); } else { System.out.println(String.format("Failed to update event after %d attempts.", numAttempts)); } }
بازیابی مشروط
اگر میخواهید منبعی را فقط درصورتی بازیابی کنید که از آخرینباری که آن را بازیابی کردهاید تغییر کرده باشد، میتوانید سرصفحه If-None-Match را که حاوی مقدار etag از بازیابی قبلی است مشخص کنید. اگر ورودی (و درنتیجه etag آن)
از آخرین بازیابی تغییر کرده باشد، نسخه جدید منبع با
etag جدید برگردانده خواهد شد. درغیراینصورت، کد پاسخ ۳۰۴ (اصلاحنشده) را دریافت خواهید کرد.
تکهکد نمونه زیر نحوه انجام بازیابی شرطی را بااستفاده از کتابخانه کارخواه جاوا نشان میدهد.
private static void run() throws IOException { // Create a test event. Event event = Utils.createTestEvent(client, "Test Event"); System.out.println(String.format("Event created: %s", event.getHtmlLink())); // Pause while the user modifies the event in the Calendar UI. System.out.println("Modify the event's description and hit enter to continue."); System.in.read(); // Fetch the event again if it's been modified. Calendar.Events.Get getRequest = client.events().get("primary", event.getId()); getRequest.setRequestHeaders(new HttpHeaders().setIfNoneMatch(event.getEtag())); try { event = getRequest.execute(); System.out.println("The event was modified, retrieved latest version."); } catch (GoogleJsonResponseException e) { if (e.getStatusCode() == 304) { // A 304 status code, "Not modified", indicates that the etags match, and the event has // not been modified since we last retrieved it. System.out.println("The event was not modified, using local version."); } else { throw e; } } }