Obsługa błędów interfejsu API

Interfejs Calendar API zwraca 2 poziomy informacji o błędach:

  • Kody i komunikaty o błędach HTTP w nagłówku
  • Obiekt JSON w ciele odpowiedzi z dodatkowymi szczegółami, które mogą pomóc w określeniu sposobu postępowania z błędem.

W pozostałej części tej strony znajdziesz informacje o błędach w Kalendarzu oraz wskazówki dotyczące ich obsługi w aplikacji.

Wdrażanie wzrastającego czasu do ponowienia

W dokumentacji interfejsów API w chmurze znajdziesz dobre wyjaśnienie ujemnego wykładniczego wygładzania i sposobu jego stosowania w interfejsach API Google.

Błędy i sugerowane działania

Ta sekcja zawiera pełny zapis w formacie JSON każdego z wymienionych błędów oraz sugerowane działania, które możesz podjąć, aby go naprawić.

400: Nieprawidłowe żądanie

Błąd użytkownika. Może to oznaczać, że nie zostało podane wymagane pole lub parametr, podana wartość jest nieprawidłowa albo nieprawidłowa jest kombinacja podanych pól.

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

Sugerowane działanie: ponieważ jest to błąd trwały, nie próbuj ponownie. Zamiast tego przeczytaj komunikat o błędzie i odpowiednio zmień prośbę.

401: Nieprawidłowe dane logowania

Nieprawidłowy nagłówek autoryzacji. Używany token dostępu wygasł lub jest nieprawidłowy.

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

Sugerowane działania:

403: Przekroczony limit częstotliwości

Osiągnięto jeden z limitów określonych w Konsoli Play.

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

Sugerowane działania:

403: Przekroczono limit częstotliwości

Użytkownik osiągnął maksymalną częstotliwość żądań interfejsu Google Calendar API na kalendarz lub na uwierzytelnionego użytkownika.

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

Sugerowane działanie: błędy rateLimitExceeded mogą zwracać kody błędów 403 lub 429. Obecnie są one pod względem funkcjonalności podobne i należy na nie odpowiadać w taki sam sposób, używając wykładniczego zmniejszania. Dodatkowo sprawdź, czy aplikacja jest zgodna ze sprawdzonymi metodami dotyczącymi zarządzania limitami.

403: Przekroczono limity korzystania z Kalendarza

Użytkownik osiągnął jeden z limitów Kalendarza Google, który ma chronić użytkowników i infrastrukturę Google przed nadużyciami.

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

Sugerowane działania:

403: dostęp zabroniony dla osób, które nie są organizatorami

Prośba o zaktualizowanie wydarzenia próbuje ustawić jedną z udostępnionych właściwości wydarzenia w kopii, która nie należy do organizatora. Właściwości współdzielone (na przykład guestsCanInviteOthers, guestsCanModify lub guestsCanSeeOtherGuests) może ustawiać tylko organizator.

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

Sugerowane działania:

  • Jeśli używasz wywołania Zdarzenia: wstaw, Zdarzenia: importuj lub Zdarzenia: aktualizuj, a Twoje żądanie nie zawiera żadnych właściwości współdzielonych, jest to równoznaczne z próbą ustawienia ich domyślnych wartości. Zamiast tego użyj kolumny Zdarzenia: poprawka.
  • Jeśli Twoja prośba zawiera właściwości wspólne, upewnij się, że próbujesz zmienić tylko te właściwości, jeśli aktualizujesz kopię organizatora.

404: nie znaleziono

Nie znaleziono podanego zasobu. Może się tak zdarzyć w kilku przypadkach. Oto przykłady:

  • gdy żądany zasób (z podanym identyfikatorem) nigdy nie istniał;
  • podczas otwierania kalendarza, do którego użytkownik nie ma dostępu

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

Sugerowane działanie: użyj wzrastającego czasu do ponowienia.

409: żądany identyfikator już istnieje

instancja o podanym identyfikatorze już istnieje w magazynie;

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

Sugestie dotyczące działania: wygeneruj nowy identyfikator, jeśli chcesz utworzyć nową instancję, w przeciwnym razie użyj wywołania metody update.

409: Konflikt

Element zbiorczy w ramach operacji events.batch nie może zostać wykonany z powodu konfliktu operacyjnego z innymi żądanymi elementami zbiorczymi.

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

Sugerowane działanie: wyklucz wszystkie ukończone i zdecydowanie nieudane elementy zbiorcze, a następnie ponownie przeprowadź próbę z pozostałymi elementami w innym pliku events.batchlub w odpowiednich operacjach pojedynczego zdarzenia.

410: Już nie istnieje

Parametry syncToken lub updatedMin nie są już prawidłowe. Ten błąd może też wystąpić, jeśli żądanie próbuje usunąć zdarzenie, które zostało już usunięte.

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

lub

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

lub

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

Sugerowane działanie: w przypadku parametrów syncToken lub updatedMin wyczyść pamięć podręczną i ponownie zsynchronizuj. Więcej informacji znajdziesz w artykule Efektywne synchronizowanie zasobów. W przypadku już usuniętych zdarzeń nie musisz wykonywać żadnych dodatkowych czynności.

412: Nie spełniono warunku wstępnego

Etag podany w nagłówku If-Match nie odpowiada już aktualnemu etagowi zasobu.

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

Sugerowane działanie: ponownie pobierz element i zastosuj zmiany. Więcej informacji znajdziesz w artykule Pobieranie określonych wersji zasobów.

429: Zbyt wiele żądań

Błąd rateLimitExceeded występuje, gdy użytkownik wysyła zbyt wiele żądań w danym przedziale czasu.

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

Sugerowane działanie: błędy rateLimitExceeded mogą zwracać kody błędów 403 lub 429. Obecnie są one pod względem funkcjonalności podobne i należy na nie odpowiadać w taki sam sposób, korzystając z wykładniczego zmniejszania. Dodatkowo sprawdź, czy aplikacja jest zgodna ze sprawdzonymi metodami dotyczącymi zarządzania limitami.

500: błąd backendu

Podczas przetwarzania żądania wystąpił nieoczekiwany błąd.

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

Sugerowane działanie: użyj wzrastającego czasu do ponowienia.