A API Calendar retorna dois níveis de informações de erro:
- Códigos e mensagens de erro HTTP no cabeçalho
- Um objeto JSON no corpo da resposta com mais detalhes que podem ajudar a determinar como lidar com o erro.
O restante desta página fornece uma referência de erros do Google Agenda, com algumas orientações sobre como tratá-los no app.
Implementar espera exponencial
A documentação das APIs do Cloud tem uma boa explicação sobre o recuo exponencial e como usá-lo com as APIs do Google.
Erros e ações sugeridas
Esta seção fornece a representação JSON completa de cada erro listado e as ações sugeridas que você pode realizar para processá-lo.
400: Solicitação inválida
Erro do usuário. Isso pode significar que um campo ou parâmetro obrigatório não foi fornecido, que o valor fornecido é inválido ou que a combinação de campos fornecidos é inválida.
{
"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."
}
}
Ação sugerida:como esse é um erro permanente, não tente novamente. Leia a mensagem de erro e faça as mudanças necessárias na solicitação.
401: Credenciais inválidas
Cabeçalho de autorização inválido. O token de acesso que você está usando expirou ou é inválido.
{
"error": {
"errors": [
{
"domain": "global",
"reason": "authError",
"message": "Invalid Credentials",
"locationType": "header",
"location": "Authorization",
}
],
"code": 401,
"message": "Invalid Credentials"
}
}
Ações sugeridas:
- Receba um novo token de acesso usando o token de atualização de longa duração.
- Se isso falhar, direcione o usuário pelo fluxo do OAuth, conforme descrito em Como autorizar solicitações com o OAuth 2.0.
- Se você estiver vendo isso para uma conta de serviço, verifique se concluiu todas as etapas na página da conta de serviço.
403: O limite de taxa de usuário foi excedido
Um dos limites do Play Console foi atingido.
{
"error": {
"errors": [
{
"domain": "usageLimits",
"reason": "userRateLimitExceeded",
"message": "User Rate Limit Exceeded"
}
],
"code": 403,
"message": "User Rate Limit Exceeded"
}
}
Ações sugeridas:
- Confira se o app segue as práticas recomendadas de gerenciar cotas.
- Aumente a cota por usuário no projeto do console do desenvolvedor.
- Se um usuário estiver fazendo muitas solicitações em nome de muitos usuários de uma
conta do Google Workspace, considere
usar uma conta de serviço com delegação em todo o domínio
e definir o parâmetro
quotaUser
. - Use a espera exponencial.
403: Limite de taxa excedido
O usuário atingiu a taxa máxima de solicitações da API Google Agenda por agenda ou por usuário autenticado.
{
"error": {
"errors": [
{
"domain": "usageLimits",
"reason": "rateLimitExceeded",
"message": "Rate Limit Exceeded"
}
],
"code": 403,
"message": "Rate Limit Exceeded"
}
}
Ação sugerida:os erros rateLimitExceeded
podem retornar códigos de erro 403 ou 429. Atualmente, eles são funcionalmente semelhantes e precisam ser respondidos da mesma forma, usando a retirada exponencial.
Além disso, verifique se o app segue as práticas recomendadas de
gerenciar cotas.
403: Limites de uso do Agenda excedidos
O usuário atingiu um dos limites do Google Agenda para proteger os usuários e a infraestrutura do Google contra comportamentos abusivos.
{
"error": {
"errors": [
{
"domain": "usageLimits",
"message": "Calendar usage limits exceeded.",
"reason": "quotaExceeded"
}
],
"code": 403,
"message": "Calendar usage limits exceeded."
}
}
Ações sugeridas:
- Saiba mais sobre os limites de uso do Google Agenda na Ajuda para administradores do Google Workspace.
403: Proibido para não organizadores
A solicitação de atualização do evento está tentando definir uma das propriedades de evento compartilhadas
em uma cópia que não é do organizador. As propriedades compartilhadas (por exemplo,
guestsCanInviteOthers
, guestsCanModify
ou guestsCanSeeOtherGuests
) só
podem ser definidas pelo organizador.
{
"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."
}
}
Ações sugeridas:
- Se você estiver usando Events: insert, Events: import ou Events: update, e sua solicitação não incluir nenhuma propriedade compartilhada, isso será equivalente a tentar definir os valores padrão. Use Events: patch em vez disso.
- Se a solicitação tiver propriedades compartilhadas, tente mudar apenas essas propriedades se você estiver atualizando a cópia do organizador.
404: não encontrado
O recurso especificado não foi encontrado. Isso pode acontecer em vários casos. Veja alguns exemplos:
- quando o recurso solicitado (com o ID fornecido) nunca existiu
ao acessar uma agenda que o usuário não pode acessar
{ "error": { "errors": [ { "domain": "global", "reason": "notFound", "message": "Not Found" } ], "code": 404, "message": "Not Found" } }
Ação sugerida:use a espera exponencial.
409: O identificador solicitado já existe
Já existe uma instância com o ID fornecido no armazenamento.
{
"error": {
"errors": [
{
"domain": "global",
"reason": "duplicate",
"message": "The requested identifier already exists."
}
],
"code": 409,
"message": "The requested identifier already exists."
}
}
Ação sugerida:gere um novo ID se você quiser criar uma nova instância. Caso contrário, use a chamada de método update.
409: Conflito
Um item em lote dentro de uma
operação events.batch
não pode ser executado devido a um conflito operacional com outros itens
em lote solicitados.
{
"error": {
"errors": [
{
"domain": "global",
"reason": "conflict",
"message": "Conflict"
}
],
"code": 409,
"message": "Conflict"
}
}
Ação sugerida:exclua todos os itens processados com sucesso e todos os itens definitivamente
falhos e tente novamente os restantes em um events.batch
diferente
ou operações de evento único correspondente.
410: Desaparecido
Os parâmetros syncToken
ou updatedMin
não são mais válidos. Esse erro também pode
ocorrer se uma solicitação tentar excluir um evento que já foi excluído.
{
"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."
}
}
ou
{
"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."
}
}
ou
{
"error": {
"errors": [
{
"domain": "global",
"reason": "deleted",
"message": "Resource has been deleted"
}
],
"code": 410,
"message": "Resource has been deleted"
}
}
Ação sugerida:para os parâmetros syncToken
ou updatedMin
, limpe a
armazenagem e sincronize novamente. Para mais detalhes, consulte
Sincronizar recursos de maneira eficiente.
Para eventos já excluídos, não é necessário fazer mais nada.
412: Falha na pré-condição
A ETag fornecida no cabeçalho "If-match" não corresponde mais à ETag atual do recurso.
{
"error": {
"errors": [
{
"domain": "global",
"reason": "conditionNotMet",
"message": "Precondition Failed",
"locationType": "header",
"location": "If-Match",
}
],
"code": 412,
"message": "Precondition Failed"
}
}
Ação sugerida: busque a entidade novamente e aplique as mudanças. Para mais detalhes, consulte Acessar versões específicas de recursos.
429: Muitas solicitações
Um erro rateLimitExceeded
ocorre quando o usuário envia muitas solicitações em um
determinado período.
{
"error": {
"errors": [
{
"domain": "usageLimits",
"reason": "rateLimitExceeded",
"message": "Rate Limit Exceeded"
}
],
"code": 429,
"message": "Rate Limit Exceeded"
}
}
Ação sugerida:os erros rateLimitExceeded
podem retornar códigos de erro 403 ou 429. Atualmente, eles são funcionalmente semelhantes e precisam ser respondidos da mesma forma, usando a retirada exponencial.
Além disso, verifique se o app segue as práticas recomendadas de
gerenciar cotas.
500: Erro de back-end
Ocorreu um erro inesperado ao processar a solicitação.
{
"error": {
"errors": [
{
"domain": "global",
"reason": "backendError",
"message": "Backend Error",
}
],
"code": 500,
"message": "Backend Error"
}
}
Ação sugerida:use a espera exponencial.