รับเวอร์ชันที่เฉพาะเจาะจงของทรัพยากร

ทรัพยากรทุกรายการจะมีช่องเวอร์ชันที่เปลี่ยนแปลงทุกครั้งที่ทรัพยากรเปลี่ยนแปลง ซึ่งเป็นช่อง etag Etags เป็นส่วนหนึ่งของ HTTP มาตรฐานและรองรับในปฏิทิน API 2 กรณีดังนี้

  • เกี่ยวกับการแก้ไขทรัพยากรเพื่อให้แน่ใจว่าไม่มีผู้อื่นเขียนข้อมูลลงในทรัพยากรนี้ในระหว่างนี้ (การแก้ไขแบบมีเงื่อนไข)
  • ในการดึงข้อมูลทรัพยากรเพื่อดึงข้อมูลทรัพยากรเฉพาะในกรณีที่มีการเปลี่ยนแปลงทรัพยากร (การดึงข้อมูลแบบมีเงื่อนไข)

การแก้ไขแบบมีเงื่อนไข

หากต้องการอัปเดตหรือลบทรัพยากรเฉพาะในกรณีที่ไม่มีการเปลี่ยนแปลงตั้งแต่ดึงข้อมูลครั้งล่าสุด คุณสามารถระบุส่วนหัว If-Match ที่มีค่าของ etag จากการดึงข้อมูลครั้งก่อนหน้า ซึ่งมีประโยชน์มากในการป้องกันการแก้ไขทรัพยากรที่สูญหาย ลูกค้ามีตัวเลือกในการเรียกข้อมูลอีกครั้งและนําการเปลี่ยนแปลงไปใช้อีกครั้ง

หากรายการ (และ 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 จากการดึงข้อมูลครั้งก่อนหน้า หากรายการ (และ etag ของรายการ) เปลี่ยนแปลงไปนับตั้งแต่การดึงข้อมูลครั้งล่าสุด ระบบจะแสดงทรัพยากรเวอร์ชันใหม่ที่มี 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;
      }
    }
  }