특정 버전의 리소스 가져오기

모든 리소스에는 리소스가 변경될 때마다 변경되는 버전 필드(etag 필드)가 있습니다. ETag는 HTTP의 표준 부분이며 두 가지 경우에 대해 캘린더 API에서 지원됩니다.

  • 리소스 수정 시점 (조건부 수정)에 이 리소스에 다른 쓰기가 없었는지 확인합니다.
  • 리소스 검색 시 리소스가 변경된 경우에만 리소스 데이터를 검색합니다 (조건부 검색).

조건부 수정

리소스가 마지막으로 검색된 이후 변경되지 않은 경우에만 리소스를 업데이트하거나 삭제하려면 이전 검색의 etag 값이 포함된 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));
    }
  }

조건부 검색

리소스를 마지막으로 검색한 이후에 변경된 경우에만 검색하려면 이전 검색의 etag 값이 포함된 If-None-Match 헤더를 지정하면 됩니다. 항목 (및 이에 따른 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;
      }
    }
  }