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
对象。
我目前正在努力弄清楚我尝试使用 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
对象。