API エラーの処理

Calendar API は、次の 2 つのレベルのエラー情報を返します。

  • ヘッダーの HTTP エラーコードとメッセージ
  • レスポンス本文の JSON オブジェクト。エラーの処理方法を判断するのに役立つ追加情報が含まれています。

このページの残りの部分では、カレンダー エラーのリファレンスと、アプリでエラーを処理する方法について説明します。

指数バックオフを実装する

Cloud APIs のドキュメントでは、指数バックオフと Google API での使用方法について詳しく説明しています。

エラーと推奨される対応

このセクションでは、一覧表示された各エラーの完全な JSON 表現と、エラーの処理に役立つ推奨されるアクションについて説明します。

400: Bad Request

ユーザーエラー。これは、必須のフィールドまたはパラメータが指定されていないか、指定された値が無効であるか、指定されたフィールドの組み合わせが無効であることを意味します。

{
 "error": {
  "errors": [
   {
    "domain": "calendar",
    "reason": "timeRangeEmpty",
    "message": "The specified time range is empty.",
    "locationType": "parameter",
    "location": "timeMax",
   }
  ],
  "code": 400,
  "message": "The specified time range is empty."
 }
}

推奨される対応: これは永続的なエラーであるため、再試行しないでください。代わりにエラー メッセージを読み、それに応じてリクエストを変更します。

401: 無効な認証情報

無効な認可ヘッダー。使用しているアクセス トークンが期限切れか無効です。

{
 "error": {
  "errors": [
   {
    "domain": "global",
    "reason": "authError",
    "message": "Invalid Credentials",
    "locationType": "header",
    "location": "Authorization",
   }
  ],
  "code": 401,
  "message": "Invalid Credentials"
 }
}

推奨される対処方法:

  • 有効期間の長い更新トークンを使用して、新しいアクセス トークンを取得します。
  • これが失敗した場合は、OAuth 2.0 でリクエストを承認するで説明されているように、ユーザーに OAuth フローを案内します。
  • サービス アカウントにこのメッセージが表示された場合は、サービス アカウント ページのすべての手順が正常に完了していることを確認してください。

403: ユーザーのデータ処理の上限を超えています

デベロッパー コンソールのいずれかの上限に達しました。

{
 "error": {
  "errors": [
   {
    "domain": "usageLimits",
    "reason": "userRateLimitExceeded",
    "message": "User Rate Limit Exceeded"
   }
  ],
  "code": 403,
  "message": "User Rate Limit Exceeded"
 }
}

推奨される対処方法:

403: レート制限を超えています

ユーザーが、カレンダーまたは認証済みユーザーあたりの Google Calendar API の最大リクエスト レートに達しました。

{
 "error": {
  "errors": [
   {
    "domain": "usageLimits",
    "reason": "rateLimitExceeded",
    "message": "Rate Limit Exceeded"
   }
  ],
  "code": 403,
  "message": "Rate Limit Exceeded"
 }
}

推奨されるアクション: rateLimitExceeded エラーは 403 または 429 のエラーコードを返す場合があります。現在、これらのエラーコードは機能的に類似しているため、指数バックオフを使用して同じ方法で応答する必要があります。また、割り当てを管理するのベスト プラクティスに沿ってアプリを作成してください。

403: カレンダーの使用制限を超えています

ユーザーが、Google のユーザーとインフラストラクチャを不正行為から保護するために設けられている Google カレンダーの制限のいずれかに達した。

{
 "error": {
  "errors": [
   {
    "domain": "usageLimits",
    "message": "Calendar usage limits exceeded.",
    "reason": "quotaExceeded"
   }
  ],
  "code": 403,
  "message": "Calendar usage limits exceeded."
 }
}

推奨される対処方法:

403: 主催者以外のユーザーはアクセスできません

イベントの更新リクエストで、主催者のものではないコピーに共有イベント プロパティのいずれかを設定しようとしています。共有プロパティ(guestsCanInviteOthersguestsCanModifyguestsCanSeeOtherGuests など)は、主催者のみが設定できます。

{
 "error": {
  "errors": [
   {
    "domain": "calendar",
    "reason": "forbiddenForNonOrganizer",
    "message": "Shared properties can only be changed by the organizer of the event."
   }
  ],
  "code": 403,
  "message": "Shared properties can only be changed by the organizer of the event."
 }
}

推奨される対処方法:

  • Events: insertEvents: importEvents: update を使用しているときに、リクエストに共有プロパティが含まれていない場合、これはプロパティをデフォルト値に設定しようとするのと同じです。代わりに イベント: パッチを使用することを検討してください。
  • リクエストに共有プロパティが含まれている場合は、主催者のコピーを更新する場合にのみ、これらのプロパティを変更するようにしてください。

404: 見つかりません

指定されたリソースが見つかりません。この問題は、次のような場合に発生することがあります。次に例を示します。

  • リクエストされたリソース(指定された ID を持つリソース)が存在しなかった場合
  • ユーザーがアクセスできないカレンダーにアクセスする場合

    { "error": { "errors": [ { "domain": "global", "reason": "notFound", "message": "Not Found" } ], "code": 404, "message": "Not Found" } }

推奨される対応: 指数バックオフを使用します。

409: リクエストされた ID はすでに存在します

指定された ID のインスタンスがストレージにすでに存在します。

{
 "error": {
  "errors": [
   {
    "domain": "global",
    "reason": "duplicate",
    "message": "The requested identifier already exists."
   }
  ],
  "code": 409,
  "message": "The requested identifier already exists."
 }
}

推奨される対応: 新しいインスタンスを作成する場合は新しい ID を生成します。それ以外の場合は、update メソッド呼び出しを使用します。

409: Conflict

events.batch オペレーション内のバッチ処理されたアイテムは、他のリクエストされたバッチ処理されたアイテムとのオペレーションの競合により実行できません。

{
 "error": {
  "errors": [
   {
    "domain": "global",
    "reason": "conflict",
    "message": "Conflict"
   }
  ],
  "code": 409,
  "message": "Conflict"
 }
}

推奨されるアクション: 正常に完了したバッチアイテムと、確実に失敗したバッチアイテムをすべて除外し、残りのアイテムを別の events.batch または対応する単一イベント オペレーションで再試行します。

410: 存在しません

syncToken パラメータまたは updatedMin パラメータは無効になりました。このエラーは、すでに削除されているアクティビティをリクエストで削除しようとした場合にも発生することがあります。

{
 "error": {
  "errors": [
   {
    "domain": "calendar",
    "reason": "fullSyncRequired",
    "message": "Sync token is no longer valid, a full sync is required.",
    "locationType": "parameter",
    "location": "syncToken",
    }
  ],
  "code": 410,
  "message": "Sync token is no longer valid, a full sync is required."
 }
}

または

{
 "error": {
  "errors": [
   {
    "domain": "calendar",
    "reason": "updatedMinTooLongAgo",
    "message": "The requested minimum modification time lies too far in the past.",
    "locationType": "parameter",
    "location": "updatedMin",
   }
  ],
  "code": 410,
  "message": "The requested minimum modification time lies too far in the past."
 }
}

または

{
 "error": {
  "errors": [
   {
    "domain": "global",
    "reason": "deleted",
    "message": "Resource has been deleted"
   }
  ],
  "code": 410,
  "message": "Resource has been deleted"
 }
}

推奨される対応策: syncToken パラメータまたは updatedMin パラメータの場合は、ストアをワイプして再同期します。詳細については、リソースを効率的に同期するをご覧ください。すでに削除されたイベントについては、これ以上の対応は必要ありません。

412: 前提条件の不備

If-match ヘッダーで指定された ETag が、リソースの現在の ETag と一致しなくなった。

{
 "error": {
  "errors": [
   {
    "domain": "global",
    "reason": "conditionNotMet",
    "message": "Precondition Failed",
    "locationType": "header",
    "location": "If-Match",
    }
  ],
  "code": 412,
  "message": "Precondition Failed"
 }
}

推奨される対応: エンティティを再取得して、変更を再度適用します。詳細については、リソースの特定のバージョンを取得するをご覧ください。

429: リクエストが多すぎます

rateLimitExceeded エラーは、ユーザーが一定時間内に送信したリクエストが多すぎる場合に発生します。

{
  "error": {
    "errors": [
      {
        "domain": "usageLimits",
        "reason": "rateLimitExceeded",
        "message": "Rate Limit Exceeded"
      }
    ],
    "code": 429,
    "message": "Rate Limit Exceeded"
  }
}

推奨されるアクション: rateLimitExceeded エラーは 403 または 429 のエラーコードを返す場合があります。現在、これらのエラーコードは機能的に類似しているため、指数バックオフを使用して同じ方法で応答する必要があります。また、割り当てを管理するのベスト プラクティスに沿ってアプリを作成してください。

500: バックエンド エラー

リクエストの処理中に予期しないエラーが発生しました。

{
 "error": {
  "errors": [
   {
    "domain": "global",
    "reason": "backendError",
    "message": "Backend Error",
   }
  ],
  "code": 500,
  "message": "Backend Error"
 }
}

推奨される対応: 指数バックオフを使用します。