Solucionar erros de API

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:

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:

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:

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.