ทรัพยากรทุกรายการจะมีช่องเวอร์ชันที่มีการเปลี่ยนแปลงทุกครั้งเมื่อมีการเปลี่ยนแปลงทรัพยากร ซึ่งก็คือช่อง etag
Etag เป็นส่วนมาตรฐานของ HTTP และได้รับการสนับสนุนใน API ปฏิทินใน 2 กรณี ดังนี้
- เกี่ยวกับการแก้ไขทรัพยากรเพื่อให้แน่ใจว่าไม่มีการเขียนอื่นลงในทรัพยากรนี้ ในระหว่างนี้ (การแก้ไขตามเงื่อนไข)
- ในการดึงข้อมูลทรัพยากรเพื่อเรียกข้อมูลทรัพยากรต่อเมื่อทรัพยากรมีการเปลี่ยนแปลงเท่านั้น (การดึงข้อมูลตามเงื่อนไข)
การแก้ไขแบบมีเงื่อนไข
หากต้องการอัปเดตหรือลบทรัพยากรก็ต่อเมื่อไม่มีการเปลี่ยนแปลงหลังจากเรียกข้อมูลครั้งล่าสุด คุณจะระบุส่วนหัว If-Match
ที่มีค่าของแท็กจากการดึงข้อมูลครั้งก่อนได้ ซึ่งมีประโยชน์มากในการป้องกัน
การแก้ไขที่สูญหายในทรัพยากร ไคลเอ็นต์จะเรียกข้อมูลทรัพยากรและนำการเปลี่ยนแปลงไปใช้อีกครั้งได้
ถ้ารายการ (และแท็ก etag) ไม่เปลี่ยนแปลงตั้งแต่การเรียกครั้งล่าสุด การแก้ไขก็สำเร็จและระบบจะส่งคืนทรัพยากรเวอร์ชันใหม่ที่มี etag ใหม่ ไม่เช่นนั้น คุณจะได้รับรหัสการตอบกลับ 412 (เงื่อนไขที่ต้องดำเนินการก่อนล้มเหลว)
ข้อมูลโค้ดตัวอย่างด้านล่างแสดงวิธีทำการเปลี่ยนแปลงแบบมีเงื่อนไขด้วยไลบรารีของไคลเอ็นต์ Java
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) มีการเปลี่ยนแปลงหลังจากการเรียกครั้งล่าสุด ระบบจะแสดงแหล่งข้อมูลเวอร์ชันใหม่ที่มีแท็กใหม่ ไม่เช่นนั้นคุณจะได้รับรหัสการตอบกลับ 304 (ไม่ได้แก้ไข)
ข้อมูลโค้ดตัวอย่างด้านล่างแสดงวิธีดึงข้อมูลแบบมีเงื่อนไขด้วยไลบรารีของไคลเอ็นต์ Java
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; } } }