Standart hata yanıtları
Temel Hazırlık API'sı isteği başarılı olursa API bir 200
durum kodu döndürür. Bir istekle birlikte hata oluşursa API, hatanın türüne göre yanıtta bir HTTP durum kodu, durum ve neden döndürür.
Ayrıca yanıtın gövdesinde hatanın nedenine dair ayrıntılı bir açıklama da yer alır. Aşağıda, bir hata yanıtı örneği verilmiştir:
{
"error": {
"errors": [
{
"domain": "global",
"reason": "invalidParameter",
"message": "Invalid value '-1' for max-results. Value must be within the range: [1, 1000]",
"locationType": "parameter",
"location": "max-results"
}
],
"code": 400,
"message": "Invalid value '-1' for max-results. Value must be within the range: [1, 1000]"
}
}
Hata tablosu
Kod | Neden | Açıklama | Önerilen işlem |
---|---|---|---|
400 | invalidParameter |
Bir istek parametresinin geçersiz bir değere sahip olduğunu belirtir. Hata yanıtındaki locationType ve location alanları, hangi değerin geçersiz olduğuyla ilgili bilgi sağlar. |
Sorunu düzeltmeden tekrar denemeyin. Hata yanıtında belirtilen parametre için geçerli bir değer sağlamanız gerekir. |
400 | badRequest |
Sorgunun geçersiz olduğunu gösterir. Örneğin, üst kimlik eksikti veya istenen boyut ya da metrik kombinasyonu geçerli değildi. | Sorunu düzeltmeden tekrar denemeyin. Bu API sorgusunun çalışması için değişiklik yapmanız gerekir. |
401 | invalidCredentials |
Yetkilendirme jetonunun geçersiz olduğunu veya süresinin sona erdiğini belirtir. | Sorunu düzeltmeden tekrar denemeyin. Yeni bir yetkilendirme jetonu almanız gerekiyor. |
403 | insufficientPermissions |
Kullanıcının sorguda belirtilen varlık için yeterli izinlere sahip olmadığını belirtir. | Sorunu düzeltmeden tekrar denemeyin. İşlemi belirtilen varlık üzerinde gerçekleştirmek için yeterli izinleri almanız gerekir. |
403 | dailyLimitExceeded |
Kullanıcının günlük kotayı aştığını belirtir (proje veya görünüm (profil) başına). | Sorunu düzeltmeden tekrar denemeyin. Günlük kotanızı kullandınız. API Sınırları ve Kotaları başlıklı makaleyi inceleyin. |
403 | userRateLimitExceeded |
Kullanıcı başına 100 saniyedeki sorgu sayısı sınırının aşıldığını gösterir. Google API Konsolu'nda ayarlanan varsayılan değer, kullanıcı başına 100 saniye başına 100 sorgudur. Google API Konsolu'nda bu sınırı en fazla 1.000'e çıkarabilirsiniz. | Eksponansiyel geri yükleme yöntemini kullanmayı yeniden deneyin. İstekleri gönderdiğiniz hızı yavaşlatmanız gerekir. |
403 | rateLimitExceeded |
Projenin 100 saniye başına sorgu sayısı hız sınırlarının aşıldığını gösterir. | Eksponansiyel geri yükleme yöntemini kullanmayı yeniden deneyin. İstekleri gönderdiğiniz hızı yavaşlatmanız gerekir. |
403 | quotaExceeded |
Core Reporting API'de görünüm (profil) başına 10 eşzamanlı isteğe ulaşıldığını belirtir. | Eksponansiyel geri yükleme işlevini kullanmayı yeniden deneyin. Bu görünüm (profil) için işleme devam eden en az bir isteğin tamamlanmasını beklemeniz gerekir. |
500 | internalServerError |
Beklenmeyen dahili sunucu hatası oluştu. | Bu sorguyu bir defadan fazla yeniden denemeyin. |
503 | backendError |
Sunucu hata döndürdü. | Bu sorguyu bir defadan fazla yeniden denemeyin. |
500 veya 503 yanıtlarını işleme
500
ya da 503
hatası, ağır yük sırasında veya daha büyük ve daha karmaşık isteklerde ortaya çıkabilir. Daha büyük talepler için daha kısa bir dönem için veri talep etmeniz önerilir. Eksponansiyel geri yükleme uygulamayı da düşünebilirsiniz.
Bu hataların sıklığı görünüm (profil) ve söz konusu görünümle ilişkili raporlama verilerinin miktarına bağlı olabilir. Bir görünüm (profil) için 500
veya 503
hatasına neden olan bir sorgu, aynı sorgu için farklı bir görünümle (profil) ilgili hataya neden olmayabilir.
Üstel Geri Alma Uygulama
Üstel geri yükleme, bir istemcinin başarısız bir isteği artan bir süre boyunca düzenli aralıklarla yeniden denemesi işlemidir. Ağ uygulamaları için standart bir hata işleme stratejisidir. Temel Hazırlık API'sı, başarısız istekleri yeniden denemek isteyen istemcilerin bunu eksponansiyel geri yükleme ile yapacağı düşünülerek tasarlanmıştır. Üstel geri yükleme, "gerekli" olmanın yanı sıra bant genişliği kullanımının verimliliğini artırır, başarılı bir yanıt almak için gereken istek sayısını azaltır ve eşzamanlı ortamlarda isteklerin işleme hızını en üst düzeye çıkarır.
Basit üstel geri yükleme uygulama akışı aşağıdaki gibidir.
- API'den istekte bulunma
- Yeniden denenebilir hata kodu içeren bir hata yanıtı alma
- 1 sn +
random_number_milliseconds
saniye bekleyin - İsteği yeniden dene
- Yeniden denenebilir hata kodu içeren bir hata yanıtı alma
- 2 sn +
random_number_milliseconds
saniye bekleyin - İsteği yeniden dene
- Yeniden denenebilir hata kodu içeren bir hata yanıtı alma
- 4 sn +
random_number_milliseconds
saniye bekleyin - İsteği yeniden dene
- Yeniden denenebilir hata kodu içeren bir hata yanıtı alma
- 8 sn +
random_number_milliseconds
saniye bekleyin - İsteği yeniden dene
- Yeniden denenebilir hata kodu içeren bir hata yanıtı alma
- 16 sn +
random_number_milliseconds
saniye bekleyin - İsteği yeniden dene
- Hâlâ hata alıyorsanız işlemi durdurun ve hatayı kaydedin.
Yukarıdaki akışta random_number_milliseconds
, 1.000'den küçük veya 1.000'e eşit olan rastgele bir milisaniye sayısıdır. Bu, eşzamanlı olarak yapılan bazı uygulamalarda belirli kilit hatalarını önlemek için gereklidir.
random_number_milliseconds
her beklemeden sonra yeniden tanımlanmalıdır.
Not: Bekleme her zaman (2 ^ n) + random_number_milliseconds
şeklindedir. Burada n, başlangıçta 0 olarak tanımlanan monoton olarak artan bir tam sayıdır. n her iterasyon (her istek) için 1'lik artırılır.
Algoritma, n değeri 5 olduğunda sona erecek şekilde ayarlanmıştır. Bu üst sınır, yalnızca istemcilerin sonsuza kadar yeniden denemelerini önlemek için uygulanır ve bir istek "kurtarılamaz hata" olarak değerlendirilmeden önce toplam 32 saniye gecikmeyle sonuçlanır.
Aşağıdaki Python kodu, makeRequest
adlı bir yöntemde oluşan hataları kurtarmak için yukarıdaki akışın uygulanmasıdır.
import random import time from apiclient.errors import HttpError def makeRequestWithExponentialBackoff(analytics): """Wrapper to request Google Analytics data with exponential backoff. The makeRequest method accepts the analytics service object, makes API requests and returns the response. If any error occurs, the makeRequest method is retried using exponential backoff. Args: analytics: The analytics service object Returns: The API response from the makeRequest method. """ for n in range(0, 5): try: return makeRequest(analytics) except HttpError, error: if error.resp.reason in ['userRateLimitExceeded', 'quotaExceeded', 'internalServerError', 'backendError']: time.sleep((2 ** n) + random.random()) else: break print "There has been an error, the request never succeeded."