هر منبع دارای یک فیلد نسخه است که هر بار که منبع تغییر می کند تغییر می کند - فیلد etag
. تگ ها بخشی استاندارد از HTTP هستند و در API تقویم برای دو مورد پشتیبانی می شوند:
- در مورد اصلاحات منبع برای اطمینان از اینکه در این مدت هیچ نوشته دیگری در این منبع وجود نداشته است (اصلاح مشروط)
- در بازیابی منبع برای بازیابی اطلاعات منبع فقط در صورتی که منبع تغییر کرده باشد (بازیابی مشروط)
اصلاح مشروط
اگر میخواهید منبعی را فقط در صورتی بهروزرسانی یا حذف کنید که از آخرین باری که آن را بازیابی کردهاید تغییری نکرده باشد، میتوانید یک سرصفحه If-Match
را مشخص کنید که حاوی مقدار تگ از بازیابی قبلی باشد. این برای جلوگیری از تغییرات از دست رفته در منابع بسیار مفید است. مشتریان این گزینه را دارند که منبع را دوباره بازیابی کنند و تغییرات را دوباره اعمال کنند.
اگر ورودی (و برچسب آن) از آخرین بازیابی تغییر نکرده باشد، اصلاح با موفقیت انجام می شود و نسخه جدید منبع با برچسب جدید برگردانده می شود. در غیر این صورت، کد پاسخ 412 (پیش شرط ناموفق) را دریافت خواهید کرد.
قطعه کد نمونه زیر نحوه انجام تغییرات شرطی با کتابخانه سرویس گیرنده جاوا را نشان می دهد.
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
که حاوی مقدار تگ از بازیابی قبلی است را مشخص کنید. اگر ورودی (و بنابراین برچسب آن) از آخرین بازیابی تغییر کرده باشد، نسخه جدید منبع با برچسب جدید برگردانده می شود. در غیر این صورت کد پاسخ 304 (عدم اصلاح) را دریافت خواهید کرد.
قطعه کد نمونه زیر نحوه انجام بازیابی شرطی با کتابخانه سرویس گیرنده جاوا را نشان می دهد.
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; } } }