API hatalarını işleme

Takvim API'si iki düzeyde hata bilgisi döndürür:

  • Başlıktaki HTTP hata kodları ve mesajları
  • Yanıt gövdesinde, hatanın nasıl işleneceğini belirlemenize yardımcı olabilecek ek ayrıntılara sahip bir JSON nesnesidir.

Bu sayfanın geri kalanında Takvim hatalarına referans verilmiş ve uygulamanızda bu hataların nasıl düzeltileceği hakkında bazı bilgiler verilmiştir.

Eksponansiyel geri yükleme uygulayın

Cloud APIs belgelerinde, üstel geri çekilme ve bunun Google API'leriyle nasıl kullanılacağıyla ilgili açıklayıcı açıklamalar yer almaktadır.

Hatalar ve önerilen işlemler

Bu bölümde, listelenen her bir hatanın eksiksiz JSON temsili ve bu hatalarla başa çıkmak için atabileceğiniz önerilen işlemler yer almaktadır.

400: Hatalı İstek

Kullanıcı hatası. Bu durum, zorunlu bir alanın veya parametrenin sağlanmadığı, sağlanan değerin geçersiz olduğu ya da sağlanan alanların kombinasyonunun geçersiz olduğu anlamına gelebilir.

{
 "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."
 }
}

Önerilen işlem: Bu kalıcı bir hata olduğundan tekrar denemeyin. Bunun yerine hata mesajını okuyun ve isteğinizi buna göre değiştirin.

401: Geçersiz Kimlik Bilgileri

Geçersiz yetkilendirme başlığı. Kullandığınız erişim jetonunun süresi dolmuş veya geçersiz.

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

Önerilen işlemler:

  • Uzun ömürlü yenileme jetonunu kullanarak yeni bir erişim jetonu alın.
  • Bu başarısız olursa kullanıcıyı OAuth 2.0 ile istekleri yetkilendirme bölümünde açıklandığı gibi OAuth akışına yönlendirin.
  • Bu mesajı bir hizmet hesabı için görüyorsanız hizmet hesabı sayfasındaki tüm adımları başarıyla tamamladığınızdan emin olun.

403: Kullanıcı Hız Sınırı Aşıldı

Geliştirici Konsolu'ndaki sınırlardan birine ulaşıldı.

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

Önerilen işlemler:

403: Hız Sınırı Aşıldı

Kullanıcı, takvim veya kimliği doğrulanmış kullanıcı başına Google Calendar API'nin maksimum istek oranına ulaşmıştır.

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

Önerilen işlem: rateLimitExceeded hataları, 403 veya 429 hata kodları döndürebilir. Şu anda bu hatalar işlev açısından birbirine benzer ve üstel geri yükleme kullanılarak aynı şekilde yanıtlanmalıdır. Ayrıca uygulamanızın kotaları yönetme bölümündeki en iyi uygulamalara uyduğundan emin olun.

403: Takvim kullanım sınırları aşıldı

Kullanıcı, Google kullanıcılarını ve altyapısını kötüye kullanım amaçlı davranışlardan korumak için geçerli olan Google Takvim sınırlarından birine ulaştı.

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

Önerilen işlemler:

403: Düzenleyici olmayan kişiler için yasak

Etkinlik güncelleme isteği, paylaşılan etkinlik özelliklerinden birini, düzenleyiciye ait olmayan bir kopyada ayarlamaya çalışıyor. Paylaşılan özellikler (örneğin, guestsCanInviteOthers, guestsCanModify veya guestsCanSeeOtherGuests) yalnızca düzenleyen tarafından ayarlanabilir.

{
 "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."
 }
}

Önerilen işlemler:

  • Etkinlikler: ekleyin, Etkinlikler: içe aktarma veya Etkinlikler: güncelleme kullanıyorsanız ve isteğiniz paylaşılan herhangi bir özellik içermiyorsa bu, bunları varsayılan değerlerine ayarlamayı denemekle eşdeğerdir. Bunun yerine Events: yama özelliğini kullanmayı düşünün.
  • İsteğinizde paylaşılan özellikler varsa bu özellikleri yalnızca düzenleyicinin kopyasını güncelliyorsanız değiştirmeye çalıştığınızdan emin olun.

404: Bulunamadı

Belirtilen kaynak bulunamadı. Bu durum birkaç durumda yaşanabilir. Bazı örnekler:

  • istenen kaynak (sağlanan kimlikle) hiçbir zaman mevcut olmadığında
  • kullanıcının erişemediği bir takvime erişirken

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

Önerilen işlem: Üstel geri yükleme yöntemini kullanın.

409: İstenen tanımlayıcı zaten var

Depolama alanında, belirtilen kimliğe sahip bir örnek zaten var.

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

Önerilen işlem: Yeni bir örnek oluşturmak istiyorsanız yeni bir kimlik oluşturun, aksi takdirde update yöntemi çağrısını kullanın.

410: Yok

syncToken veya updatedMin parametreleri artık geçerli değil. Bir istek, silinmiş olan bir etkinliği silmeye çalıştığında da bu hata oluşabilir.

{
 "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."
 }
}

veya

{
 "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."
 }
}

veya

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

Önerilen işlem: syncToken veya updatedMin parametreleri için mağazayı temizleyin ve yeniden senkronize edin. Daha fazla bilgi için Kaynakları Verimli Şekilde Senkronize Etme bölümüne bakın. Silinmiş etkinlikler için başka bir işlem yapmanız gerekmez.

412: Önceden Koşullandırma Başarısız Oldu

If-match başlığında sağlanan etag artık kaynağın mevcut etiketine karşılık gelmiyor.

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

Önerilen işlem: Varlığı yeniden getirin ve değişiklikleri yeniden uygulayın. Daha fazla bilgi için Kaynakların belirli sürümlerini alma bölümüne bakın.

429: Çok fazla istek var

Kullanıcı belirli bir süre içinde çok fazla istek gönderdiğinde rateLimitExceeded hatası oluşur.

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

Önerilen işlem: rateLimitExceeded hataları, 403 veya 429 hata kodları döndürebilir. Şu anda bu hatalar işlev açısından birbirine benzer ve üstel geri yükleme kullanılarak aynı şekilde yanıtlanmalıdır. Ayrıca uygulamanızın kotaları yönetme bölümündeki en iyi uygulamalara uyduğundan emin olun.

500: Arka Uç Hatası

İstek işlenirken beklenmeyen bir hata oluştu.

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

Önerilen işlem: Üstel geri yükleme yöntemini kullanın.