Google 日历 API 返回一般错误请求

Google Calendar API returning generic Bad Request

我目前正在努力弄清楚我尝试使用 Google Calendar V3 API 在 Flutter 中完成的事件插入有什么问题。最初我认为这是 RFC3339 与 ISO8601 日期格式的问题,但我抓住了救命稻草。

Unhandled Exception: DetailedApiRequestError(status: 400, message: Bad Request) 是我得到的:

   import 'package:googleapis/calendar/v3.dart';
   import 'package:googleapis_auth/auth.dart';
   import 'package:googleapis_auth/auth_io.dart';

    ...
    var calendar = await getCalendar();
    var ac = await getOrCreateCredentials();
    var client = await getClient(ac);
    var calendarId = await storage.read(key: "calendar_id");
    var capi = CalendarApi(client);

    EventCreator ec = new EventCreator();
    ec.displayName = "Display Name";

    EventDateTime edt = new EventDateTime();
    int hour = int.parse(ds.hour.split(":")[0]);
    int min = int.parse(ds.hour.split(":")[1]);
    DateTime x = ds.data.add(Duration(hours: hour, minutes: min));
    edt.dateTime = x;
    edt.timeZone = x.timeZoneName;

    EventDateTime edtEnd = new EventDateTime();
    DateTime y = x.add(Duration(hours: 1));
    edtEnd.dateTime = y;
    edtEnd.timeZone = y.timeZoneName;

    Event e = new Event();
    e.created = DateTime.now();
    e.creator = ec;
    e.description = d.var + " \n" + d.var;
    e.summary = "Summary";
    e.etag = d.var;
    e.location = d.var;
    e.start = edt;
    e.end = edtEnd;

    try {
      capi.events.insert(e, calendarId);

完整的 JSON 响应仅包含 global 域、badrequest 和 HTTP 400 代码。

我也尝试 .toUtc() DateTime 对象使它们符合 RFC3339,但仍然出现相同的错误。

稍后编辑

这个问题确实与时间有关,Dart DateTime class 没有按照 Google 喜欢的方式格式化时间(2021-04-12T08:30:00+03:00 我从其他语言中推导出来' API 实现,以及基本上执行 .toString() DateTime 的包的源代码)。

解决此问题的方法是从 JSON 对象创建 EventDateTime,并使用 hacky Dart 扩展。我为这个命名道歉,但这很烦人。

extension FuckyDateTime on DateTime {
  Map<dynamic, dynamic> fuckyDateTime() {
    Map<dynamic, dynamic> x = new Map();
    String formatted = this.year.toString() +
        '-' +
        (this.month.toString().length == 1
            ? '0' + this.month.toString()
            : this.month.toString()) +
        '-' +
        (this.day.toString().length == 1
            ? '0' + this.day.toString()
            : this.day.toString()) +
        'T' +
        (this.hour.toString().length == 1
            ? '0' + this.hour.toString()
            : this.hour.toString()) +
        ':' +
        (this.minute.toString().length == 1
            ? '0' + this.minute.toString()
            : this.minute.toString()) +
        ':' +
        (this.second.toString().length == 1
            ? '0' + this.second.toString()
            : this.second.toString()) +
        '+' +
        '03:00';
    x.putIfAbsent('dateTime', () => formatted);
    x.putIfAbsent('timeZone', () => 'Europe/Bucharest');
    return x;
  }
}

EventDateTime edt = new EventDateTime.fromJson(x.fuckyDateTime()); 其中 x 是一个 DateTime 对象。

这个问题确实与时间有关,Dart DateTime class 没有按照 Google 喜欢的方式格式化时间(2021-04-12T08:30:00+03:00 我从其他语言中推导出来' API 实现,以及基本上执行 .toString() DateTime 的包的源代码)。值得一提的是,Dart DateTime 确实提供了一个 String 的 ISO8601,Google 想要一个 RFC3339 兼容的日期。

解决这个问题的方法是从 JSON 对象创建 EventDateTime,并使用 hacky Dart 扩展。我为这个命名道歉,但这很烦人。

extension FuckyDateTime on DateTime {
  Map<dynamic, dynamic> fuckyDateTime() {
    Map<dynamic, dynamic> x = new Map();
    String formatted = this.year.toString() +
        '-' +
        (this.month.toString().length == 1
            ? '0' + this.month.toString()
            : this.month.toString()) +
        '-' +
        (this.day.toString().length == 1
            ? '0' + this.day.toString()
            : this.day.toString()) +
        'T' +
        (this.hour.toString().length == 1
            ? '0' + this.hour.toString()
            : this.hour.toString()) +
        ':' +
        (this.minute.toString().length == 1
            ? '0' + this.minute.toString()
            : this.minute.toString()) +
        ':' +
        (this.second.toString().length == 1
            ? '0' + this.second.toString()
            : this.second.toString()) +
        '+' +
        '03:00';
    x.putIfAbsent('dateTime', () => formatted);
    x.putIfAbsent('timeZone', () => 'Europe/Bucharest');
    return x;
  }
}

EventDateTime edt = new EventDateTime.fromJson(x.fuckyDateTime()); 其中 x 是一个 DateTime 对象。