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:
- Upewnij się, że Twoja aplikacja jest zgodna ze sprawdzonymi metodami dotyczącymi zarządzania limitami.
- Zwiększ limit na użytkownika w projekcie w Konsoli Play.
- Jeśli jeden użytkownik wysyła wiele żądań w imieniu wielu użytkowników konta Google Workspace, rozważ użycie konta usługi z przekazywaniem dostępu w całej domenie i ustawienie parametru
quotaUser
. - Użyj wykładniczego ponowienia.
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:
- Więcej informacji o limitach wykorzystania Kalendarza znajdziesz w pomocy dla administratorów Google Workspace.
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.