Ошибка API 400 календаря Google

Я пытаюсь выполнить простой запрос freebusy API Календаря Google. У меня все авторизация работает нормально, я вижу списки пользовательских календарей и т. Д. Когда я пытаюсь отправить запрос о занятости, я получаю сообщение об ошибке 400 с (насколько я могу судить), а не детали о том, что это не нравится

Это верно как в моем собственном коде, так и в том случае, когда я использую функцию Google Calendar API "Try It".

Вот мой запрос (созданный с помощью виджета Try It) и ответ: Запрос

POST https://www.googleapis.com/calendar/v3/freeBusy?key={YOUR_API_KEY}

Content-Type:  application/json
Authorization:  Bearer ya29.AHES6ZTr-2wksEvp0iGPTnHTirTIItib5WwxmSAySq1ghfI98Cz88kA
X-JavaScript-User-Agent:  Google APIs Explorer

{
     "items": [
          {
              "id": "[my calendar id goes here]@group.calendar.google.com"
          }
     ],
     "timeMin": "2012-01-31T09:00:00",
     "timeMax": "2012-01-31T10:00:00",
     "timeZone": "GMT"
}

Response


400 Bad Request

cache-control:  private, max-age=0
content-encoding:  gzip
content-length:  122
content-type:  application/json; charset=UTF-8
date:  Sun, 16 Jun 2013 13:08:32 GMT
expires:  Sun, 16 Jun 2013 13:08:32 GMT
server:  GSE

{
     "error": {
     "errors": [
          {
              "domain": "global",
              "reason": "badRequest",
              "message": "Bad Request"
           }
     ],
    "code": 400,
    "message": "Bad Request"
     }
}

Я думаю, что это может иметь какое-то отношение к объектам / форматированию dateTime? Но я понятия не имею, что. Я действительно ценю некоторую помощь; Я бился головой об этом в течение недели!

6 ответов

Решение

Хорошо, я понял это, и я оставляю ответ для всех, кто теряет свой ум из-за этого.

Несмотря на то, что в документации Google говорится о формате datetime в этом случае, единственным форматом, который я смог получить, было следующее:

2008-03-07T17: 06: 02.000Z

так что это ГГГГ-ММ-ДДЧЧ: ММ: СС.МММЗ

Для чего нужен Z? Я не знаю, но это должно быть там.

Если кто-то сталкивается с подобной ошибкой при использовании клиентской библиотеки API Google для Objective-C для REST, используйтеdateTimeимущество вместоdateсвойство при установке даты события. Я потратил на это несколько часов.

У меня была такая же проблема, но мне удалось ее решить, просто удалив букву "Z" из DateTime, а в TimeZone поставив GMT с разницей во времени:

'dateTime': '2020-10-31T17:00:00.000',
'timeZone': 'GMT-03:00'

Для меня было что-то немного другое, мне не хватало миллисекунд:

      2023-08-06T07:55:23.000Z

Вместо

      2023-08-06T07:55:23Z  

Значение даты и времени должно быть в формате UTC "TZ". Почти все CRM и общедоступные API принимают время в этом формате. Если вы конвертируете дату и время в UTC, используя основные библиотечные функции (такие как C или Java), они будут возвращать экземпляр даты и времени в формате YYYY-MM-DDTHH:MM:SS.MMMZ.

Короче говоря, вам не хватает смещения часового пояса в обоих timeMin а также timeMax переменных, это необходимо, даже если у вас есть timeZone набор переменных.

Например, я живу в часовом поясе America/New_York, поэтому мое смещение будет -05:00, который необходимо добавить к имеющимся у вас значениям. Для меня значения будут выглядеть так:

{
    ...
    "timeMin": "2012-01-31T09:00:00-05:00",
    "timeMax": "2012-01-31T10:00:00-05:00",
    ...
}

Чтобы быть более конкретным, API Календаря Google требует, чтобы timeMin а также timeMax

Должна быть метка времени RFC3339 с обязательным смещением часового пояса, например 2011-06-03T10:00:00-07:00, 2011-06-03T10:00:00Z. Могут быть указаны миллисекунды, но они игнорируются. Если установлено timeMax, timeMin должно быть меньше timeMax.

Так что вы можете иметь 2012-01-31T09:00:00-5:00 или 2012-01-31T09:00:00Z с миллисекундами как необязательными (поскольку они все равно игнорируются).

Документация API списка событий Календаря Google - вот откуда я получил всю информацию.

Другие вопросы по тегам