Obsługa błędów interfejsu API

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

  • Kody błędów HTTP i komunikaty w nagłówku
  • Obiekt JSON w treści odpowiedzi z dodatkowymi informacjami, które pomagają określić sposób obsługi błędu.

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

Zaimplementuj wykładniczy czas ponowienia

W dokumentacji interfejsów API Google Cloud znajdziesz obszerne objaśnienie funkcji ponowienia wykładniczego i sposobu jego wykorzystania w interfejsach API Google.

Błędy i sugerowane działania

Ta sekcja zawiera pełną reprezentację każdego wymienionego błędu w formacie JSON oraz sugerowane działania, które możesz podjąć, aby go rozwiązać.

400: Nieprawidłowe żądanie

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

{
 "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: jest to trwały błąd, dlatego nie próbuj ponownie. Przeczytaj komunikat o błędzie i odpowiednio zmień żądanie.

401: Nieprawidłowe dane logowania

Nieprawidłowy nagłówek autoryzacji. Używany przez Ciebie token dostępu stracił ważność 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:

  • Uzyskaj nowy token dostępu za pomocą długoterminowego tokena odświeżania.
  • Jeśli to się nie uda, przekieruj użytkownika przez proces OAuth zgodnie z opisem w sekcji Autoryzacja żądań przy użyciu OAuth 2.0.
  • Jeśli widzisz ten komunikat w przypadku konta usługi, sprawdź, czy wszystkie czynności na stronie konta usługi zostały wykonane.

403: Przekroczono limit liczby żądań użytkownika

Jeden z limitów w Konsoli programisty został osiągnięty.

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

Sugerowane działania:

403: przekroczono limit szybkości

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

{
 "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 podobne pod względem funkcji i należy na nie odpowiadać w ten sam sposób – za pomocą wykładniczego ponowienia. Upewnij się też, że 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 służył do ochrony użytkowników i infrastruktury 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 organizatora

Żądanie aktualizacji 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 (np. guestsCanInviteOthers, guestsCanModify lub guestsCanSeeOtherGuests) mogą być ustawione tylko przez organizatora.

{
 "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 obiektu Zdarzenia: wstaw, Zdarzenia: import lub Zdarzenia: aktualizacja, a żądanie nie zawiera żadnych współdzielonych właściwości, odpowiada to próbie ustawienia ich wartości domyślnych. Zamiast tego rozważ użycie elementu Events: patch.
  • Jeśli Twoja prośba obejmuje właściwości udostępniane, upewnij się, że próbujesz je zmienić tylko wtedy, gdy aktualizujesz kopię przygotowaną przez organizatora.

404 – nie znaleziono

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

  • gdy żądany zasób (o podanym identyfikatorze) nigdy nie istniał.
  • podczas uzyskiwania dostępu do kalendarza, do którego użytkownik nie może uzyskać dostępu;

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

Sugerowane działanie: użyj wykładniczego ponowienia.

409: Żądany identyfikator już istnieje

Instancja o podanym identyfikatorze już istnieje w pamięci.

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

Sugerowane działanie: jeśli chcesz utworzyć nową instancję, wygeneruj nowy identyfikator lub użyj wywołania metody update.

410: Już nie istnieje

Parametry syncToken lub updatedMin nie są już prawidłowe. Ten błąd może również wystąpić, gdy żą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ść dane sklepu i ponownie zsynchronizuj dane. Więcej informacji znajdziesz w artykule na temat skutecznej synchronizacji zasobów. W przypadku wydarzeń, które zostały już usunięte, nie musisz niczego więcej robić.

412: Nie udało się spełnić warunku

Tag etag podany w nagłówku If-match nie odpowiada już bieżącemu 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 o pobieraniu konkretnych wersji zasobów.

429. Zbyt wiele żądań

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

{
  "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 podobne pod względem funkcji i należy na nie odpowiadać w ten sam sposób – za pomocą wykładniczego ponowienia. Upewnij się też, że 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 wykładniczego ponowienia.